Инициируйте привязку аккаунта 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 .
  1. В разделе «Инструменты SDK» найдите сервисы Google Play .

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

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

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

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

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

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

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

  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