Đăng nhập bằng tài khoản được liên kết

Tính năng Liên kết Tài khoản Google giúp chủ Tài khoản Google kết nối nhanh chóng, liền mạch và an toàn với các dịch vụ của bạn cũng như chia sẻ dữ liệu với Google.

Tính năng Đăng nhập bằng tài khoản được liên kết sẽ bật tính năng Đăng nhập bằng một lần chạm bằng Google cho những người dùng đã liên kết Tài khoản Google với dịch vụ của bạn. Điều này giúp người dùng có trải nghiệm tốt hơn vì họ có thể đăng nhập chỉ bằng một lần nhấp mà không cần nhập lại tên người dùng và mật khẩu. Điều này cũng giúp giảm khả năng người dùng tạo tài khoản trùng lặp trên dịch vụ của bạn.

Yêu cầu

Để triển khai tính năng Đăng nhập bằng tài khoản được liên kết, bạn phải đáp ứng các yêu cầu sau:

  • Bạn đã triển khai tính năng Liên kết OAuth Tài khoản Google có hỗ trợ quy trình mã uỷ quyền OAuth 2.0. Quá trình triển khai OAuth phải bao gồm những điểm cuối sau đây:
    • điểm cuối uỷ quyền để xử lý các yêu cầu uỷ quyền.
    • điểm cuối mã thông báo để xử lý yêu cầu truy cập và làm mới mã thông báo.
    • điểm cuối userinfo để truy xuất thông tin tài khoản cơ bản về người dùng được liên kết. Thông tin này hiển thị với người dùng trong quá trình Đăng nhập vào tài khoản được liên kết.
  • Bạn có một ứng dụng Android.

Cách thức hoạt động

Điều kiện tiên quyết : Người dùng đã từng liên kết Tài khoản Google của họ với tài khoản của họ trên dịch vụ của bạn.

  1. Bạn chọn hiển thị các tài khoản được liên kết trong quy trình Đăng nhập bằng một lần chạm.
  2. Người dùng sẽ nhìn thấy lời nhắc Đăng nhập bằng một lần chạm cùng với lựa chọn đăng nhập vào dịch vụ của bạn bằng tài khoản được liên kết của họ.
  3. Nếu người dùng chọn tiếp tục với tài khoản được liên kết, Google sẽ gửi yêu cầu đến điểm cuối của mã thông báo của bạn để lưu mã uỷ quyền. Yêu cầu này chứa mã truy cập của người dùng do dịch vụ của bạn cấp và mã uỷ quyền của Google.
  4. Bạn đổi mã uỷ quyền của Google lấy mã thông báo giá trị nhận dạng của Google chứa thông tin về Tài khoản Google của người dùng.
  5. Ứng dụng cũng sẽ nhận được mã thông báo mã nhận dạng khi quy trình này kết thúc và bạn so khớp mã này với giá trị nhận dạng người dùng trong mã thông báo mà máy chủ của bạn nhận được để đăng nhập người dùng vào ứng dụng.
Đăng nhập tài khoản được liên kết.
Hình 1. Quy trình đăng nhập tài khoản được liên kết. Nếu người dùng có nhiều tài khoản đã đăng nhập trên thiết bị của mình, thì người dùng có thể thấy trình chọn tài khoản và chỉ được đưa đến chế độ xem Đăng nhập vào tài khoản được liên kết nếu họ chọn một tài khoản được liên kết.

Triển khai tính năng Đăng nhập bằng tài khoản được liên kết trong ứng dụng Android

Để hỗ trợ tính năng Đăng nhập bằng tài khoản được liên kết trên ứng dụng Android, hãy làm theo hướng dẫn trong hướng dẫn triển khai cho Android.

Xử lý các yêu cầu mã uỷ quyền từ Google

Google gửi yêu cầu POST đến điểm cuối của mã thông báo của bạn để lưu mã uỷ quyền mà bạn đổi lấy mã thông báo nhận dạng của người dùng. Yêu cầu này có chứa mã truy cập của người dùng và mã uỷ quyền OAuth2 do Google cấp.

Trước khi lưu mã uỷ quyền, bạn phải xác minh rằng mã truy cập này là do bạn cấp cho Google và được client_id xác định.

Yêu cầu HTTP

Yêu cầu mẫu

POST /token HTTP/1.1
Host: server.example.com
Content-Type: application/x-www-form-urlencoded

code=GOOGLE_AUTHORIZATION_CODE
&grant_type=urn:ietf:params:oauth:grant-type:reciprocal
&client_id=CLIENT_ID
&client_secret=CLIENT_SECRET
&access_token=ACCESS_TOKEN

Điểm cuối trao đổi mã thông báo của bạn phải có khả năng xử lý các tham số yêu cầu sau:

Tham số điểm cuối của mã thông báo
code Bắt buộc Mã uỷ quyền Google OAuth2
client_id Mã ứng dụng khách bắt buộc mà bạn đã cấp cho Google
client_secret Bắt buộc Mật khẩu ứng dụng khách mà bạn cấp cho Google
access_token Bắt buộc Mã truy cập mà bạn đã cấp cho Google. Bạn sẽ sử dụng thông tin này để biết bối cảnh của người dùng
grant_type Bắt buộc PHẢI đặt giá trị thành urn:ietf:params:oauth:grant-type:reciprocal

Điểm cuối trao đổi mã thông báo của bạn phải phản hồi yêu cầu POST bằng cách làm như sau:

  • Xác minh rằng access_token đã được cấp cho Google mà client_id đã xác định.
  • Phản hồi bằng phản hồi HTTP 200 (OK) nếu yêu cầu hợp lệ và mã xác thực được đổi thành công cho mã thông báo giá trị nhận dạng của Google hoặc mã lỗi HTTP nếu yêu cầu không hợp lệ.

Phản hồi HTTP

Thành công

Trả về mã trạng thái HTTP 200 OK

Mẫu phản hồi thành công
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
Pragma: no-cache
{}

Lỗi

Trong trường hợp có yêu cầu HTTP không hợp lệ, hãy phản hồi bằng một trong các mã lỗi HTTP sau:

Mã trạng thái HTTP Nội dung Nội dung mô tả
400 {"error": "invalid_request"} Yêu cầu thiếu tham số nên máy chủ không thể tiếp tục xử lý yêu cầu. Giá trị này cũng có thể được trả về nếu yêu cầu có chứa một thông số không được hỗ trợ hoặc lặp lại một thông số
401 {"error": "invalid_request"} Không xác thực được ứng dụng, chẳng hạn như khi yêu cầu chứa mã ứng dụng khách hoặc khoá bí mật không hợp lệ
401 {"error": "invalid_token"}

Bao gồm thử thách xác thực "Giao thức xác thực www: Mang đến" trong tiêu đề phản hồi

Mã truy cập của đối tác không hợp lệ.
403 {"error": "insufficient_permission"}

Bao gồm thử thách xác thực "Giao thức xác thực www: Mang đến" trong tiêu đề phản hồi

Mã truy cập của đối tác không chứa(các) phạm vi cần thiết để thực hiện OAuth tương hỗ
500 {"error": "internal_error"} Lỗi máy chủ

Phản hồi lỗi phải chứa các trường sau :

Trường phản hồi lỗi
error Chuỗi lỗi Bắt buộc
error_description Nội dung mô tả lỗi mà con người có thể đọc được
error_uri URI cung cấp thêm thông tin chi tiết về lỗi
Phản hồi lỗi 400 mẫu
HTTP/1.1 400 Bad Request
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache

{
  "error": "invalid_request",
  "error_description": "Request was missing the 'access_token' parameter."
}

Mã uỷ quyền đổi lấy mã thông báo nhận dạng

Bạn sẽ cần đổi mã uỷ quyền mà bạn đã nhận được để lấy mã nhận dạng của Google có chứa thông tin về Tài khoản Google của người dùng.

Để trao đổi mã uỷ quyền lấy mã thông báo giá trị nhận dạng của Google, hãy gọi điểm cuối https://oauth2.googleapis.com/token rồi đặt các tham số sau:

Trường yêu cầu
client_id Bắt buộc Mã ứng dụng khách lấy từ trang Thông tin xác thực trong Bảng điều khiển API. Đây thường là thông tin đăng nhập có tên Ứng dụng Actions on Google mới
client_secret Bắt buộc Mật khẩu ứng dụng khách lấy từ trang Thông tin xác thực trong Bảng điều khiển API
code Bắt buộc Mã uỷ quyền được gửi trong yêu cầu ban đầu
grant_type Bắt buộc Như xác định trong thông số kỹ thuật của OAuth 2.0, giá trị của trường này phải được đặt thành authorization_code.
Yêu cầu mẫu
POST /oauth2/v4/token HTTP/1.1
Host: www.googleapis.com
Content-Type: application/x-www-form-urlencoded

code=GOOGLE_AUTHORIZATION_CODE
&grant_type=authorization_code
&client_id=GOOGLE_CLIENT_ID
&client_secret=GOOGLE_CLIENT_SECRET

Google phản hồi yêu cầu này bằng cách trả về một đối tượng JSON chứa mã truy cập ngắn hạn và một mã làm mới.

Phản hồi có chứa các trường sau:

Trường câu trả lời
access_token Mã truy cập do Google cấp mà ứng dụng của bạn gửi để cho phép một yêu cầu API của Google
id_token Mã thông báo nhận dạng chứa thông tin Tài khoản Google của người dùng. Mục Xác thực phản hồi có thông tin chi tiết về cách giải mã và xác thực phản hồi mã thông báo giá trị nhận dạng
expires_in Thời gian tồn tại còn lại của mã truy cập (tính bằng giây)
refresh_token Mã thông báo mà bạn có thể dùng để lấy mã truy cập mới. Mã làm mới có hiệu lực cho đến khi người dùng thu hồi quyền truy cập
scope Giá trị của trường này luôn được đặt thành openid cho trường hợp sử dụng Đăng nhập bằng tài khoản được liên kết
token_type Loại mã thông báo được trả về. Hiện tại, giá trị của trường này luôn được đặt thành Bearer
Phản hồi mẫu
HTTP/1.1 200 OK
Content-type: application/json; charset=utf-8

{
  "access_token": "Google-access-token",
  "id_token": "Google-ID-token",
  "expires_in": 3599,
  "token_type": "Bearer",
  "scope": "openid",
  "refresh_token": "Google-refresh-token"
}


POST /oauth2/v4/token HTTP/1.1
Host: www.googleapis.com
Content-Type: application/x-www-form-urlencoded

code=Google authorization code
&grant_type=authorization_code
&client_id=Google client id
&client_secret=Google client secret

Xác thực phản hồi Mã thông báo mã nhận dạng

Xác thực và giải mã khẳng định JWT

Bạn có thể xác thực và giải mã xác nhận JWT bằng cách sử dụng thư viện giải mã JWT cho ngôn ngữ của bạn . Sử dụng khóa công khai của Google, có sẵn ở định dạng JWK hoặc PEM , để xác minh chữ ký của mã thông báo.

Khi được giải mã, xác nhận JWT trông giống như ví dụ sau:

{
  "sub": "1234567890",      // The unique ID of the user's Google Account
  "iss": "https://accounts.google.com",        // The assertion's issuer
  "aud": "123-abc.apps.googleusercontent.com", // Your server's client ID
  "iat": 233366400,         // Unix timestamp of the assertion's creation time
  "exp": 233370000,         // Unix timestamp of the assertion's expiration time
  "name": "Jan Jansen",
  "given_name": "Jan",
  "family_name": "Jansen",
  "email": "jan@gmail.com", // If present, the user's email address
  "email_verified": true,   // true, if Google has verified the email address
  "hd": "example.com",      // If present, the host domain of the user's GSuite email address
                            // If present, a URL to user's profile picture
  "picture": "https://lh3.googleusercontent.com/a-/AOh14GjlTnZKHAeb94A-FmEbwZv7uJD986VOF1mJGb2YYQ",
  "locale": "en_US"         // User's locale, from browser or phone settings
}

Ngoài xác minh chữ ký của mã thông báo, xác minh rằng tổ chức phát hành của sự khẳng định ( iss trường) là https://accounts.google.com , mà khán giả ( aud trường) là ID của khách hàng được phân công của mình, và rằng các dấu hiệu chưa hết hạn ( exp cánh đồng).

Sử dụng các trường email , email_verifiedhd bạn có thể xác định xem Google có lưu trữ và có thẩm quyền cho một địa chỉ email hay không. Trong trường hợp Google có thẩm quyền, người dùng hiện được coi là chủ sở hữu tài khoản hợp pháp và bạn có thể bỏ qua mật khẩu hoặc các phương pháp thử thách khác. Nếu không, các phương pháp này có thể được sử dụng để xác minh tài khoản trước khi liên kết.

Các trường hợp mà Google có thẩm quyền:

  • email có hậu tố @gmail.com , đây là tài khoản Gmail.
  • email_verified là true và hd được đặt, đây là tài khoản G Suite.

Người dùng có thể đăng ký Tài khoản Google mà không cần sử dụng Gmail hoặc G Suite. Khi email không chứa hậu tố @gmail.com và không có hd Google không có thẩm quyền và bạn nên sử dụng mật khẩu hoặc các phương pháp thử thách khác để xác minh người dùng. email_verfied cũng có thể đúng vì ban đầu Google đã xác minh người dùng khi tài khoản Google được tạo, tuy nhiên quyền sở hữu tài khoản email của bên thứ ba có thể đã thay đổi.