ID トークンを使用してログインする

ユーザーの認証情報を取得するかログインヒントを取得したら、認証情報で ID トークンが使用可能かどうかを確認できます。ID トークンはユーザー ID の署名付きアサーションです。これには、ユーザーの基本的なプロフィール情報(Google によって確認済みのメールアドレスなど)も含まれます。ID トークンがある場合は、それを使用してアプリのバックエンドで安全に認証したり、新しいアカウントを作成するときにメール確認の手順をスキップしたりできます。

ID トークンは、Credential オブジェクトのユーザー ID が、デバイスにログインしている Google アカウントのユーザー ID と一致すると利用できます。

ID トークンを使用してログインするには、まず getIdTokens メソッドを使用して ID トークンを取得します。次に、ID トークンをアプリのバックエンドに送信します。バックエンドで、Google API クライアント ライブラリまたは汎用 JWT ライブラリを使用してトークンを検証します。

始める前に

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 トークンを受信したら、トークンの署名と、トークンの audissexp のクレームを検証する必要があります。

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 ログインのドキュメントをご覧ください。