Связывание учетной записи можно выполнить непосредственно в мобильном приложении, что позволит вашим пользователям связать свою учетную запись в вашем сервисе со своей учетной записью 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 Tools найдите Сервисы Google Play.
Если статус этих пакетов не "Установлено", выберите их и нажмите Установить пакеты.
Настройка приложения
В файле
build.gradleна уровне проекта добавьте репозиторий Maven от Google в разделыbuildscriptиallprojects.buildscript { repositories { google() } } allprojects { repositories { google() } }Добавьте зависимости для Link with Google API в файл Gradle на уровне приложения (обычно это
app/build.gradle):dependencies { implementation 'com.google.android.gms:play-services-auth:22.0.0' }
Как добавить поддержку Link на платформу
В результате связывания аккаунтов на вашей платформе Google сохранит токен доступа, предоставленный вашим сервисом. Прежде чем возвращать токен пользователя, необходимо получить согласие.
Чтобы получить согласие пользователя и вернуть токен кода авторизации через SDK сервисов Google Play, выполните описанные ниже действия.
Создайте объект PendingIntent, который может запустить действие согласия. Оно запускается с помощью API сервисов Google Play. При вызове API необходимо указать
PendingIntent(во избежание неясности будем называть егоconsentPendingIntent).Kotlin
// 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();Создайте соответствующий Activity для обработки интента согласия
Kotlin
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.Kotlin
// 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.