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 認証ライブラリを使用する場合:

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