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.

Create the project

To create your project to use account linking:

  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 .

The Google Account Linking process includes a consent screen which tells users the application requesting access to their data, what kind of data they are asking for and the terms that apply. You will need to configure your OAuth consent screen before generating a Google API client ID.

  1. Open the OAuth consent screen page of the Google APIs console.
  2. If prompted, select the project you just created.
  3. On the "OAuth consent screen" page, fill out the form and click the “Save” button.

    Application name: The name of the application asking for consent. The name should accurately reflect your application and be consistent with the application name users see elsewhere. The application name will be shown on the Account Linking consent screen.

    Application logo: An image on the consent screen that will help users recognize your app. The logo is shown on Account linking consent screen and on account settings

    Support email: For users to contact you with questions about their consent.

    Scopes for Google APIs: Scopes allow your application to access your user's private Google data. For the Google Account Linking use case, default scope (email, profile, openid) is sufficient, you don’t need to add any sensitive scopes. It is generally a best practice to request scopes incrementally, at the time access is required, rather than up front. Learn more.

    Authorized domains: To protect you and your users, Google only allows applications that authenticate using OAuth to use Authorized Domains. Your applications' links must be hosted on Authorized Domains. Learn more.

    Application Homepage link: Home page for your application. Must be hosted on an Authorized Domain.

    Application Privacy Policy link: Shown on Google Account Linking consent screen. Must be hosted on an Authorized Domain.

    Application Terms of Service link (Optional): Must be hosted on an Authorized Domain.

    Figure 1. Google Account Linking Consent Screen for a fictitious Application, Tunery

  4. Check "Verification Status", if your application needs verification then click the "Submit For Verification" button to submit your application for verification. Refer to OAuth verification requirements for details.

Triển khai máy chủ OAuth

Để hỗ trợ quy trình ngầm OAuth 2.0, dịch vụ của bạn sẽ thực hiện uỷ quyền điểm cuối được cung cấp bởi HTTPS. Điểm cuối này chịu trách nhiệm xác thực và có được sự đồng ý của người dùng về việc truy cập dữ liệu. Điểm cuối uỷ quyền biểu thị giao diện người dùng đăng nhập cho những người dùng chưa đăng nhập và ghi lại đồng ý với quyền truy cập được yêu cầu.

Khi ứng dụng của Google cần gọi một trong những API được uỷ quyền của dịch vụ, Google sử dụng điểm cuối này để yêu cầu người dùng cho phép gọi các API này thay mặt cho công ty.

Một phiên luồng quy trình ngầm ẩn OAuth 2.0 điển hình do Google khởi tạo có quy trình sau:

  1. 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. Chiến lược phát hành đĩa đơn người dùng đăng nhập, nếu chưa đăng nhập và cấp cho Google quyền truy cập vào dữ liệu của họ bằng API của bạn nếu họ chưa cấp quyền.
  2. Dịch vụ của bạn sẽ tạo mã truy cập rồi trả lại cho Google. Để thực hiện việc này, hãy chuyển hướng trình duyệt của người dùng trở lại Google bằng quyền truy cập vào yêu cầu.
  3. Google gọi các API của dịch vụ và đính kèm mã truy cập bằng từng yêu cầu. Dịch vụ của bạn xác minh rằng mã truy cập cấp cho Google uỷ quyền truy cập API, sau đó hoàn tất lệnh gọi API.

Xử lý yêu cầu uỷ quyền

Khi một ứng dụng của Google cần thực hiện liên kết tài khoản qua OAuth 2.0 luồng ngầm ẩn, Google sẽ chuyển người dùng đến điểm cuối uỷ quyền của bạn bằng bao gồm các thông số sau:

Tham số điểm cuối ủy quyền
client_id Mã ứng dụng khách mà bạn đã chỉ định cho Google.
redirect_uri URL mà bạn gửi phản hồi tới yêu cầu này.
state Giá trị sổ sách được chuyển lại cho Google không thay đổi trong URI chuyển hướng.
response_type Loại giá trị cần trả về trong phản hồi. Đối với OAuth 2.0 ngầm ẩn luồng, loại phản hồi luôn là token.
user_locale Chế độ cài đặt ngôn ngữ trong Tài khoản Google trong RFC5646 định dạng dùng để bản địa hoá nội dung của bạn sang ngôn ngữ ưu tiên của người dùng.

Ví dụ: nếu điểm cuối uỷ quyền của bạn có tại https://myservice.example.com/auth, một yêu cầu có thể có dạng như sau:

GET https://myservice.example.com/auth?client_id=GOOGLE_CLIENT_ID&redirect_uri=REDIRECT_URI&state=STATE_STRING&response_type=token&user_locale=LOCALE

Để điểm cuối uỷ quyền của bạn có thể xử lý các yêu cầu đăng nhập, hãy làm như sau các bước:

  1. Xác minh các giá trị client_idredirect_uri để ngăn việc cấp quyền truy cập vào các ứng dụng khách ngoài ý muốn hoặc bị định cấu hình sai:

    • Xác nhận rằng client_id khớp với mã ứng dụng khách mà bạn được chỉ định cho Google.
    • Xác nhận rằng URL do redirect_uri chỉ định thông số đó có dạng như sau:
      https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID
      https://oauth-redirect-sandbox.googleusercontent.com/r/YOUR_PROJECT_ID
      
  2. Kiểm tra xem người dùng đã đăng nhập vào dịch vụ của bạn chưa. Nếu người dùng chưa ký hãy hoàn tất quy trình đăng nhập hoặc đăng ký dịch vụ của bạn.

  3. Tạo mã truy cập cho Google dùng để truy cập vào API của bạn. Chiến lược phát hành đĩa đơn mã truy cập có thể là bất kỳ giá trị chuỗi nào, nhưng mã này phải thể hiện duy nhất người dùng và máy khách của mã thông báo đó và không được phép đoán.

  4. Gửi phản hồi HTTP chuyển hướng trình duyệt của người dùng đến URL do tham số redirect_uri chỉ định. Bao gồm tất cả các tham số sau trong phân đoạn URL:

    • access_token: Mã truy cập bạn vừa tạo
    • token_type: Chuỗi bearer
    • state: Giá trị trạng thái chưa được sửa đổi của giá trị gốc yêu cầu

    Sau đây là ví dụ về URL kết quả:

    https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID#access_token=ACCESS_TOKEN&token_type=bearer&state=STATE_STRING

Trình xử lý chuyển hướng OAuth 2.0 của Google nhận được mã truy cập và xác nhận rằng giá trị state không thay đổi. Sau khi Google có được mã truy cập của dịch vụ của bạn, Google sẽ đính kèm mã này vào các lệnh gọi tiếp theo cho các API dịch vụ của bạn.

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:

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:

  1. 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.
  2. 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:
    HTTP/1.1 401 Unauthorized
    WWW-Authenticate: error="invalid_token",
    error_description="The Access Token expired"
    
    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.
  3. 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 phản hồi:

    {
    "sub": "USER_UUID",
    "email": "EMAIL_ADDRESS",
    "given_name": "FIRST_NAME",
    "family_name": "LAST_NAME",
    "name": "FULL_NAME",
    "picture": "PROFILE_PICTURE",
    }
    
    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.

    phản hồi của thiết bị đầu cuối userinfo
    sub Mã 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_name Không bắt buộc: Tên của người dùng.
    family_name Không bắt buộc: Họ của người dùng.
    name Không bắt buộc: Tên đầy đủ của người dùng.
    picture Không bắt buộc: Ảnh hồ sơ của người dùng.

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

You can validate your implementation by using the OAuth 2.0 Playground tool.

In the tool, do the following steps:

  1. Click Configuration to open the OAuth 2.0 Configuration window.
  2. In the OAuth flow field, select Client-side.
  3. In the OAuth Endpoints field, select Custom.
  4. Specify your OAuth 2.0 endpoint and the client ID you assigned to Google in the corresponding fields.
  5. In the Step 1 section, don't select any Google scopes. Instead, leave this field blank or type a scope valid for your server (or an arbitrary string if you don't use OAuth scopes). When you're done, click Authorize APIs.
  6. In the Step 2 and Step 3 sections, go through the OAuth 2.0 flow and verify that each step works as intended.

You can validate your implementation by using the Google Account Linking Demo tool.

In the tool, do the following steps:

  1. Click the Sign-in with Google button.
  2. Choose the account you'd like to link.
  3. Enter the service ID.
  4. Optionally enter one or more scopes that you will request access for.
  5. Click Start Demo.
  6. When prompted, confirm that you may consent and deny the linking request.
  7. Confirm that you are redirected to your platform.