使用 ID 令牌登录

<ph type="x-smartling-placeholder">

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

Credential 对象的 User-ID 与用户匹配时,可以使用 ID 令牌 在设备上登录的 Google 账号的 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 登录文档 了解详情。