在成功检索用户的凭据或检索登录提示后,您可以检查 ID 令牌是否可用于该凭据。ID 令牌是用户的身份的已签名断言,其中还包含用户的基本个人资料信息,可能包括已经过 Google 验证的电子邮件地址。当 ID 令牌可用时,您可以使用它们安全地向应用的后端进行身份验证,或者在创建新帐号时跳过电子邮件验证步骤。
当 Credential
对象的用户 ID 与设备上登录的 Google 帐号的用户 ID 匹配时,可以使用 ID 令牌。
如需使用 ID 令牌登录,请先使用 getIdTokens
方法检索 ID 令牌。然后,将 ID 令牌发送到应用的后端。在后端,使用 Google API 客户端库或通用 JWT 库验证令牌。
准备工作
- 您的应用必须能够成功检索用户的凭据或检索登录提示。
- 构建
CredentialRequest
和HintRequest
对象时,您必须调用setAccountTypes(IdentityProviders.GOOGLE)
。
从 Credentials 对象获取 ID 令牌
检索用户的凭据后,检查 Credentials
对象是否包含 ID 令牌。如果包含,则调用 getIdTokens
进行检索,并通过 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);
}
}
在后端验证 ID 令牌
通过 HTTPS POST 收到 ID 令牌后,您必须验证令牌的签名,并验证令牌的 aud
、iss
和 exp
声明。
Smart Lock(密码专用)中 ID 令牌的 aud
声明格式如下:
android://SHA512_HASH@ANDROID_PACKAGE_NAME
值 SHA512HASH 是签名证书的 SHA-512 哈希值。您可以使用 keytool
和 openssl
实用程序获取此值:
keytool -exportcert -keystore path-to-keystore -alias key-name
'
| openssl sha -sha512 -binary
| base64 -w 0
| tr '+/' '-
或者,您可以通过检查确定有效的 ID 令牌来获取 SHA-512 哈希。
JWT 库可以为您处理其中一些验证任务。例如,使用适用于 Java 的 Google API 客户端库:
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.");
}
如需了解详情,请参阅 Google 登录文档。