Функция «Вход через Google» поможет вам быстро интегрировать аутентификацию пользователей в ваше приложение Android. Пользователи могут использовать свои учётные записи Google для входа в приложение, предоставления согласия и безопасного обмена данными своего профиля с вашим приложением. Библиотека Credential Manager Jetpack для Android упрощает эту интеграцию, обеспечивая единообразный интерфейс на всех устройствах Android с помощью единого API.
В этом документе описывается, как реализовать функцию «Войти через Google» в приложениях Android, настроить пользовательский интерфейс кнопки «Войти через Google» и настроить оптимизированные для приложения процессы регистрации и входа в одно касание. Для плавной миграции между устройствами функция «Войти через Google» поддерживает автоматический вход, а её кроссплатформенность для Android, iOS и веб-платформ позволяет обеспечить доступ для входа в приложение на любом устройстве. Если вы используете аутентификацию Firebase в своём приложении, подробнее об интеграции функции «Войти через Google» и Credential Manager см. в руководстве «Аутентификация через Google на Android» .
Чтобы настроить вход через Google, выполните следующие два основных шага:
Настройте вход через Google в качестве опции для нижнего интерфейса Credential Manager . Его можно настроить так, чтобы автоматически предлагать пользователю войти в систему. Если вы используете ключи доступа или пароли , вы можете запрашивать все необходимые типы учётных данных одновременно, чтобы пользователю не приходилось запоминать, какой вариант входа он использовал ранее.

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

В этом документе объясняется, как интегрировать кнопку «Войти через Google» и диалоговое окно нижней панели с API диспетчера учетных данных с помощью вспомогательной библиотеки Google ID .
Настройте свой проект
- Откройте свой проект в или создайте проект, если у вас его еще нет.
- На , убедитесь, что вся информация является полной и точной.
- Убедитесь, что вашему приложению назначены правильное название, логотип и домашняя страница. Эти значения будут отображаться пользователям на экране согласия «Войти через Google» при регистрации и на экране «Сторонние приложения и сервисы» .
- Убедитесь, что вы указали URL-адреса политики конфиденциальности и условий обслуживания вашего приложения.
- В Создайте идентификатор клиента Android для своего приложения, если у вас его ещё нет. Вам потребуется указать имя пакета приложения и подпись SHA-1.
- В Создайте новый идентификатор клиента «Веб-приложение», если вы ещё этого не сделали. Поля «Авторизованные источники JavaScript» и «Авторизованные URI перенаправления» пока можно игнорировать. Этот идентификатор клиента будет использоваться для идентификации вашего внутреннего сервера при взаимодействии со службами аутентификации Google.
Объявить зависимости
В файле build.gradle вашего модуля объявите зависимости, используя последнюю версию Credential Manager :
dependencies {
// ... other dependencies
implementation "androidx.credentials:credentials:<latest version>"
implementation "androidx.credentials:credentials-play-services-auth:<latest version>"
implementation "com.google.android.libraries.identity.googleid:googleid:<latest version>"
}
Создайте запрос на вход в Google
Чтобы начать реализацию, создайте запрос на вход в Google . Используйте GetGoogleIdOption
для получения токена Google ID пользователя.
val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
.setFilterByAuthorizedAccounts(true)
.setServerClientId(WEB_CLIENT_ID)
.setAutoSelectEnabled(true)
// nonce string to use when generating a Google ID token
.setNonce(nonce)
.build()
Сначала проверьте, есть ли у пользователя учётные записи, которые ранее использовались для входа в ваше приложение, вызвав API с параметром setFilterByAuthorizedAccounts
, установленным в значение true
. Пользователи могут выбирать между доступными учётными записями для входа.
Если авторизованных учётных записей Google нет, пользователю следует предложить зарегистрироваться с помощью любой из доступных учётных записей. Для этого нужно повторно вызвать API и установить для параметра setFilterByAuthorizedAccounts
значение false
. Подробнее о регистрации читайте здесь .
Включить автоматический вход для вернувшихся пользователей (рекомендуется)
Разработчикам следует включить автоматический вход для пользователей, регистрирующихся с помощью единой учётной записи. Это обеспечит бесперебойную работу на всех устройствах, особенно при миграции, когда пользователи могут быстро восстановить доступ к своей учётной записи без повторного ввода учётных данных. Для ваших пользователей это избавит от ненужных сложностей, если они уже вошли в систему.
Чтобы включить автоматический вход, используйте setAutoSelectEnabled(true)
. Автоматический вход возможен только при соблюдении следующих условий:
- Запросу соответствуют одни учетные данные, которые могут быть учетной записью Google или паролем, и эти данные соответствуют учетной записи по умолчанию на устройстве Android.
- Пользователь явно не вышел из системы.
- Пользователь не отключил автоматический вход в настройках своего аккаунта Google .
val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
.setFilterByAuthorizedAccounts(true)
.setServerClientId(WEB_CLIENT_ID)
.setAutoSelectEnabled(true)
// nonce string to use when generating a Google ID token
.setNonce(nonce)
.build()
Не забывайте правильно обрабатывать выход из системы при реализации автоматического входа, чтобы пользователи всегда могли выбрать нужную учетную запись после явного выхода из вашего приложения.
Установите одноразовый код для повышения безопасности
Чтобы повысить безопасность входа и предотвратить атаки с повторным воспроизведением, добавьте setNonce
, чтобы включить одноразовый код в каждый запрос. Подробнее о создании одноразового кода .
val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
.setFilterByAuthorizedAccounts(true)
.setServerClientId(WEB_CLIENT_ID)
.setAutoSelectEnabled(true)
// nonce string to use when generating a Google ID token
.setNonce(nonce)
.build()
Создайте поток «Войти через Google»
Чтобы настроить вход через Google, выполните следующие действия:
- Создайте экземпляр
GetCredentialRequest
, затем добавьте ранее созданныйgoogleIdOption
с помощьюaddCredentialOption()
для получения учетных данных. - Передайте этот запрос вызову
getCredential()
(Kotlin) илиgetCredentialAsync()
(Java), чтобы получить доступные учетные данные пользователя. - После успешного выполнения API извлеките
CustomCredential
, содержащий результат для данныхGoogleIdTokenCredential
. - Тип
CustomCredential
должен быть равен значениюGoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL
. Преобразуйте объект вGoogleIdTokenCredential
с помощью методаGoogleIdTokenCredential.createFrom
. Если преобразование прошло успешно, извлеките идентификатор
GoogleIdTokenCredential
, проверьте его и аутентифицируйте учетные данные на своем сервере.Если преобразование завершается ошибкой
GoogleIdTokenParsingException
, возможно, вам придется обновить версию библиотеки «Войти через Google» .Отслеживайте любые нераспознанные пользовательские типы учетных данных.
val request: GetCredentialRequest = GetCredentialRequest.Builder()
.addCredentialOption(googleIdOption)
.build()
coroutineScope {
try {
val result = credentialManager.getCredential(
request = request,
context = activityContext,
)
handleSignIn(result)
} catch (e: GetCredentialException) {
// Handle failure
}
}
fun handleSignIn(result: GetCredentialResponse) {
// Handle the successfully returned credential.
val credential = result.credential
val responseJson: String
when (credential) {
// Passkey credential
is PublicKeyCredential -> {
// Share responseJson such as a GetCredentialResponse to your server to validate and
// authenticate
responseJson = credential.authenticationResponseJson
}
// Password credential
is PasswordCredential -> {
// Send ID and password to your server to validate and authenticate.
val username = credential.id
val password = credential.password
}
// GoogleIdToken credential
is CustomCredential -> {
if (credential.type == GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL) {
try {
// Use googleIdTokenCredential and extract the ID to validate and
// authenticate on your server.
val googleIdTokenCredential = GoogleIdTokenCredential
.createFrom(credential.data)
// You can use the members of googleIdTokenCredential directly for UX
// purposes, but don't use them to store or control access to user
// data. For that you first need to validate the token:
// pass googleIdTokenCredential.getIdToken() to the backend server.
// see [validation instructions](https://developers.google.com/identity/gsi/web/guides/verify-google-id-token)
} catch (e: GoogleIdTokenParsingException) {
Log.e(TAG, "Received an invalid google id token response", e)
}
} else {
// Catch any unrecognized custom credential type here.
Log.e(TAG, "Unexpected type of credential")
}
}
else -> {
// Catch any unrecognized credential type here.
Log.e(TAG, "Unexpected type of credential")
}
}
}
Активировать кнопку «Войти через Google»
Чтобы активировать кнопку «Войти через Google», используйте GetSignInWithGoogleOption
вместо GetGoogleIdOption
:
val signInWithGoogleOption: GetSignInWithGoogleOption = GetSignInWithGoogleOption.Builder(
serverClientId = WEB_CLIENT_ID
).setNonce(nonce)
.build()
Обработайте возвращенный GoogleIdTokenCredential
, как описано в следующем примере кода.
fun handleSignInWithGoogleOption(result: GetCredentialResponse) {
// Handle the successfully returned credential.
val credential = result.credential
when (credential) {
is CustomCredential -> {
if (credential.type == GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL) {
try {
// Use googleIdTokenCredential and extract id to validate and
// authenticate on your server.
val googleIdTokenCredential = GoogleIdTokenCredential
.createFrom(credential.data)
} catch (e: GoogleIdTokenParsingException) {
Log.e(TAG, "Received an invalid google id token response", e)
}
}
else {
// Catch any unrecognized credential type here.
Log.e(TAG, "Unexpected type of credential")
}
}
else -> {
// Catch any unrecognized credential type here.
Log.e(TAG, "Unexpected type of credential")
}
}
}
После создания запроса на вход через Google запустите процесс аутентификации аналогично тому, как описано в разделе «Вход через Google» .
Включить регистрацию новых пользователей (рекомендуется)
Вход через Google — это самый простой способ для пользователей создать новую учетную запись в вашем приложении или сервисе всего за несколько нажатий.
Если сохранённые учётные данные не найдены (нет учётных записей Google, возвращаемых getGoogleIdOption
), предложите пользователю зарегистрироваться. Сначала проверьте, задано ли значение setFilterByAuthorizedAccounts(true)
чтобы узнать, существуют ли ранее использованные учётные записи. Если ничего не найдено, предложите пользователю зарегистрироваться, используя учётную запись Google, используя setFilterByAuthorizedAccounts(false)
Пример:
val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
.setFilterByAuthorizedAccounts(false)
.setServerClientId(WEB_CLIENT_ID)
.build()
После создания запроса на регистрацию через Google запустите процесс аутентификации. Если пользователи не хотят использовать функцию «Войти через Google» для регистрации, рассмотрите возможность оптимизации приложения для автозаполнения . После того, как пользователь создаст учётную запись, рассмотрите возможность регистрации его паролей в качестве последнего шага к её созданию.
Выйти из системы
Когда пользователь выходит из вашего приложения, вызовите метод API clearCredentialState()
, чтобы очистить текущее состояние учётных данных пользователя от всех поставщиков учётных данных. Это уведомит всех поставщиков учётных данных о необходимости очистки всех сохранённых сеансов учётных данных для данного приложения.
Поставщик учётных данных мог сохранить активный сеанс учётных данных и использовать его для ограничения вариантов входа в будущих вызовах get-credential. Например, он может отдать приоритет активным учётным данным по сравнению с любыми другими доступными учётными данными. Когда пользователь явно выходит из приложения, чтобы получить полный набор вариантов входа в следующий раз, необходимо вызвать этот API, чтобы поставщик мог очистить любой сохранённый сеанс учётных данных.