成功擷取使用者的憑證或擷取登入提示後,即可檢查憑證是否有 ID 權杖。ID 權杖是使用者身分的簽署聲明,也包含使用者的基本個人資料資訊,可能包括 Google 驗證過的電子郵件地址。取得 ID 權杖後,您可以使用這些權杖安全地向應用程式後端進行驗證,或在建立新帳戶時略過電子郵件驗證步驟。
如果 Credential
物件的使用者 ID 與裝置上登入的 Google 帳戶使用者 ID 相符,系統就會提供 ID 權杖。
如要使用 ID 權杖登入,請先使用 getIdTokens
方法擷取 ID 權杖。然後將 ID 權杖傳送至應用程式後端。在後端,使用 Google API 用戶端程式庫或一般用途的 JWT 程式庫驗證權杖。
事前準備
- 您的應用程式必須能夠成功擷取使用者的憑證或擷取登入提示。
- 建構
CredentialRequest
和HintRequest
物件時,您必須呼叫setAccountTypes(IdentityProviders.GOOGLE)
。
從 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 權杖後,您必須驗證權杖的簽章,並驗證權杖的 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 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 登入說明文件。