使用 ID 權杖登入

成功擷取使用者憑證之後 或擷取的登入提示 您可以查看是否有用於驗證的 ID 權杖。ID 權杖是 含有使用者基本個人資料的已簽署聲明 這些資訊,可能包括經 Google。如果有 ID 權杖,您就能使用這些權杖安全地 在應用程式的後端進行驗證,或略過電子郵件驗證步驟 。

Credential 物件的使用者 ID 與使用者 ID 相符時,即會提供 ID 權杖 已在裝置上登入 Google 帳戶的 ID。

如要使用 ID 權杖登入,請先使用 getIdTokens 擷取 ID 權杖 方法。然後,將 ID 權杖傳送至應用程式的後端。在後端 透過 Google API 用戶端程式庫或一般用途 JWT 資源庫。

事前準備

  • 您的應用程式必須能夠成功擷取使用者憑證擷取登入提示
  • 您必須在建構時呼叫 setAccountTypes(IdentityProviders.GOOGLE) CredentialRequestHintRequest 物件。

從 Credentials 物件取得 ID 權杖

擷取使用者憑證後,請檢查 Credentials 物件是否包含 包括 ID 權杖如果存在,請呼叫 getIdTokens 以擷取並傳送。 將要求傳送至後端

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 登入說明文件 ,掌握更多詳細資訊。