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 địnhmã 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.

创建项目

如需创建项目以使用账号关联,请执行以下操作:

  1. 前往 Google API 控制台
  2. 点击 Create project
  3. 输入名称或接受生成的建议。
  4. 确认或修改任何剩余字段。
  5. 点击创建

如需查看项目 ID,请执行以下操作:

  1. 前往 Google API 控制台
  2. 在着陆页的表格中找到您的项目。项目 ID 会显示在 ID 列中。

Google 账号关联过程包含一个权限请求页面,该页面会告知用户请求访问其数据的应用、应用请求的数据类型以及适用的条款。您需要先配置 OAuth 权限请求页面,然后才能生成 Google API 客户端 ID。

  1. 打开 Google API 控制台的 OAuth 权限请求页面 页面。
  2. 如果系统提示您选择项目,请选择您刚刚创建的项目。
  3. 在“OAuth 权限请求页面”上,填写表单,然后点击“保存”按钮。

    应用名称 :向用户征求同意的应用的名称。该名称应准确反映您的应用,并且与用户在其他位置看到的应用名称保持一致。应用名称将显示在账号关联权限请求页面上。

    应用徽标:权限请求页面上显示的一张图片,用以让用户认出您的应用。徽标会显示在账号关联权限请求页面和账号设置

    支持邮箱 :用户用于针对其同意问题与您联系的邮箱。

    Google API 的范围 :范围允许您的应用访问用户的私有 Google 数据。对于 Google 账号关联用例,默认范围(邮箱、个人资料、openid)就足够了,您无需添加任何敏感范围。通常,最佳做法是在需要访问权限时逐步请求范围,而不是提前请求。了解详情

    已获授权的网域 :为了保护您和您的用户,Google 只允许使用 OAuth 进行身份验证的应用使用已获授权的网域。您应用的链接必须托管在已获授权的网域上。了解详情

    应用首页链接 :应用的首页。必须托管在已获授权的网域上。

    应用隐私权政策链接 :显示在 Google 账号关联权限请求页面上。必须托管在已获授权的网域上。

    应用服务条款链接(可选) :必须托管在已获授权的网域上。

    图 1. 虚构应用 Tunery 的 Google 账号关联权限请求页面

  4. 查看“验证状态”,如果您的应用需要验证,请点击“提交以进行验证”按钮,提交应用以进行验证。如需了解详情,请参阅 OAuth 验证要求

Triển khai máy chủ OAuth

n

Để hỗ trợ quy trình ngầm định OAuth 2.0, dịch vụ của bạn sẽ cung cấp một điểm cuối uỷ quyền bằng HTTPS. Điểm cuối này chịu trách nhiệm xác thực và thu thập sự đồng ý của người dùng đối với quyền truy cập dữ liệu. Điểm cuối uỷ quyền sẽ 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 và ghi lại sự đồng ý đối với quyền truy cập được yêu cầu.

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

Một phiên quy trình ngầm định OAuth 2.0 thông thường do Google khởi tạo sẽ có quy trình như sau:

  1. Google mở điểm cuối uỷ quyền của bạn trong trình duyệt của người dùng. 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 tạo một mã truy cập và trả về mã đó 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 với mã truy cập được đính kèm 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 vào mỗi yêu cầu. Dịch vụ của bạn xác minh rằng mã truy cập cấp cho Google quyền truy cập vào 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 việc liên kết tài khoản thông qua luồng cấp quyền trực tiếp OAuth 2.0, Google sẽ gửi người dùng đến điểm cuối uỷ quyền của bạn bằng một yêu cầu bao gồm các tham số sau:

Tham số điểm cuối uỷ quyền
client_id Mã ứng dụng mà bạn đã chỉ định cho Google.
redirect_uri URL mà bạn gửi phản hồi cho yêu cầu này.
state Giá trị kế toán được truyền trở lại Google mà 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 quy trình ngầm định OAuth 2.0 flow, loại phản hồi luôn là token.
user_locale Chế độ cài đặt ngôn ngữ của Tài khoản Google ở RFC5646 định dạng dùng để bản địa hoá nội dung của bạn bằng 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, thì 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 xử lý các yêu cầu đăng nhập, hãy làm theo các bước sau:

  1. Xác minh giá trị client_idredirect_uri để ngăn việc cấp quyền truy cập cho các ứng dụng khách không mong muốn hoặc định cấu hình sai:

    • Xác nhận rằng client_id khớp với mã ứng dụng mà bạn đã chỉ định cho Google.
    • Xác nhận rằng URL do tham số redirect_uri chỉ định 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 hay chưa. Nếu người dùng chưa đăng nhập, hãy hoàn tất quy trình đăng nhập hoặc đăng ký của dịch vụ.

  3. Tạo mã truy cập để Google sử dụng nhằm truy cập vào API của bạn. Mã truy cập có thể là bất kỳ giá trị chuỗi nào, nhưng phải đại diện duy nhất cho người dùng và ứng dụng mà mã này dành cho, đồng thời không được đoán được.

  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. Đưa tất cả các tham số sau vào phân mảnh của URL:

    • access_token: Mã truy cập mà bạn vừa tạo
    • token_type: Chuỗi bearer
    • state: Giá trị trạng thái không sửa đổi từ yêu cầu ban đầ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 mã truy cập và xác nhận rằng giá trị state không thay đổi. Sau khi Google nhận được mã truy cập cho 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 đến 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 trả lờ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

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:

  1. Nhấp vào Configuration để mở cửa sổ OAuth 2.0 Configuration (Cấu hình OAuth 2.0).
  2. Trong trường OAuth flow (Quy trình OAuth), hãy chọn Client-side (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 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).
  6. 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:

  1. Nhấp vào nút Sign in with Google (Đă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 Start Demo (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.