Связывание учетной записи можно выполнить непосредственно в мобильном приложении, что позволит вашим пользователям связать свою учетную запись в вашем сервисе со своей учетной записью 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 Manager .
В разделе «Инструменты SDK» найдите сервисы Google Play .
Если статус этих пакетов не «Установлен», выберите их оба и нажмите « Установить пакеты» .
Настройте свое приложение
В файле
build.gradle
уровня проекта включите репозиторий Google Maven как в разделы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.3.0' }
Добавьте поддержку Link с вашей платформы
Ссылка из потока вашей платформы приведет к тому, что токен доступа, предоставленный вашей службой, будет сохранен Google. Согласие должно быть получено до возврата токена пользователю.
Выполните следующие действия, чтобы получить согласие пользователя и вернуть токен кода аутентификации через SDK сервисов Google Play.
Создайте PendingIntent , который может запустить действие вашего согласия. Согласие запускается API-интерфейсом Play Services. Вам нужно будет предоставить
PendingIntent
(который для ясности будет называтьсяconsentPendingIntent
) при вызове API.// Build a PendingIntent that can launch the consent activity val consentPendingIntent = buildConsentPendingIntent()
// 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() }
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))
// 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 Assistant воспроизвести музыку.
Предоставьте пользователям возможность управлять своими связанными учетными записями, включая возможность отсоединить их. Направьте их на страницу управления связанными аккаунтами Google, то есть https://myaccount.google.com/accountlinking.