ユーザーの認証情報を取得するか、ログイン ヒントを取得したら、認証情報で ID トークンが利用可能かどうかを確認できます。ID トークンは、ユーザーの ID の署名付きアサーションです。ユーザーの基本的なプロフィール情報も含まれており、Google によって確認されたメールアドレスが含まれている場合もあります。ID トークンが利用可能な場合、それを使用してアプリのバックエンドで安全に認証したり、新しいアカウントを作成する際にメール確認の手順をスキップしたりできます。
ID トークンは、Credential
オブジェクトのユーザー ID がデバイスにログインしている Google アカウントのユーザー 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 for Passwords の 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 認証ライブラリを使用する場合:
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 ログインのドキュメントをご覧ください。