Nếu đăng nhập One Tap đáp ứng được nhu cầu của bạn, hãy xem xét sử dụng nó để thay thế. One Tap có trải nghiệm người dùng được cập nhật và các cải tiến khác.

Đăng nhập bằng Mã thông báo ID

Sau khi bạn đã truy xuất thành công thông tin đăng nhập của người dùng hoặc truy xuất các gợi ý đăng nhập , bạn có thể kiểm tra xem mã thông báo ID có sẵn cho thông tin đăng nhập hay không. Mã thông báo ID là một xác nhận có chữ ký về danh tính của người dùng cũng chứa thông tin hồ sơ cơ bản của người dùng, có thể bao gồm địa chỉ email đã được Google xác minh. Khi có mã thông báo ID, bạn có thể sử dụng chúng để xác thực an toàn với chương trình phụ trợ của ứng dụng hoặc bỏ qua bước xác minh email khi tạo tài khoản mới.

Mã thông báo ID khả dụng khi ID người dùng của đối tượng Credential khớp với ID người dùng của tài khoản Google được đăng nhập trên thiết bị.

Để đăng nhập bằng mã thông báo ID, trước tiên hãy truy xuất mã thông báo ID bằng phương thức getIdTokens . Sau đó, gửi mã thông báo ID đến chương trình phụ trợ của ứng dụng của bạn. Trên phần phụ trợ, hãy xác minh mã thông báo bằng cách sử dụng thư viện ứng dụng API Google hoặc thư viện JWT có mục đích chung.

Trước khi bắt đầu

Nhận mã thông báo ID từ đối tượng Thông tin đăng nhập

Sau khi bạn truy xuất thông tin đăng nhập của người dùng, hãy kiểm tra xem đối tượng Credentials có bao gồm mã thông báo ID hay không. Nếu có, hãy gọi getIdTokens để lấy nó và gửi nó đến phần phụ trợ của bạn bằng HTTPS POST.

if (!credential.getIdTokens().isEmpty()) {
    String idToken = credential.getIdTokens().get(0).getIdToken();

    HttpClient httpClient = new DefaultHttpClient();
    HttpPost httpPost = new HttpPost("https://yourbackend.example.com/tokensignin");

    try {
        List nameValuePairs = new ArrayList(1);
        nameValuePairs.add(new BasicNameValuePair("idToken", idToken));
        httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

        HttpResponse response = httpClient.execute(httpPost);
        int statusCode = response.getStatusLine().getStatusCode();
        final String responseBody = EntityUtils.toString(response.getEntity());
        Log.i(TAG, "Signed in as: " + responseBody);
    }
}

Xác minh mã thông báo ID trên chương trình phụ trợ

Sau khi nhận được ID mã thông báo là HTTPS POST, bạn phải xác minh chữ ký của mã thông báo, và xác minh của mã thông báo aud , iss , và exp khiếu nại.

Các aud tuyên bố của một ID token từ Smart Lock for Passwords có định dạng sau:

android://SHA512_HASH@ANDROID_PACKAGE_NAME

Giá trị SHA512 HASH là hàm băm SHA-512 của chứng chỉ ký của bạn. Bạn có thể nhận giá trị này bằng cách sử dụng tiện ích keytoolopenssl :

keytool -exportcert -keystore path-to-keystore -alias key-name 
| openssl sha -sha512 -binary
| base64 -w 0
| tr '+/' '-'

Hoặc, bạn có thể lấy mã băm SHA-512 bằng cách kiểm tra mã thông báo ID mà bạn biết là hợp lệ.

Thư viện JWT có thể xử lý một số tác vụ xác minh này cho bạn. Ví dụ: sử dụng thư viện ứng dụng Google API cho Java :

import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken;
import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken.Payload;
import com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier;

...

// Verifier that checks that the token has the proper issuer and audience,
// and hasn't expired
private static GoogleIdTokenVerifier verifier =
    new GoogleIdTokenVerifier.Builder(transport, jsonFactory)
        .setAudience(Arrays.asList(String.format("android://%s@%s", SHA512_HASH, PACKAGE_NAME)))
        .build();

// (Receive idTokenString by HTTPS POST)

GoogleIdToken idToken = verifier.verify(idTokenString);
if (idToken != null) {
  Payload payload = idToken.getPayload();
  System.out.println("User email: " + payload.getEmail());
  if (payload.getEmailVerified()) {
    System.out.println("Email verified by Google.");
  }
} else {
  System.out.println("Invalid ID token.");
}

Xem tài liệu Đăng nhập bằng Google để biết thêm chi tiết.