После успешного получения учётных данных пользователя или подсказок для входа вы можете проверить наличие идентификационного токена для этих учётных данных. Идентификационный токен — это подписанное подтверждение личности пользователя, которое также содержит основную информацию профиля пользователя, возможно, включая адрес электронной почты, проверенный Google. Доступные идентификационные токены можно использовать для безопасной аутентификации в бэкенде вашего приложения или для пропуска этапа подтверждения адреса электронной почты при создании новой учётной записи.
Идентификационный токен доступен, когда идентификатор пользователя объекта Credential
совпадает с идентификатором пользователя учетной записи Google, в которую выполнен вход на устройстве.
Чтобы войти с помощью токена ID, сначала получите его с помощью метода getIdTokens
. Затем отправьте токен ID на серверную часть приложения. На серверной части проверьте токен, используя клиентскую библиотеку Google API или универсальную библиотеку JWT.
Прежде чем начать
- Ваше приложение должно иметь возможность успешно извлекать учетные данные пользователя или получать подсказку для входа .
- При создании объектов
CredentialRequest
иHintRequest
необходимо вызватьsetAccountTypes(IdentityProviders.GOOGLE)
.
Получить идентификационный токен из объекта 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 .