Liên kết Tài khoản Google với OAuth

Các tài khoản được liên kết bằng các quy trình ngầm ẩnmã 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ềntrao đổ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:

    1. 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.
    2. 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.

Hình này cho thấy các bước để người dùng liên kết tài khoản Google của họ với hệ thống xác thực của bạn. Ảnh chụp màn hình đầu tiên cho thấy quá trình liên kết do người dùng thực hiện từ nền tảng của bạn. Hình ảnh thứ hai cho thấy người dùng đăng nhập vào Google, trong khi hình ảnh thứ ba cho thấy người dùng đồng ý và xác nhận liên kết Tài khoản Google của họ với ứng dụng của bạn. Ảnh chụp màn hình cuối cùng cho thấy một tài khoản người dùng đã liên kết thành công trong ứng dụng Google.
Hình 1. Màn hình yêu cầu sự đồng ý và liên kết tài khoản mà người dùng đăng nhập vào Google.

Yêu cầu

  1. 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:

  1. 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.

  2. 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.

  3. 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ọ.

  4. 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.

  5. 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.

  6. 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ọ.

  7. 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.
  8. 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:

  1. Go to the Google API Console.
  2. Nhấp vào Tạo dự án .
  3. Nhập tên hoặc chấp nhận đề xuất được tạo.
  4. Xác nhận hoặc chỉnh sửa bất kỳ trường nào còn lại.
  5. Nhấp vào Tạo .

Để xem ID dự án của bạn:

  1. Go to the Google API Console.
  2. Tìm dự án của bạn trong bảng trên trang đích. ID dự án xuất hiện trong cột ID .

Quy trình Liên kết Tài khoản Google bao gồm một màn hình yêu cầu sự đồng ý, trong đó 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à họ đ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 đồng ý OAuth trước khi tạo mã ứng dụng khách Google API.

  1. Mở trang màn hình xin phép OAuth trong bảng điều khiển API của Google.
  2. Nếu bạn nhận được lời nhắc, hãy chọn dự án bạn vừa tạo.
  3. 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 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 nhìn thấy ở nơi khác. Tên ứng dụng sẽ xuất hiện trên màn hình đồng ý Liên kết tài khoản.

    Biểu trưng ứng dụng: Hình ảnh trên màn hình yêu cầu đồng ý 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 yêu cầu đồng ý 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 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 riêng tư của người dùng trên Google. Đố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. Nhìn chung, bạn nên yêu cầu phạm vi tăng dần, tại thời điểm cần 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 của bạn, 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 của ứng dụng 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 đồng ý Liên kết 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 yêu cầu đồng ý liên kết Tài khoản Google cho một ứng dụng giả định, Tunery

  4. Kiểm tra "Trạng thái xác minh", nếu đơn đăng ký của bạn cần xác minh, thì hãy nhấp vào nút "Gửi để xác minh" để gửi đơn đăng ký của bạn để xác minh. Hãy tham khảo Các yêu cầu về việc xác minh OAuth để biết thông tin chi tiết.

Triển khai máy chủ OAuth

An OAuth 2.0 server implementation of the authorization code flow consists of two endpoints, which your service makes available by HTTPS. The first endpoint is the authorization endpoint, which is responsible for finding or obtaining consent from users for data access. The authorization endpoint presents a sign-in UI to your users that aren't already signed in and records consent to the requested access. The second endpoint is the token exchange endpoint, which is used to obtain encrypted strings, called tokens, that authorize a user to access your service.

When a Google application needs to call one of your service's APIs, Google uses these endpoints together to get permission from your users to call these APIs on their behalf.

An OAuth 2.0 authorization code flow session initiated by Google has the following flow:

  1. Google opens your authorization endpoint in the user's browser. If the flow started on a voice-only device for an Action, Google transfers the execution to a phone.
  2. The user signs in, if not signed in already, and grants Google permission to access their data with your API, if they haven't already granted permission.
  3. Your service creates an authorization code and returns it to Google. To do so, redirect the user's browser back to Google with the authorization code attached to the request.
  4. Google sends the authorization code to your token exchange endpoint, which verifies the authenticity of the code and returns an access token and a refresh token. The access token is a short-lived token that your service accepts as credentials to access APIs. The refresh token is a long-lived token that Google can store and use to acquire new access tokens when they expire.
  5. After the user has completed the account linking flow, every subsequent request sent from Google contains an access token.

Handle authorization requests

When you need to perform account linking using the OAuth 2.0 authorization code flow, Google sends the user to your authorization endpoint with a request that includes the following parameters:

Authorization endpoint parameters
client_id The Client ID you assigned to Google.
redirect_uri The URL to which you send the response to this request.
state A bookkeeping value that is passed back to Google unchanged in the redirect URI.
scope Optional: A space-delimited set of scope strings that specify the data Google is requesting authorization for.
response_type The type of value to return in the response. For the OAuth 2.0 authorization code flow, the response type is always code.
user_locale The Google Account language setting in RFC5646 format, used to localize your content in the user's preferred language.

For example, if your authorization endpoint is available at https://myservice.example.com/auth, a request might look like the following:

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

For your authorization endpoint to handle sign-in requests, do the following steps:

  1. Verify that the client_id matches the Client ID you assigned to Google, and that the redirect_uri matches the redirect URL provided by Google for your service. These checks are important to prevent granting access to unintended or misconfigured client apps. If you support multiple OAuth 2.0 flows, also confirm that the response_type is code.
  2. Check if the user is signed in to your service. If the user isn't signed in, complete your service's sign-in or sign-up flow.
  3. Generate an authorization code for Google to use to access your API. The authorization code can be any string value, but it must uniquely represent the user, the client the token is for, and the code's expiration time, and it must not be guessable. You typically issue authorization codes that expire after approximately 10 minutes.
  4. Confirm that the URL specified by the redirect_uri parameter has the following form:
      https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID
      https://oauth-redirect-sandbox.googleusercontent.com/r/YOUR_PROJECT_ID
      
  5. Redirect the user's browser to the URL specified by the redirect_uri parameter. Include the authorization code you just generated and the original, unmodified state value when you redirect by appending the code and state parameters. The following is an example of the resulting URL:
    https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID?code=AUTHORIZATION_CODE&state=STATE_STRING

Handle token exchange requests

Your service's token exchange endpoint is responsible for two kinds of token exchanges:

  • Exchange authorization codes for access tokens and refresh tokens
  • Exchange refresh tokens for access tokens

Token exchange requests include the following parameters:

Token exchange endpoint parameters
client_id A string that identifies the request origin as Google. This string must be registered within your system as Google's unique identifier.
client_secret A secret string that you registered with Google for your service.
grant_type The type of token being exchanged. It's either authorization_code or refresh_token.
code When grant_type=authorization_code, this parameter is the code Google received from either your sign-in or token exchange endpoint.
redirect_uri When grant_type=authorization_code, this parameter is the URL used in the initial authorization request.
refresh_token When grant_type=refresh_token, this parameter is the refresh token Google received from your token exchange endpoint.
Exchange authorization codes for access tokens and refresh tokens

After the user signs in and your authorization endpoint returns a short-lived authorization code to Google, Google sends a request to your token exchange endpoint to exchange the authorization code for an access token and a refresh token.

For these requests, the value of grant_type is authorization_code, and the value of code is the value of the authorization code you previously granted to Google. The following is an example of a request to exchange an authorization code for an access token and a refresh token:

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

To exchange authorization codes for an access token and a refresh token, your token exchange endpoint responds to POST requests by executing the following steps:

  1. Verify that the client_id identifies the request origin as an authorized origin, and that the client_secret matches the expected value.
  2. Verify that the authorization code is valid and not expired, and that the client ID specified in the request matches the client ID associated with the authorization code.
  3. Confirm that the URL specified by the redirect_uri parameter is identical to the value used in the initial authorization request.
  4. If you can't verify all of the above criteria, return an HTTP 400 Bad Request error with {"error": "invalid_grant"} as the body.
  5. Otherwise, use the user ID from the authorization code to generate a refresh token and an access token. These tokens can be any string value, but they must uniquely represent the user and the client the token is for, and they must not be guessable. For access tokens, also record the expiration time of the token, which is typically an hour after you issue the token. Refresh tokens don't expire.
  6. Return the following JSON object in the body of the HTTPS response:
    {
    "token_type": "Bearer",
    "access_token": "ACCESS_TOKEN",
    "refresh_token": "REFRESH_TOKEN",
    "expires_in": SECONDS_TO_EXPIRATION
    }

Google stores the access token and the refresh token for the user and records the expiration of the access token. When the access token expires, Google uses the refresh token to get a new access token from your token exchange endpoint.

Exchange refresh tokens for access tokens

When an access token expires, Google sends a request to your token exchange endpoint to exchange a refresh token for a new access token.

For these requests, the value of grant_type is refresh_token, and the value of refresh_token is the value of the refresh token you previously granted to Google. The following is an example of a request to exchange a refresh token for an access token:

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

To exchange a refresh token for an access token, your token exchange endpoint responds to POST requests by executing the following steps:

  1. Verify that the client_id identifies the request origin as Google, and that the client_secret matches the expected value.
  2. Verify that the refresh token is valid, and that the client ID specified in the request matches the client ID associated with the refresh token.
  3. If you can't verify all of the above criteria, return an HTTP 400 Bad Request error with {"error": "invalid_grant"} as the body.
  4. Otherwise, use the user ID from the refresh token to generate an access token. These tokens can be any string value, but they must uniquely represent the user and the client the token is for, and they must not be guessable. For access tokens, also record the expiration time of the token, typically an hour after you issue the token.
  5. Return the following JSON object in the body of the HTTPS response:
    {
    "token_type": "Bearer",
    "access_token": "ACCESS_TOKEN",
    "expires_in": SECONDS_TO_EXPIRATION
    }
Handle userinfo requests

The userinfo endpoint is an OAuth 2.0 protected resource that return claims about the linked user. Implementing and hosting the userinfo endpoint is optional, except for the following use cases:

After the access token has been successfully retrieved from your token endpoint, Google sends a request to your userinfo endpoint to retrieve basic profile information about the linked user.

userinfo endpoint request headers
Authorization header The access token of type Bearer.

For example, if your userinfo endpoint is available at https://myservice.example.com/userinfo, a request might look like the following:

GET /userinfo HTTP/1.1
Host: myservice.example.com
Authorization: Bearer ACCESS_TOKEN

For your userinfo endpoint to handle requests, do the following steps:

  1. Extract access token from the Authorization header and return information for the user associated with the access token.
  2. If the access token is invalid, return an HTTP 401 Unauthorized error with using the WWW-Authenticate Response Header. Below is an example of a userinfo error response:
    HTTP/1.1 401 Unauthorized
    WWW-Authenticate: error="invalid_token",
    error_description="The Access Token expired"
    
    If a 401 Unauthorized, or any other unsuccessful error response is returned during the linking process, the error will be non-recoverable, the retrieved token will be discarded and the user will have to initiate the linking process again.
  3. If the access token is valid, return and HTTP 200 response with the following JSON object in the body of the HTTPS response:

    {
    "sub": "USER_UUID",
    "email": "EMAIL_ADDRESS",
    "given_name": "FIRST_NAME",
    "family_name": "LAST_NAME",
    "name": "FULL_NAME",
    "picture": "PROFILE_PICTURE",
    }
    If your userinfo endpoint returns an HTTP 200 success response, the retrieved token and claims are registered against the user's Google account.

    userinfo endpoint response
    sub A unique ID that identifies the user in your system.
    email Email address of the user.
    given_name Optional: First name of the user.
    family_name Optional: Last name of the user.
    name Optional: Full name of the user.
    picture Optional: Profile picture of the user.

Xác thực quá trình triển khai

Bạn có thể xác thực phương thứ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 làm theo các bước sau:

  1. Nhấp vào biểu tượng Configuration (Cấu hình) để mở cửa sổ OAuth 2.0 Configuration (Cấu hình OAuth 2.0).
  2. Trong trường Quy trình OAuth, hãy chọn Phía máy khách.
  3. Trong trường OAuth Endpoints (Điểm cuối OAuth), hãy chọn Custom (Tuỳ chỉnh).
  4. 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.
  5. Trong phần Bước 1, đừng chọn bất kỳ 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 bạn hoàn tất, hãy nhấp vào Uỷ quyền cho API.
  6. Trong các mục Bước 2Bước 3, hãy thực hiện quy trình OAuth 2.0 và xác minh rằng mỗi bước hoạt động như dự kiến.

Bạn có thể xác thực việc triển khai của mình bằng cách sử dụng công cụ Bản minh hoạ về cách liên kết Tài khoản Google.

Trong công cụ này, hãy làm theo các bước sau:

  1. Nhấp vào nút Đăng nhập bằng Google.
  2. Chọn tài khoản mà bạn muốn liên kết.
  3. Nhập mã dịch vụ.
  4. 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.
  5. Nhấp vào Bắt đầu bản minh hoạ.
  6. 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.
  7. Xác nhận rằng bạn được chuyển hướng đến nền tảng của mình.