Инициируйте привязку аккаунта Google прямо со своей платформы.

Связывание учетной записи можно выполнить непосредственно в мобильном приложении, что позволит вашим пользователям связать свою учетную запись в вашем сервисе со своей учетной записью Google. Установленная ссылка предоставляет Google доступ к данным, которыми пользователь соглашается поделиться.

Этот подход повышает производительность привязки учетных записей, привлекая пользователей в знакомом контексте вашего приложения, а не в разговоре с Ассистентом. Его можно интегрировать в регистрацию пользователей, настройки и другие поверхности приложения, создавая возможности для обнаружения и использования вашего действия Google Assistant. Например, после связывания вы можете предложить пользователю сразу перейти к вашему действию.

Преимущества для пользователей включают в себя:

  • Пользователи могут начать и завершить процесс связывания учетных записей в вашем приложении, среде, с которой они уже знакомы.
  • Пользователям не требуются учетные данные для входа, поскольку они уже прошли аутентификацию на устройстве и в вашем мобильном приложении.

К преимуществам для разработчиков относятся:

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

Как это работает

Ссылка с вашей платформы создается в следующие шаги:

  1. Пользователь нажмет/переключит триггер ссылки в вашем мобильном приложении.
  2. Пользователь выбирает учетную запись Google для привязки.
    1. Пользователь выбирает существующую учетную запись Google на устройстве для привязки или входит в систему с помощью новой учетной записи.
  3. Пользователю показывается размещенный Google экран согласия, на котором он должен согласиться продолжить или отменить процесс связывания.
  4. Пользователю будет показан экран вашего согласия, на котором он должен будет согласиться продолжить или отменить процесс связывания.
  5. Связь устанавливается между учетной записью пользователя на вашем сервисе и его учетной записью Google.

Рисунок 1. Ссылка с вашей платформы.

Требования

Для внедрения Link на вашей платформе вам необходимо следующее:

Настраивать

Прежде чем приступить к выполнению следующих шагов, вам необходимо завершить процесс регистрации привязки аккаунта.

Настройте среду разработки

Получите новейшие сервисы Google Play на своем хосте разработки:

  1. Откройте Android SDK Manager .
  1. В разделе «Инструменты SDK» найдите «Сервисы Google Play» .

  2. Если статус этих пакетов не установлен, выберите их оба и нажмите Установить пакеты .

Настройте свое приложение

  1. В файле build.gradle уровня проекта включите репозиторий Maven от Google в разделы buildscript и allprojects .

    buildscript {
        repositories {
            google()
        }
    }
    
    allprojects {
        repositories {
            google()
        }
    }
    
  2. Добавьте зависимости для API «Связать с Google» в файл Gradle уровня приложения вашего модуля, который обычно называется app/build.gradle :

    dependencies {
      implementation 'com.google.android.gms:play-services-auth:21.4.0'
    }
    

Ссылка из потока вашей платформы приведет к тому, что токен доступа, предоставленный вашим сервисом, будет сохранен Google. Согласие должно быть получено до возврата токена для пользователя.

Выполните следующие действия, чтобы получить согласие пользователя и вернуть токен кода аутентификации через Google Play Services SDK.

  1. Создайте 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();
    
  2. Создайте соответствующее действие для обработки намерения согласия.

    Котлин

      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() вызываются, если пользователь принимает или отклоняет/отменяет ваше согласие соответственно.

  3. Создайте запрос на сохранение токена и, среди прочих параметров конфигурации, передайте 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.

Ссылка

Справочная документация по API аутентификации Android