使用 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 登入說明文件