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

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

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

Чтобы войти в систему с помощью токена идентификатора, сначала получите токен идентификатора с помощью метода getIdTokens . Затем отправьте токен идентификатора на серверную часть вашего приложения. На серверной стороне проверьте токен, используя клиентскую библиотеку API Google или библиотеку 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);
    }
}

Проверьте идентификационный токен на серверной стороне.

После получения токена идентификатора по протоколу 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, проверив действительный токен идентификатора.

Библиотеки JWT могут выполнить за вас некоторые из этих задач проверки. Например, используя клиентскую библиотеку Google API для 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 .