Đăng nhập bằng mã thông báo nhận dạng

Sau khi truy xuất thông tin xác thực của người dùng hoặc truy xuất gợi ý đăng nhập thành công, bạn có thể kiểm tra xem có mã nhận dạng nào cho thông tin đăng nhập đó hay không. Mã thông báo mã nhận dạng là một lời khẳng định có chữ ký về danh tính của người dùng, đồng thời chứa thông tin cơ bản trong hồ sơ của người dùng, có thể bao gồm địa chỉ email đã được Google xác minh. Khi có sẵn mã thông báo nhận dạng, bạn có thể dùng các mã này để xác thực một cách an toàn bằng phần 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 nhận dạng sẽ có sẵn khi mã nhận dạng người dùng của đối tượng Credential khớp với mã nhận dạng người dùng của một Tài khoản Google đã đăng nhập trên thiết bị.

Để đăng nhập bằng mã thông báo mã nhận dạng, trước tiên, hãy truy xuất mã nhận dạng đó bằng phương thức getIdTokens. Sau đó, hãy gửi mã thông báo nhận dạng đến máy chủ phụ trợ của ứng dụng. 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 của Google hoặc thư viện JWT đa năng.

Trước khi bắt đầu

Nhận mã thông báo mã nhận dạng từ đối tượng Thông tin xác thực

Sau khi bạn truy xuất thông tin xác thực của người dùng, hãy kiểm tra xem đối tượng Credentials có mã thông báo mã nhận dạng hay không. Nếu có, hãy gọi getIdTokens để truy xuất và gửi mã đế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 mã nhận dạng trên phần phụ trợ

Sau khi nhận được mã thông báo mã thông báo qua HTTPS POST, bạn phải xác minh chữ ký của mã thông báo cũng như xác minh các thông báo xác nhận quyền sở hữu aud, issexp của mã thông báo.

Việc xác nhận quyền sở hữu aud đối với mã thông báo mã nhận dạng từ Smart Lock cho Mật khẩu có định dạng sau:

android://SHA512_HASH@ANDROID_PACKAGE_NAME

Giá trị SHA512HASH 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 các 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ể nhận hàm băm SHA-512 bằng cách kiểm tra mã thông báo mã nhận dạng mà bạn biết là hợp lệ.

Thư viện JWT có thể xử lý một số thao tác xác minh 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.");
}

Hãy xem tài liệu về Đăng nhập bằng Google để biết thêm thông tin chi tiết.