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
- Ứng dụng của bạn phải có khả năng 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 phải gọi
setAccountTypes(IdentityProviders.GOOGLE)
khi tạo Đối tượngCredentialRequest
vàHintRequest
.
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
, iss
và exp
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 keytool
và openssl
:
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.