成功擷取使用者憑證或擷取登入提示後,就可以檢查憑證是否可用的 ID 權杖。ID 權杖是一種使用者的身分簽署聲明,其中包含使用者的基本個人資料資訊,可能包括 Google 驗證的電子郵件地址。有可用的 ID 權杖時,您可以使用這些權杖安全地透過應用程式的後端進行驗證,或在建立新帳戶時略過電子郵件驗證步驟。
如果 Credential
物件的使用者 ID 與裝置上已登入的 Google 帳戶使用者 ID 相符,就可以使用 ID 權杖。
如要使用 ID 權杖登入,請先使用 getIdTokens
方法擷取 ID 權杖。接著,將 ID 憑證傳送至應用程式的後端。在後端使用 Google API 用戶端程式庫或一般用途 JWT 程式庫驗證權杖。
事前準備
- 應用程式必須能夠成功擷取使用者憑證或擷取登入提示。
- 建構
CredentialRequest
和HintRequest
物件時,您必須呼叫setAccountTypes(IdentityProviders.GOOGLE)
。
從憑證物件取得 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 權杖之後,您必須驗證權杖的簽名,並驗證權杖的 aud
、iss
和 exp
憑證附加資訊。
密碼專用 Smart Lock 所發出 ID 權杖的 aud
憑證附加資訊格式如下:
android://SHA512_HASH@ANDROID_PACKAGE_NAME
SHA512HASH 值是簽署憑證的 SHA-512 雜湊。您可以使用 keytool
和 openssl
公用程式取得此值:
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 登入說明文件。