Các tài khoản được liên kết bằng các quy trình ngầm định và mã uỷ quyền OAuth 2.0 theo tiêu chuẩn ngành.
Dịch vụ của bạn phải hỗ trợ các điểm cuối uỷ quyền và trao đổi mã thông báo tuân thủ OAuth 2.0.Trong luồng ngầm ẩn, Google sẽ mở điểm cuối uỷ quyền của bạn trong trình duyệt của người dùng. Sau khi đăng nhập thành công, bạn sẽ trả về một mã thông báo truy cập có thời hạn dài cho Google. Mã truy cập này hiện được đưa vào mọi yêu cầu do Google gửi.
Trong quy trình mã uỷ quyền, bạn cần có hai điểm cuối:
Điểm cuối uỷ quyền hiển thị giao diện người dùng đăng nhập cho những người dùng chưa đăng nhập. Điểm cuối uỷ quyền cũng tạo một mã uỷ quyền ngắn hạn để ghi lại sự đồng ý của người dùng đối với quyền truy cập đã yêu cầu.
Điểm cuối trao đổi mã thông báo chịu trách nhiệm cho hai loại giao dịch:
- Trao đổi mã uỷ quyền lấy mã làm mới dài hạn và mã truy cập ngắn hạn. Quá trình trao đổi này diễn ra khi người dùng thực hiện quy trình liên kết tài khoản.
- Trao đổi mã làm mới dài hạn cho mã truy cập ngắn hạn. Quá trình trao đổi này xảy ra khi Google cần một mã thông báo truy cập mới vì mã thông báo cũ đã hết hạn.
Chọn quy trình OAuth 2.0
Mặc dù quy trình ngầm ẩn dễ triển khai hơn, nhưng bạn nên đảm bảo rằng mã truy cập do luồng ngầm ẩn cấp không bao giờ hết hạn. Điều này là do người dùng buộc phải liên kết lại tài khoản của họ sau khi mã thông báo hết hạn bằng luồng ngầm ẩn. Nếu cần hết hạn mã thông báo vì lý do bảo mật, bạn nên sử dụng quy trình mã uỷ quyền.
Hướng dẫn thiết kế
Phần này mô tả các yêu cầu và đề xuất về thiết kế đối với màn hình người dùng mà bạn lưu trữ cho các quy trình liên kết OAuth. Sau khi được ứng dụng của Google gọi, nền tảng của bạn sẽ hiển thị trang đăng nhập vào Google và màn hình đồng ý liên kết tài khoản cho người dùng. Người dùng được chuyển hướng trở lại ứng dụng của Google sau khi đồng ý liên kết tài khoản.
Yêu cầu
- Bạn phải thông báo rằng tài khoản của người dùng sẽ được liên kết với Google, chứ không phải một sản phẩm cụ thể của Google như Google Home hoặc Trợ lý Google.
Đề xuất
Bạn nên thực hiện những điều sau:
Hiển thị Chính sách quyền riêng tư của Google. Đưa một đường liên kết đến Chính sách quyền riêng tư của Google trên màn hình xin phép.
Dữ liệu sẽ được chia sẻ. Sử dụng ngôn từ rõ ràng và súc tích để cho người dùng biết Google yêu cầu dữ liệu nào của họ và lý do tại sao.
Lời kêu gọi hành động rõ ràng. Đưa ra lời kêu gọi hành động rõ ràng trên màn hình xin phép, chẳng hạn như “Đồng ý và liên kết”. Điều này là vì người dùng cần biết dữ liệu nào họ cần phải chia sẻ với Google để liên kết tài khoản của họ.
Khả năng huỷ. Cung cấp cách để người dùng quay lại hoặc huỷ nếu họ chọn không liên kết.
Quy trình đăng nhập rõ ràng. Đảm bảo rằng người dùng có phương thức rõ ràng để đăng nhập vào Tài khoản Google của họ, chẳng hạn như các trường cho tên người dùng và mật khẩu hoặc Đăng nhập bằng Google.
Có thể huỷ liên kết. Cung cấp cơ chế để người dùng huỷ liên kết, chẳng hạn như một URL đến phần cài đặt tài khoản của họ trên nền tảng của bạn. Ngoài ra, bạn có thể thêm một đường liên kết đến Tài khoản Google để người dùng có thể quản lý tài khoản được liên kết của họ.
Khả năng thay đổi tài khoản người dùng. Đề xuất một phương thức để người dùng chuyển đổi(các) tài khoản của họ. Điều này đặc biệt có lợi nếu người dùng có xu hướng sử dụng nhiều tài khoản.
- Nếu người dùng phải đóng màn hình đồng ý để chuyển đổi tài khoản, hãy gửi lỗi có thể khôi phục cho Google để người dùng có thể đăng nhập vào tài khoản mong muốn bằng tính năng liên kết OAuth và quy trình ngầm ẩn.
Thêm biểu trưng của bạn. Hiển thị biểu trưng của công ty bạn trên màn hình xin phép. Sử dụng nguyên tắc thiết kế để đặt biểu trưng. Nếu bạn cũng muốn hiển thị biểu trưng của Google, hãy xem phần Biểu trưng và nhãn hiệu.
Tạo dự án
Cách tạo dự án để sử dụng tính năng liên kết tài khoản:
- Chuyển đến Google API Console.
- Nhấp vào Tạo dự án.
- Nhập tên hoặc chấp nhận tên được đề xuất.
- Xác nhận hoặc chỉnh sửa mọi trường còn lại.
- Nhấp vào Tạo.
Cách xem mã dự án:
- Chuyển đến Google API Console.
- Tìm dự án của bạn trong bảng trên trang đích. Mã dự án xuất hiện trong cột Mã.
Định cấu hình màn hình xin phép bằng OAuth
Quy trình liên kết Tài khoản Google bao gồm một màn hình xin phép cho người dùng biết ứng dụng đang yêu cầu quyền truy cập vào dữ liệu của họ, loại dữ liệu mà ứng dụng đang yêu cầu và các điều khoản áp dụng. Bạn cần định cấu hình màn hình xin phép bằng OAuth trước khi tạo mã ứng dụng khách Google API.
- Mở trang màn hình xin phép bằng OAuth của Google API Console.
- Nếu được nhắc, hãy chọn dự án mà bạn vừa tạo.
Trên trang "Màn hình xin phép bằng OAuth", hãy điền thông tin vào biểu mẫu rồi nhấp vào nút “Lưu”.
Tên ứng dụng: Tên của ứng dụng yêu cầu sự đồng ý. Tên này phải phản ánh chính xác ứng dụng của bạn và nhất quán với tên ứng dụng mà người dùng thấy ở những nơi khác. Tên ứng dụng sẽ xuất hiện trên màn hình xin phép Liên kết tài khoản.
Biểu trưng ứng dụng: Một hình ảnh trên màn hình xin phép sẽ giúp người dùng nhận ra ứng dụng của bạn. Biểu trưng này xuất hiện trên màn hình xin phép liên kết tài khoản và trên phần cài đặt tài khoản
Email hỗ trợ: Để người dùng liên hệ với bạn khi có thắc mắc về sự đồng ý của họ.
Phạm vi cho các API của Google: Phạm vi cho phép ứng dụng của bạn truy cập vào dữ liệu Google riêng tư của người dùng. Đối với trường hợp sử dụng liên kết Tài khoản Google, phạm vi mặc định (email, hồ sơ, OpenID) là đủ, bạn không cần thêm bất kỳ phạm vi nhạy cảm nào. Thông thường, bạn nên yêu cầu các phạm vi theo từng bước, tại thời điểm cần có quyền truy cập, thay vì yêu cầu trước. Tìm hiểu thêm.
Miền được uỷ quyền: Để bảo vệ bạn và người dùng, Google chỉ cho phép những ứng dụng xác thực bằng OAuth sử dụng Miền được uỷ quyền. Đường liên kết đến các ứng dụng của bạn phải được lưu trữ trên Miền được uỷ quyền. Tìm hiểu thêm.
Đường liên kết đến trang chủ của ứng dụng: Trang chủ của ứng dụng. Phải được lưu trữ trên một Miền được uỷ quyền.
Đường liên kết đến Chính sách quyền riêng tư của ứng dụng: Xuất hiện trên màn hình xin phép Liên kết với Tài khoản Google. Phải được lưu trữ trên một Miền được uỷ quyền.
Đường liên kết đến Điều khoản dịch vụ của ứng dụng (Không bắt buộc): Phải được lưu trữ trên một Miền được uỷ quyền.
Hình 1 Màn hình đồng ý liên kết Tài khoản Google cho một Ứng dụng giả định, Tunery
Kiểm tra "Trạng thái xác minh". Nếu ứng dụng của bạn cần xác minh, hãy nhấp vào nút "Gửi để xác minh" để gửi ứng dụng của bạn đi xác minh. Hãy tham khảo các yêu cầu xác minh OAuth để biết thông tin chi tiết.
Triển khai máy chủ OAuth
授权代码流程的 OAuth 2.0 服务器实现包含两个端点,您的服务通过 HTTPS 提供这两个端点。第一个端点是授权端点,负责查找或征得用户同意以获取数据访问权限。授权端点会向尚未登录的用户显示登录界面,并记录用户对所请求访问权限的同意情况。第二个端点是令牌交换端点,用于获取加密字符串(称为令牌),这些令牌可授权用户访问您的服务。
当 Google 应用需要调用您某项服务的 API 时,Google 会同时使用这些端点来征得用户同意,以便代表用户调用这些 API。
Google 账号关联:OAuth 授权代码流程
以下序列图详细说明了用户、Google 和您服务的端点之间的互动。
角色和职责
下表定义了 Google 账号关联 (GAL) OAuth 流中各个参与者的角色和职责。请注意,在 GAL 中,Google 充当 OAuth 客户端,而您的服务充当身份/服务提供方。
| 执行者 / 组件 | GAL 角色 | 职责 |
|---|---|---|
| Google 应用 / 服务器 | OAuth 客户端 | 启动流程,接收授权代码,将其换成令牌,并安全地存储这些令牌以访问服务的 API。 |
| 您的授权端点 | 授权服务器 | 对用户进行身份验证,并征得用户同意,允许其与 Google 分享对自身数据的访问权限。 |
| 您的令牌交换端点 | 授权服务器 | 验证授权代码和刷新令牌,并向 Google 服务器发放访问令牌。 |
| Google 重定向 URI | 回调端点 | 从您的授权服务接收包含 code 和 state 值的用户重定向。 |
由 Google 发起的 OAuth 2.0 授权代码流程会话具有以下流程:
- Google 会在用户的浏览器中打开您的授权端点。如果流程是在仅支持语音的设备上针对某项操作启动的,Google 会将执行转移到手机。
- 用户登录(如果尚未登录),并授予 Google 权限以通过您的 API 访问其数据(如果尚未授予权限)。
- 您的服务创建授权代码并将其返回给 Google。为此,请将用户的浏览器重定向回 Google,并在请求中附上授权代码。
- Google 会将授权代码发送到您的令牌交换端点,该端点会验证代码的真实性,并返回访问令牌和刷新令牌。访问令牌是一种短期有效的令牌,您的服务会将其作为凭据来接受,以便访问 API。刷新令牌是一种长期有效的令牌,Google 可以存储并使用它在访问令牌过期时获取新的访问令牌。
- 用户完成账号关联流程后,Google 发送的每个后续请求都包含一个访问令牌。
处理授权请求
当您需要使用 OAuth 2.0 授权码流程执行账号关联时,Google 会将用户发送到您的授权端点,并发送包含以下参数的请求:
| 授权端点参数 | |
|---|---|
client_id |
您分配给 Google 的客户端 ID。 |
redirect_uri |
您将对此请求的响应发送到的网址。 |
state |
一种簿记值,在重定向 URI 中原封不动地传递回 Google。 |
scope |
可选:一组以空格分隔的范围字符串,用于指定 Google 请求授权的数据。 |
response_type |
要在响应中返回的值的类型。对于 OAuth 2.0 授权代码流程,响应类型始终为 code。 |
user_locale |
采用 RFC5646 格式的 Google 账号语言设置,用于以用户的首选语言本地化您的内容。 |
例如,如果您的授权端点位于 https://myservice.example.com/auth,则请求可能如下所示:
GET https://myservice.example.com/auth?client_id=GOOGLE_CLIENT_ID&redirect_uri=REDIRECT_URI&state=STATE_STRING&scope=REQUESTED_SCOPES&response_type=code&user_locale=LOCALE
如需让授权端点处理登录请求,请执行以下步骤:
- 验证
client_id是否与您分配给 Google 的客户端 ID 一致,以及redirect_uri是否与 Google 为您的服务提供的重定向网址一致。这些检查对于防止向意外或配置错误的客户端应用授予访问权限非常重要。如果您支持多个 OAuth 2.0 流程,还需确认response_type是否为code。 - 检查用户是否已登录您的服务。如果用户未登录,请完成服务的登录或注册流程。
- 生成一个授权代码,供 Google 用于访问您的 API。 授权代码可以是任何字符串值,但必须唯一表示用户、令牌所针对的客户端和代码的过期时间,并且不得可猜测。您通常会签发大约 10 分钟后过期的授权码。
- 确认
redirect_uri参数指定的网址具有以下格式:https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID https://oauth-redirect-sandbox.googleusercontent.com/r/YOUR_PROJECT_ID
- 将用户的浏览器重定向到
redirect_uri参数指定的网址。通过附加code和state参数进行重定向时,请添加您刚刚生成的授权代码和原始的未修改状态值。以下是生成的网址示例:https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID?code=AUTHORIZATION_CODE&state=STATE_STRING
处理令牌交换请求
您服务的令牌交换端点负责处理两种类型的令牌交换:
- 将授权代码交换为访问令牌和刷新令牌
- 将刷新令牌换成访问令牌
令牌交换请求包含以下参数:
| 令牌交换端点参数 | |
|---|---|
client_id |
此字符串用于将请求源标识为 Google。此字符串必须在您的系统中注册为 Google 的唯一标识符。 |
client_secret |
您向 Google 注册的用于服务的密钥字符串。 |
grant_type |
要兑换的令牌的类型。值为 authorization_code 或 refresh_token。 |
code |
如果值为 grant_type=authorization_code,则此参数是 Google 从您的登录或令牌交换端点收到的代码。 |
redirect_uri |
如果值为 grant_type=authorization_code,则此参数是初始授权请求中使用的网址。 |
refresh_token |
如果值为 grant_type=refresh_token,则此参数是 Google 从您的令牌交换端点收到的刷新令牌。 |
将授权代码交换为访问令牌和刷新令牌
用户登录后,您的授权端点会向 Google 返回一个时效很短的授权代码,然后 Google 会向您的令牌交换端点发送请求,以将该授权代码换成访问令牌和刷新令牌。
对于这些请求,grant_type 的值为 authorization_code,code 的值为您之前授予 Google 的授权代码的值。以下是使用授权代码交换访问令牌和刷新令牌的请求示例:
POST /token HTTP/1.1 Host: oauth2.example.com Content-Type: application/x-www-form-urlencoded client_id=GOOGLE_CLIENT_ID&client_secret=GOOGLE_CLIENT_SECRET&grant_type=authorization_code&code=AUTHORIZATION_CODE&redirect_uri=REDIRECT_URI
如需使用授权代码换取访问令牌和刷新令牌,令牌交换端点会通过执行以下步骤来响应 POST 请求:
- 验证
client_id是否将请求来源标识为授权来源,以及client_secret是否与预期值匹配。 - 验证授权代码是否有效且未过期,以及请求中指定的客户端 ID 是否与授权代码关联的客户端 ID 相符。
- 确认
redirect_uri参数指定的网址与初始授权请求中使用的值完全相同。 - 如果您无法验证上述所有条件,请返回 HTTP 400 Bad Request 错误,并将
{"error": "invalid_grant"}作为正文。 - 否则,使用授权代码中的用户 ID 生成刷新令牌和访问令牌。这些令牌可以是任何字符串值,但必须唯一表示用户和令牌所针对的客户端,并且不得可猜测。对于访问令牌,还要记录令牌的过期时间,该时间通常是在您发放令牌后一小时。刷新令牌不会过期。
- 在 HTTPS 响应的正文中返回以下 JSON 对象:
{ "token_type": "Bearer", "access_token": "ACCESS_TOKEN", "refresh_token": "REFRESH_TOKEN", "expires_in": SECONDS_TO_EXPIRATION }
Google 会存储用户的访问令牌和刷新令牌,并记录访问令牌的过期时间。当访问令牌过期时,Google 会使用刷新令牌从您的令牌交换端点获取新的访问令牌。
将刷新令牌换成访问令牌
当访问令牌过期时,Google 会向您的令牌交换端点发送请求,以将刷新令牌换成新的访问令牌。
对于这些请求,grant_type 的值为 refresh_token,而 refresh_token 的值为您之前授予 Google 的刷新令牌的值。以下是将刷新令牌换成访问令牌的请求示例:
POST /token HTTP/1.1 Host: oauth2.example.com Content-Type: application/x-www-form-urlencoded client_id=GOOGLE_CLIENT_ID&client_secret=GOOGLE_CLIENT_SECRET&grant_type=refresh_token&refresh_token=REFRESH_TOKEN
如需将刷新令牌换成访问令牌,令牌交换端点会通过执行以下步骤来响应 POST 请求:
- 验证
client_id是否将请求源标识为 Google,以及client_secret是否与预期值一致。 - 验证刷新令牌是否有效,以及请求中指定的客户端 ID 是否与刷新令牌关联的客户端 ID 相符。
- 如果您无法验证上述所有条件,请返回 HTTP 400 Bad Request 错误,并将
{"error": "invalid_grant"}作为正文。 - 否则,请使用刷新令牌中的用户 ID 生成访问令牌。这些令牌可以是任何字符串值,但必须唯一表示用户和令牌所针对的客户端,并且不得可猜测。对于访问令牌,还要记录令牌的过期时间,通常是在您发放令牌后一小时。
- 在 HTTPS 响应的正文中返回以下 JSON 对象:
{ "token_type": "Bearer", "access_token": "ACCESS_TOKEN", "expires_in": SECONDS_TO_EXPIRATION }
Xử lý các yêu cầu thông tin người dùng
Điểm cuối userinfo là một tài nguyên được bảo vệ bằng OAuth 2.0. Tài nguyên này trả về các thông báo xác nhận quyền sở hữu về người dùng được liên kết. Việc triển khai và lưu trữ điểm cuối userinfo là không bắt buộc, ngoại trừ các trường hợp sử dụng sau:
- Đăng nhập vào tài khoản được liên kết bằng tính năng Google One Chạm.
- Gói thuê bao dễ dàng trên Android TV.
Sau khi đã truy xuất thành công mã truy cập từ điểm cuối của mã thông báo, Google sẽ gửi yêu cầu đến điểm cuối userinfo của bạn để truy xuất thông tin hồ sơ cơ bản về người dùng được liên kết.
| tiêu đề của yêu cầu điểm cuối userinfo | |
|---|---|
Authorization header |
Mã truy cập thuộc loại Bearer. |
Ví dụ: nếu điểm cuối userinfo của bạn có sẵn tại
https://myservice.example.com/userinfo, một yêu cầu có thể có dạng như sau:
GET /userinfo HTTP/1.1 Host: myservice.example.com Authorization: Bearer ACCESS_TOKEN
Để điểm cuối userinfo xử lý các yêu cầu, hãy làm theo các bước sau:
- Trích xuất mã truy cập từ tiêu đề Uỷ quyền và trả về thông tin cho người dùng được liên kết với mã truy cập.
- Nếu mã truy cập không hợp lệ, hãy trả về lỗi HTTP 401 unauthorized (Không được phép sử dụng tiêu đề phản hồi
WWW-Authenticate). Dưới đây là ví dụ về phản hồi khi xảy ra lỗi thông tin người dùng: Nếu phản hồi 401 Trái phép hoặc bất kỳ lỗi không thành công nào khác được trả về trong quá trình liên kết, thì lỗi này sẽ không khôi phục được, mã thông báo đã truy xuất sẽ bị loại bỏ và người dùng sẽ phải bắt đầu lại quy trình liên kết.HTTP/1.1 401 Unauthorized WWW-Authenticate: error="invalid_token", error_description="The Access Token expired"
Nếu mã truy cập hợp lệ, hãy trả về và phản hồi HTTP 200 kèm theo đối tượng JSON sau trong phần nội dung của HTTPS trả lời:
Nếu điểm cuối userinfo của bạn trả về phản hồi thành công HTTP 200, thì mã thông báo và các thông báo xác nhận quyền sở hữu đã truy xuất sẽ được đăng ký vào Tài khoản Google của người dùng.{ "sub": "USER_UUID", "email": "EMAIL_ADDRESS", "given_name": "FIRST_NAME", "family_name": "LAST_NAME", "name": "FULL_NAME", "picture": "PROFILE_PICTURE", }phản hồi của thiết bị đầu cuối userinfo subMã nhận dạng duy nhất giúp nhận dạng người dùng trong hệ thống của bạn. emailĐịa chỉ email của người dùng. given_nameKhông bắt buộc: Tên của người dùng. family_nameKhông bắt buộc: Họ của người dùng. nameKhông bắt buộc: Tên đầy đủ của người dùng. pictureKhông bắt buộc: Ảnh hồ sơ của người dùng.
Xác thực quá trình triển khai
Bạn có thể xác thực việc triển khai bằng cách sử dụng công cụ OAuth 2.0 Playground.
Trong công cụ này, hãy thực hiện các bước sau:
- Nhấp vào Configuration để mở cửa sổ OAuth 2.0 Configuration (Cấu hình OAuth 2.0).
- Trong trường OAuth flow (Quy trình OAuth), hãy chọn Client-side (Phía máy khách).
- Trong trường OAuth Endpoints (Điểm cuối OAuth), hãy chọn Custom (Tuỳ chỉnh).
- Chỉ định điểm cuối OAuth 2.0 và mã ứng dụng khách mà bạn đã chỉ định cho Google trong các trường tương ứng.
- Trong phần Step 1 (Bước 1), đừng chọn phạm vi nào của Google. Thay vào đó, hãy để trống trường này hoặc nhập một phạm vi hợp lệ cho máy chủ của bạn (hoặc một chuỗi tuỳ ý nếu bạn không sử dụng phạm vi OAuth). Khi hoàn tất, hãy nhấp vào Authorize APIs (Cấp quyền cho API).
- Trong phần Step 2 (Bước 2) và Step 3 (Bước 3), hãy thực hiện quy trình OAuth 2.0 và xác minh rằng mỗi bước đều hoạt động như dự kiến.
Bạn có thể xác thực việc triển khai bằng cách sử dụng công cụ Google Account Linking Demo.
Trong công cụ này, hãy thực hiện các bước sau:
- Nhấp vào nút Sign in with Google (Đăng nhập bằng Google).
- Chọn tài khoản mà bạn muốn liên kết.
- Nhập mã dịch vụ.
- Bạn có thể nhập một hoặc nhiều phạm vi mà bạn sẽ yêu cầu quyền truy cập.
- Nhấp vào Start Demo (Bắt đầu bản minh hoạ).
- Khi được nhắc, hãy xác nhận rằng bạn có thể đồng ý và từ chối yêu cầu liên kết.
- Xác nhận rằng bạn được chuyển hướng đến nền tảng của mình.