Gói bảo mật

Hướng dẫn này mô tả một tập hợp các tính năng trả về các tín hiệu bổ sung về độ tin cậy của Tài khoản Google. Những tín hiệu tin cậy này giúp hệ thống quản lý tài khoản của bạn đưa ra quyết định dựa trên rủi ro trong quá trình đăng ký, tạo tài khoản và sau này cho người dùng quay lại.

Thiết lập

Để nhận các thông tin bổ sung, ứng dụng của bạn cần được xuất bản, xác minh và bật các tính năng của gói bảo mật.

Cách xác nhận rằng ứng dụng của bạn đã được phát hành và xác minh:

  1. Mở Nền tảng xác thực của Google
  2. Chọn hoặc tạo dự án cho ứng dụng của bạn
  3. Nhấp vào Đối tượng trong trình đơn
  4. Xác nhận Trạng thái phát hànhĐang phát hành công khai
  5. Nhấp vào Trung tâm xác minh trong trình đơn
  6. Xác nhận Trạng thái xác minhĐã xác minh.

    Để tìm hiểu thêm, hãy truy cập vào Trung tâm trợ giúp về quy trình xác minh ứng dụng OAuth.

Cách bật yêu cầu auth_time:

  1. Mở Nền tảng xác thực của Google
  2. Chọn hoặc tạo dự án cho ứng dụng của bạn
  3. Nhấp vào Cài đặt trong trình đơn
  4. Trong phần Cài đặt nâng cao, hãy chọn Session age claims (Yêu cầu về độ tuổi của phiên) để bật auth_time.

Tính năng được hỗ trợ

Phần này mô tả từng tính năng trong Gói bảo mật.

auth_time

auth_time yêu cầu xác nhận quyền sở hữu là một phần tiêu chuẩn của giao thức OpenID Connect, cung cấp thông tin về thời điểm gần đây nhất mà Người dùng cuối xác thực bằng Google. Đây là một số JSON biểu thị số giây đã trôi qua kể từ mốc thời gian Unix (00:00:00 ngày 1 tháng 1 năm 1970, theo giờ UTC) và là thời gian người dùng xác thực lần gần đây nhất. Hãy coi đây là dấu thời gian cho biết sự kiện đăng nhập gần đây nhất của người dùng vào Tài khoản Google trên thiết bị hoặc trình duyệt hiện tại. Thông tin này có trong Mã thông báo nhận dạng, là một Mã thông báo web JSON (JWT) chứa thông tin đã xác minh về quy trình xác thực và người dùng.

Giá trị của yêu cầu auth_time đối với ứng dụng của bạn là giúp bạn xác định thời điểm gần đây nhất mà người dùng đã đăng nhập vào Tài khoản Google trên thiết bị hoặc trình duyệt mà họ đang sử dụng. Điều này có thể đặc biệt quan trọng cho các mục đích bảo mật, chẳng hạn như:

  • Đưa ra quyết định sáng suốt về việc ứng dụng của bạn có nên đưa ra một thử thách xác thực tăng cường bổ sung trước khi thực hiện các hành động nhạy cảm của người dùng như xoá tài khoản, thay đổi phương thức liên hệ của tài khoản hoặc thực hiện thanh toán hay không. Google không hỗ trợ các yêu cầu xác thực lại Tài khoản Google.

  • Sử dụng mức độ mới và ổn định của phiên hoạt động Tài khoản Google của người dùng làm tín hiệu tin cậy. Nói chung, giá trị auth_time gần đây cho biết độ mới, trong khi giá trị cũ hơn cho biết độ ổn định.

Đối với ứng dụng web, sự kết hợp giữa trình duyệt và hệ điều hành của người dùng sẽ tạo thành một phiên sau khi người dùng đăng nhập vào Tài khoản Google của họ. Độc lập với điều này, trang web của bạn cũng duy trì một phiên người dùng riêng biệt. Giá trị auth_time mới hơn cho biết người dùng đã đăng nhập vào Tài khoản Google của họ gần đây. Thông thường, đây là dấu hiệu cho thấy người dùng đang hoạt động và tương tác, đồng thời có thể được hiểu là dấu hiệu cho thấy rủi ro thấp hơn.

Trên các nền tảng di động như Android, người dùng thường đăng nhập trực tiếp vào thiết bị của họ bằng các phương thức sinh trắc học như quét vân tay hoặc khuôn mặt và mã PIN hoặc hình mở khoá dành riêng cho thiết bị. Các ứng dụng và nền tảng di động thường sử dụng những phương thức xác thực dựa trên nền tảng này thay vì tạo một phiên mới bằng Google, dẫn đến việc đăng nhập vào Tài khoản Google không thường xuyên và các bản cập nhật tương ứng cho auth_time. Vì vậy, giá trị auth_time gần đây có thể báo hiệu một thay đổi đối với phiên hoạt động Tài khoản Google kéo dài và do đó làm tăng rủi ro.

Tín hiệu đáng tin cậy là một chủ đề phức tạp. auth_time dự kiến sẽ được dùng cùng với các tín hiệu khác, chẳng hạn như việc xác thực đa yếu tố (MFA) có được bật hay không, phương thức xác thực được dùng và thời lượng của phiên người dùng giữa ứng dụng và nền tảng của bạn.

Yêu cầu auth_time

Phương thức cụ thể được dùng để yêu cầu xác nhận quyền sở hữu auth_time sẽ khác nhau tuỳ theo API được dùng. Tuy nhiên, mọi API đều có một tham số claims không bắt buộc để yêu cầu auth_time.

Giao thức OIDC

Khi sử dụng trực tiếp Nền tảng OAuth, hãy yêu cầu auth_time bằng cách thêm mã này vào tham số yêu cầu thông tin xác nhận không bắt buộc. Đặt giá trị của trường id_token trong đối tượng JSON của các câu lệnh thành {"auth_time":{"essential":true}}. Ví dụ:

https://accounts.google.com/o/oauth2/v2/auth?
response_type=id_token&
client_id=YOUR_CLIENT_ID&
scope=openid email profile&
redirect_uri=https://example.com/user-login&
nonce=123-456-7890&
claims={"id_token":{"auth_time":{"essential":true}}}

Hãy xem phần OpenID Connect để biết thêm thông tin.

GIS cho Web

Thư viện Đăng nhập bằng Google cho Web có 2 API: HTML và JavaScript để yêu cầu các thông tin bổ sung. Ví dụ: yêu cầu auth_time bằng API JavaScript:

<html>
<body>
  <script src="https://accounts.google.com/gsi/client" async></script>
  <script>
    window.onload = function () {
      google.accounts.id.initialize({
        client_id: "YOUR_WEB_CLIENT_ID",
        callback: function(rsp) { console.log(rsp.credential); },
        essential_claims: "auth_time",
      });
      google.accounts.id.renderButton(
        document.getElementById("buttonDiv"),
        { type: "standard", size: "large" }
      );
    }
  </script>
  <div id="buttonDiv"></div>
</body>
</html>

Hãy xem bài viết Đăng nhập bằng Google cho web để biết thêm thông tin.

GIS cho Android

Phương thức setClaims và đối tượng Claim được dùng để yêu cầu auth_time.

Cập nhật các phần phụ thuộc của bản dựng để sử dụng phiên bản mới nhất của thư viện androidx.credentials:credentials-play-services-authcom.google.android.libraries.identity.googleid:googleid.

Khởi tạo một đối tượng Claim thuộc loại auth_time, sử dụng setClaims để thêm đối tượng đó vào các lựa chọn đăng nhập:

val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
    .setAutoSelectEnabled(true)
    .setFilterByAuthorizedAccounts(true)
    .setServerClientId(WEB_CLIENT_ID)
    .setNonce("NONCE")
    .setClaims(ImmutableList.of(new Claim("auth_time", true)))
    .build()

Hãy xem bài viết Xác thực người dùng bằng tính năng Đăng nhập bằng Google để biết thêm thông tin.

phản hồi auth_time

Khi yêu cầu có chứa thông tin xác nhận auth_time, thông tin này sẽ xuất hiện trong phản hồi tải trọng Mã thông báo nhận dạng cùng với các thông tin xác nhận tiêu chuẩn khác như iss (đơn vị phát hành), sub (chủ đề), aud (đối tượng) và exp (thời gian hết hạn). Giá trị của yêu cầu auth_time là một số JSON biểu thị số giây đã trôi qua kể từ thời gian bắt đầu của hệ thống Unix (00:00:00 ngày 1 tháng 1 năm 1970 theo giờ UTC) cho đến lần xác thực người dùng gần đây nhất. Đây là ví dụ về một mã thông báo nhận dạng đã giải mã có chứa khai báo auth_time:

{
  "iss": "https://accounts.google.com",
  "azp": "YOUR_CLIENT_ID",
  "aud": "YOUR_CLIENT_ID",
  "sub": "117726431651943698600",
  "email": "alice@example.com",
  "email_verified": true,
  "nonce": "123-456-7890",
  "auth_time": 1748875426,
  "nbf": 1748880889,
  "name": "Elisa Beckett",
  "picture": "https://lh3.googleusercontent.com/a/default-user=s96-c",
  "given_name": "Elisa",
  "family_name": "Beckett",
  "iat": 1748881189,
  "exp": 1748884789,
  "jti": "8b5d7ce345787d5dbf14ce6e08a8f88ee8c9b5b1"
}

Mã thông báo nhận dạng cũng chứa một yêu cầu iat (được phát hành tại), cho biết thời gian phát hành JWT. Bằng cách so sánh các khai báo iatauth_time, bạn có thể xác định thời gian đã trôi qua kể từ lần xác thực gần đây nhất của người dùng so với thời điểm mã thông báo nhận dạng cụ thể được tạo. Ví dụ: nếu iat là 1748881189 và auth_time là 1748875426, thì sự khác biệt là 5763 giây, tương đương với 1 giờ, 36 phút và 3 giây thời gian đã trôi qua.