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

<ph type="x-smartling-placeholder">

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

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

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

始める前に

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 トークンを受け取ったら、トークンの 署名を行い、トークンの 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 '+/' '-
'

<ph type="x-smartling-placeholder"></ph>

または、有効であることがわかっている 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 ログインに関するドキュメントをご覧ください をご覧ください。