ユーザーの認証情報を取得するかログインヒントを取得したら、認証情報で 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 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 ログインのドキュメントをご覧ください。