Связывание учетной записи можно выполнить непосредственно в мобильном приложении, что позволит вашим пользователям связать свою учетную запись в вашем сервисе со своей учетной записью Google. Установленная ссылка предоставляет Google доступ к данным, которыми пользователь соглашается поделиться.
Этот подход повышает производительность привязки учетных записей, привлекая пользователей в знакомом контексте вашего приложения, а не в разговоре с Ассистентом. Его можно интегрировать в регистрацию пользователей, настройки и другие поверхности приложения, создавая возможности для обнаружения и использования вашего действия Google Assistant. Например, после связывания вы можете предложить пользователю сразу перейти к вашему действию.
Преимущества для пользователей включают в себя:
- Пользователи могут начать и завершить процесс связывания учетных записей в вашем приложении, среде, с которой они уже знакомы.
- Пользователям не требуются учетные данные для входа, поскольку они уже прошли аутентификацию на устройстве и в вашем мобильном приложении.
К преимуществам для разработчиков относятся:
- Контролируйте, где рекламировать и инициировать привязку учетной записи в вашем мобильном приложении, например, в настройках пользователя, в межстраничных объявлениях или после того, как пользователь войдет в ваше мобильное приложение. Добавление нескольких точек входа для инициирования связывания учетных записей помогает сделать связывание учетных записей более заметным, что приводит к увеличению вовлеченности и увеличению количества связанных учетных записей.
- Повышение коэффициента конверсии, поскольку пользователи могут завершить процесс связывания за меньшее количество шагов, чем стандартный веб-процесс OAuth .
- Для реализации Link с вашей платформы (Android) требуются небольшие инженерные усилия, поскольку этот процесс использует вашу существующую реализацию OAuth2.0, при условии, что она у вас уже реализована.
- Снижение количества отказов, поскольку пользователям не нужно повторно вводить свои учетные данные для входа, и они могут завершить процесс за меньшее количество шагов. Процент отказов может достигать 80 % в потоках, где пользователям необходимо вспомнить и ввести свои учетные данные для входа.
Как это работает
Ссылка с вашей платформы создается в следующие этапы:
- Пользователь будет нажимать/переключать триггер ссылки в вашем мобильном приложении.
- Пользователь выбирает учетную запись Google для привязки.
- Пользователь выбирает существующую учетную запись Google на устройстве для привязки или входит в систему с новой учетной записью.
- Пользователю отображается экран согласия, размещенный на сервере Google, и он должен согласиться, чтобы продолжить, или отменить согласие, чтобы остановить процесс привязки.
- Пользователю отображается экран согласия, и он должен согласиться, чтобы продолжить, или отменить согласие, чтобы остановить процесс привязки.
- Связь устанавливается между учетной записью пользователя в вашем сервисе и его учетной записью Google.

Рисунок 1. Ссылка из вашей платформы.
Требования
Для внедрения Link на вашей платформе вам потребуется следующее:
- Приложение для Android.
- Владение, управление и обслуживание сервера OAuth 2.0, поддерживающего поток авторизационного кода OAuth 2.0.
Настраивать
Прежде чем приступить к выполнению описанных ниже шагов, необходимо завершить процесс регистрации для привязки учетной записи.
Настройте среду разработки.
Установите новейшие сервисы Google Play на свой сервер разработки:
- Откройте менеджер Android SDK .
В разделе «Инструменты SDK» найдите «Сервисы Google Play» .
Если статус этих пакетов не «Установлено», выберите оба пакета и нажмите «Установить пакеты» .
Настройте свое приложение
В файле
build.gradleна уровне проекта добавьте репозиторий Maven от Google как в разделbuildscript, так и в разделallprojects.buildscript { repositories { google() } } allprojects { repositories { google() } }Добавьте зависимости для API «Link with Google» в файл gradle вашего модуля, обычно это
app/build.gradle:dependencies { implementation 'com.google.android.gms:play-services-auth:21.5.1' }
Добавьте поддержку ссылки с вашей платформы.
В результате перехода по ссылке с вашей платформы Google сохранит предоставленный вашим сервисом токен доступа. Перед возвратом токена пользователю необходимо получить его согласие.
Выполните следующие шаги, чтобы получить согласие пользователя и вернуть токен авторизации через SDK Google Play Services.
Создайте объект PendingIntent , который сможет запустить процесс получения согласия. Инициализация согласия осуществляется через API Play Services. Вам потребуется предоставить
PendingIntent(для ясности будем называть егоconsentPendingIntent) при вызове API.Котлин
// Build a PendingIntent that can launch the consent activity val consentPendingIntent = buildConsentPendingIntent()Java
// Build a PendingIntent that can launch your consent activity PendingIntent consentPendingIntent = buildConsentPendingIntent();Создайте соответствующее действие для обработки намерения согласия.
Котлин
class ConsentActivity : AppCompatActivity private fun onConsentAccepted() { // Obtain a token (for simplicity, we’ll ignore the async nature // of the following call) val token = getToken() val intent = Intent() .putExtra(SaveAccountLinkingTokenRequest.EXTRA_TOKEN, token) setResult(Activity.RESULT_OK, intent) finish() } private fun onConsentRejectedOrCanceled() { setResult(Activity.RESULT_CANCELED) finish() }Java
public class ConsentActivity extends AppCompatActivity { ... private void onConsentAccepted() { // Obtain a token (for simplicity, we’ll ignore the async nature of // the following call String token = getToken(); Intent intent = new Intent(); intent.putExtra(SaveAccountLinkingTokenRequest.EXTRA_TOKEN, token); setResult(Activity.RESULT_OK, intent); finish(); } private void onConsentRejectedOrCanceled() { setResult(Activity.RESULT_CANCELED, null); finish(); } }Мы предполагаем, что методы
onConsentAccpeted()иonConsentRejectedOrCanceled()вызываются, если пользователь принимает или отклоняет/отменяет ваше согласие, соответственно.Создайте запрос на сохранение токена и, помимо прочих параметров конфигурации, передайте объект
PendingIntent, созданный на шаге 1 выше.Котлин
// Create an ActivityResultLauncher which registers a callback for the // Activity result contract val activityResultLauncher = registerForActivityResult( ActivityResultContracts.StartIntentSenderForResult()) { result -> if (result.resultCode == RESULT_OK) { // Successfully finished the flow and saved the token } else { // Flow failed, for example the user may have canceled the flow } } // Build token save request val request = SaveAccountLinkingTokenRequest.builder() .setTokenType(SaveAccountLinkingTokenRequest.TOKEN_TYPE_AUTH_CODE) .setConsentPendingIntent(consentPendingIntent) .setServiceId("service-id-of-and-defined-by-developer") //Set the scopes that the token is valid for on your platform .setScopes(scopes) .build() // Launch consent activity and retrieve token Identity.getCredentialSavingClient(this) .saveAccountLinkingToken(request) .addOnSuccessListener( saveAccountLinkingTokenResult -> { if (saveAccountLinkingTokenResult.hasResolution()) { val pendingIntent = saveAccountLinkingTokenResult .getPendingIntent() val intentSenderRequest = IntentSenderRequest .Builder(pendingIntent).build() activityResultLauncher.launch(intentSenderRequest) } else { // This should not happen, let’s log this Log.e(TAG, "Failed to save token"); } }) .addOnFailureListener(e -> Log.e(TAG, “Failed to save token”, e))Java
// Create an ActivityResultLauncher which registers a callback for the // Activity result contract ActivityResultLauncher<IntentSenderRequest> activityResultLauncher = registerForActivityResult(new ActivityResultContracts .StartIntentSenderForResult(), result -> { if (result.getResultCode() == RESULT_OK) { // Successfully finished the flow and saved the token } else { // Flow failed, for example the user may have canceled the flow } }); // Build token save request SaveAccountLinkingTokenRequest request = SaveAccountLinkingTokenRequest.builder() .setTokenType( SaveAccountLinkingTokenRequest.TOKEN_TYPE_AUTH_CODE) .setConsentPendingIntent(consentPendingIntent) .setServiceId("service-id-of-and-defined-by-developer") //Set the scopes that the token is valid for on your platform .setScopes(scopes) .build(); // Launch consent activity and retrieve token Identity.getCredentialSavingClient(this) .saveAccountLinkingToken(request) .addOnSuccessListener( saveAccountLinkingTokenResult -> { if (saveAccountLinkingTokenResult.hasResolution()) { // Launch the resolution intent PendingIntent pendingIntent = saveAccountLinkingTokenResult.getPendingIntent(); IntentSenderRequest intentSenderRequest = new IntentSenderRequest.Builder(pendingIntent).build(); activityResultLauncher.launch(intentSenderRequest); } else { // This should not happen, let’s log this Log.e(TAG, "Failed to save token"); } }) .addOnFailureListener(e -> Log.e(TAG, "Failed to save token", e)); ```
Вышеописанная процедура запрашивает у пользователя согласие и возвращает код авторизации в Google.
Передовые методы
В вашем приложении статус ссылки должен отображаться пользователю с помощью кнопки, переключателя или аналогичного визуального элемента.

Рисунок 1. Пример изображения состояния соединения.
После успешного перехода по ссылке необходимо уведомить пользователя, например, отобразить всплывающее сообщение, инициировать изменение состояния переключателя или перенаправить пользователя на отдельную страницу подтверждения успешного перехода.
Вам следует рассмотреть возможность предложить пользователям приложения связать учетные записи, в идеале, исходя из убедительных признаков того, что это принесет пользу таким пользователям.
После успешного связывания следует показать пользователям пример того, что нужно делать с привязанным аккаунтом, например, если вы только что подключили сервис потоковой передачи музыки, попросите Google Ассистента воспроизвести музыку.
Предоставьте пользователям возможность управлять своими связанными учетными записями, включая возможность их отсоединения . Направьте их на страницу управления связанными учетными записями Google, а именно: https://myaccount.google.com/accountlinking.