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