在您成功检索用户的凭据后 或检索到的登录提示, 您可以检查是否有 ID 令牌可用于凭据。ID 令牌是 已签名的用户身份断言,其中也包含用户的基本个人资料 其中可能包括经 Google 验证 Google。当 ID 令牌可用时,您可以用它们安全地 向您的应用后端进行身份验证,或跳过电子邮件验证步骤 。
当 Credential
对象的 User-ID 与用户匹配时,可以使用 ID 令牌
在设备上登录的 Google 账号的 ID。
如需使用 ID 令牌登录,请先使用 getIdTokens
检索 ID 令牌
方法。然后,将 ID 令牌发送到应用的后端。在后端,验证
使用 Google API 客户端库或通用 JWT 提供的令牌
库。
准备工作
- 您的应用必须能够成功检索用户的凭据 或检索登录提示。
- 在构建
setAccountTypes(IdentityProviders.GOOGLE)
CredentialRequest
和HintRequest
对象。
从 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 登录文档 了解详情。