Войти, используя идентификационные токены

После успешного получения учётных данных пользователя или подсказок для входа вы можете проверить наличие идентификационного токена для этих учётных данных. Идентификационный токен — это подписанное подтверждение личности пользователя, которое также содержит основную информацию профиля пользователя, возможно, включая адрес электронной почты, проверенный Google. Доступные идентификационные токены можно использовать для безопасной аутентификации в бэкенде вашего приложения или для пропуска этапа подтверждения адреса электронной почты при создании новой учётной записи.

Идентификационный токен доступен, когда идентификатор пользователя объекта Credential совпадает с идентификатором пользователя учетной записи Google, в которую выполнен вход на устройстве.

Чтобы войти с помощью токена ID, сначала получите его с помощью метода getIdTokens . Затем отправьте токен ID на серверную часть приложения. На серверной части проверьте токен, используя клиентскую библиотеку Google API или универсальную библиотеку JWT.

Прежде чем начать

Получить идентификационный токен из объекта Credentials

После получения учётных данных пользователя проверьте, содержит ли объект Credentials токен идентификатора. Если да, вызовите 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 необходимо проверить подпись токена, а также проверить утверждения aud , iss и exp токена.

Заявление aud идентификатора токена от Smart Lock for Passwords имеет следующий формат:

android://SHA512_HASH@ANDROID_PACKAGE_NAME

Значение SHA512 HASH — это хеш SHA-512 вашего сертификата подписи. Вы можете получить это значение с помощью утилит keytool и openssl :

keytool -exportcert -keystore path-to-keystore -alias key-name 
| openssl sha -sha512 -binary
| base64 -w 0
| tr '+/' '-'

Или вы можете получить хэш SHA-512, проверив токен ID, который, как вы знаете, является действительным.

Библиотеки JWT могут выполнить некоторые из этих задач проверки автоматически. Например, используйте библиотеку Google Auth Library для Java :

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 .