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

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

Trước khi bắt đầu

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

Sau khi 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ó chứa mã thông báo nhận dạng hay không. Nếu có, hãy gọi getIdTokens để truy xuất và gửi đến máy chủ phụ trợ của bạn bằng yêu cầu POST qua HTTPS.

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ã nhận dạng trên phần phụ trợ

Sau khi nhận được mã nhận dạng bằng yêu cầu POST qua HTTPS, bạn phải xác minh chữ ký của mã thông báo và xác minh các khai báo aud, issexp của mã thông báo.

Thông báo xác nhận quyền sở hữu aud của mã thông báo 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ý. Bạn có thể nhận được 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ể lấy hàm băm SHA-512 bằng cách kiểm tra một mã nhận dạng mã thông báo 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 xác thực của Google 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ề tính năng Đăng nhập bằng Google để biết thêm thông tin chi tiết.