使用 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 Auth 库

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