使用 ID 令牌登录

在成功检索用户的凭据检索登录提示后,您可以检查 ID 令牌是否可用于该凭据。ID 令牌是用户的身份的已签名断言,其中还包含用户的基本个人资料信息,可能包括已经过 Google 验证的电子邮件地址。当 ID 令牌可用时,您可以使用它们安全地向应用的后端进行身份验证,或者在创建新帐号时跳过电子邮件验证步骤。

Credential 对象的用户 ID 与设备上登录的 Google 帐号的用户 ID 匹配时,可以使用 ID 令牌。

如需使用 ID 令牌登录,请先使用 getIdTokens 方法检索 ID 令牌。然后,将 ID 令牌发送到应用的后端。在后端,使用 Google API 客户端库或通用 JWT 库验证令牌。

准备工作

从 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 令牌后,您必须验证令牌的签名,并验证令牌的 audissexp 声明。

Smart Lock(密码专用)中 ID 令牌的 aud 声明格式如下:

android://SHA512_HASH@ANDROID_PACKAGE_NAME

SHA512HASH 是签名证书的 SHA-512 哈希值。您可以使用 keytoolopenssl 实用程序获取此值:

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 登录文档