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

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

Trước khi bắt đầu

Lấy mã thông báo 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ó phải là có chứa mã thông báo nhận dạng. Nếu có, hãy gọi getIdTokens để truy xuất và gửi hình ảnh vào phần phụ trợ 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 giá trị nhận dạng trên phần phụ trợ

Sau khi nhận được mã thông báo nhận dạng qua HTTPS POST, bạn phải xác minh chữ ký và 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.

Thông báo xác nhận quyền sở hữu của aud về một mã thông báo ID từ Smart Lock cho Mật khẩu có: định dạng:

android://SHA512_HASH@ANDROID_PACKAGE_NAME

Giá trị SHA512HASH là hàm băm SHA-512 của hoạt động ký chứng chỉ. Bạn có thể lấy 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 '+/' '-
'

Ngoài ra, bạn có thể lấy 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ố tác vụ xác minh trong số này cho bạn. Ví dụ: dùng thư viện ứng dụng API 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.");
}

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