使用 ID 權杖登入

成功擷取使用者憑證擷取登入提示後,就可以檢查憑證是否可用的 ID 權杖。ID 權杖是一種使用者的身分簽署聲明,其中包含使用者的基本個人資料資訊,可能包括 Google 驗證的電子郵件地址。有可用的 ID 權杖時,您可以使用這些權杖安全地透過應用程式的後端進行驗證,或在建立新帳戶時略過電子郵件驗證步驟。

如果 Credential 物件的使用者 ID 與裝置上已登入的 Google 帳戶使用者 ID 相符,就可以使用 ID 權杖。

如要使用 ID 權杖登入,請先使用 getIdTokens 方法擷取 ID 權杖。接著,將 ID 憑證傳送至應用程式的後端。在後端使用 Google API 用戶端程式庫或一般用途 JWT 程式庫驗證權杖。

事前準備

從憑證物件取得 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 登入說明文件