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