Как выполнить аутентификацию с помощью Yahoo на устройстве Android

Вы можете разрешить пользователям проходить аутентификацию в Firebase с помощью поставщиков OAuth, таких как Yahoo. Для этого интегрируйте в приложение универсальный вход через OAuth на основе веб-технологий, используя Firebase SDK для выполнения всего процесса входа.

Подготовка

Чтобы пользователи могли входить в аккаунт с помощью Yahoo, сначала включите Yahoo в качестве поставщика услуг входа для проекта Firebase:

  1. Добавьте Firebase в проект для Android.

  2. В консоли Firebase выберите Безопасность > Аутентификация.
  3. На вкладке Способ входа включите поставщика для входа через Yahoo.
  4. Добавьте идентификатор клиента и секретный код клиента из консоли разработчика поставщика в конфигурацию поставщика:
    1. Чтобы зарегистрировать клиент OAuth Yahoo, следуйте инструкциям в документации для разработчиков Yahoo о том, как зарегистрировать веб-приложение в Yahoo.

      Выберите два разрешения OpenID Connect API:profile и email.

    2. При регистрации приложений у этих поставщиков обязательно укажите домен *.firebaseapp.com для своего проекта в качестве домена переадресации для приложения.
  5. Нажмите Сохранить.
  6. Укажите цифровой отпечаток SHA-1 приложения, если вы ещё этого не сделали.

    1. В консоли Firebase перейдите на вкладку Настройки > Общие.

    2. Прокрутите страницу вниз до карточки Ваши приложения, выберите приложение Android и добавьте цифровой отпечаток SHA-1 в поле Цифровые отпечатки сертификата SHA.

    О том, как получить цифровой отпечаток SHA приложения, можно прочитать в разделе об аутентификации клиентов.

Как обрабатывать процесс входа с помощью Firebase SDK

Если вы разрабатываете приложение для Android, самый простой способ аутентификации пользователей в Firebase с помощью аккаунтов Yahoo – реализовать весь процесс входа с помощью Firebase Android SDK.

Чтобы реализовать процесс входа с помощью Firebase Android SDK, выполните следующие действия:

  1. Создайте экземпляр OAuthProvider, используя его Builder с идентификатором поставщика yahoo.com.

    Kotlin

    val provider = OAuthProvider.newBuilder("yahoo.com")

    Java

    OAuthProvider.Builder provider = OAuthProvider.newBuilder("yahoo.com");

  2. Необязательно. Укажите дополнительные специальные параметры OAuth, которые вы хотите отправить с запросом OAuth.

    Kotlin

    // Prompt user to re-authenticate to Yahoo.
    provider.addCustomParameter("prompt", "login")
    
    // Localize to French.
    provider.addCustomParameter("language", "fr")

    Java

    // Prompt user to re-authenticate to Yahoo.
    provider.addCustomParameter("prompt", "login");
    
    // Localize to French.
    provider.addCustomParameter("language", "fr");

    Информацию о параметрах, поддерживаемых Yahoo, можно найти в документации по Yahoo OAuth. Обратите внимание, что с помощью setCustomParameters() нельзя передавать параметры, обязательные для Firebase. Это параметры client_id, redirect_uri, response_type, scope и state.

  3. Необязательно. Укажите дополнительные области действия OAuth 2.0, помимо profile и email, которые вы хотите запросить у поставщика услуг аутентификации. Если вашему приложению требуется доступ к закрытым пользовательским данным из Yahoo API, вам нужно запросить разрешения для Yahoo API в разделе API Permissions консоли разработчика Yahoo. Запрашиваемые области действия OAuth должны точно соответствовать предварительно настроенным областям в разрешениях API приложения. Например, если приложению требуется доступ на чтение и запись к контактам пользователя и это разрешение предварительно настроено в API приложения, то вместо области действия OAuth sdct-r (только чтение) необходимо передать значение sdct-w. В противном случае процесс будет прерван и конечному пользователю будет показано сообщение об ошибке.

    Kotlin

    // Request read access to a user's email addresses.
    // This must be preconfigured in the app's API permissions.
    provider.scopes = listOf("mail-r", "sdct-w")

    Java

    // Request read access to a user's email addresses.
    // This must be preconfigured in the app's API permissions.
    List<String> scopes =
            new ArrayList<String>() {
                {
                    // Request access to Yahoo Mail API.
                    add("mail-r");
                    // This must be preconfigured in the app's API permissions.
                    add("sdct-w");
                }
            };
    provider.setScopes(scopes);
    Подробнее о запросах Yahoo…

  4. Выполните аутентификацию в Firebase, используя объект поставщика OAuth. Обратите внимание, что в отличие от других операций FirebaseAuth, эта операция будет управлять вашим интерфейсом, открывая специальную вкладку Chrome. Поэтому не ссылайтесь на Activity в OnSuccessListeners и OnFailureListeners, которые вы прикрепляете, поскольку они будут немедленно отключены, когда операция запустит интерфейс.

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

    Чтобы проверить, есть ли ожидающий результат, вызовите функцию getPendingAuthResult:

    Kotlin

    val pendingResultTask = firebaseAuth.pendingAuthResult
    if (pendingResultTask != null) {
        // There's something already here! Finish the sign-in for your user.
        pendingResultTask
            .addOnSuccessListener {
                // User is signed in.
                // IdP data available in
                // authResult.getAdditionalUserInfo().getProfile().
                // The OAuth access token can also be retrieved:
                // ((OAuthCredential)authResult.getCredential()).getAccessToken().
                // The OAuth secret can be retrieved by calling:
                // ((OAuthCredential)authResult.getCredential()).getSecret().
            }
            .addOnFailureListener {
                // Handle failure.
            }
    } else {
        // There's no pending result so you need to start the sign-in flow.
        // See below.
    }

    Java

    Task<AuthResult> pendingResultTask = firebaseAuth.getPendingAuthResult();
    if (pendingResultTask != null) {
        // There's something already here! Finish the sign-in for your user.
        pendingResultTask
                .addOnSuccessListener(
                        new OnSuccessListener<AuthResult>() {
                            @Override
                            public void onSuccess(AuthResult authResult) {
                                // User is signed in.
                                // IdP data available in
                                // authResult.getAdditionalUserInfo().getProfile().
                                // The OAuth access token can also be retrieved:
                                // ((OAuthCredential)authResult.getCredential()).getAccessToken().
                                // The OAuth secret can be retrieved by calling:
                                // ((OAuthCredential)authResult.getCredential()).getSecret().
                            }
                        })
                .addOnFailureListener(
                        new OnFailureListener() {
                            @Override
                            public void onFailure(@NonNull Exception e) {
                                // Handle failure.
                            }
                        });
    } else {
        // There's no pending result so you need to start the sign-in flow.
        // See below.
    }

    Чтобы начать процесс входа, вызовите startActivityForSignInWithProvider:

    Kotlin

    firebaseAuth
        .startActivityForSignInWithProvider(activity, provider.build())
        .addOnSuccessListener {
            // User is signed in.
            // IdP data available in
            // authResult.getAdditionalUserInfo().getProfile().
            // The OAuth access token can also be retrieved:
            // ((OAuthCredential)authResult.getCredential()).getAccessToken().
            // The OAuth secret can be retrieved by calling:
            // ((OAuthCredential)authResult.getCredential()).getSecret().
        }
        .addOnFailureListener {
            // Handle failure.
        }

    Java

    firebaseAuth
            .startActivityForSignInWithProvider(/* activity= */ this, provider.build())
            .addOnSuccessListener(
                    new OnSuccessListener<AuthResult>() {
                        @Override
                        public void onSuccess(AuthResult authResult) {
                            // User is signed in.
                            // IdP data available in
                            // authResult.getAdditionalUserInfo().getProfile().
                            // The OAuth access token can also be retrieved:
                            // ((OAuthCredential)authResult.getCredential()).getAccessToken().
                            // The OAuth secret can be retrieved by calling:
                            // ((OAuthCredential)authResult.getCredential()).getSecret().
                        }
                    })
            .addOnFailureListener(
                    new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                            // Handle failure.
                        }
                    });

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

    С помощью токена доступа OAuth можно вызывать Yahoo API.

    где YAHOO_USER_UID – идентификатор пользователя Yahoo, который можно извлечь из поля firebaseAuth.getCurrentUser().getProviderData().get(0).getUid() или из authResult.getAdditionalUserInfo().getProfile().

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

    Kotlin

    // The user is already signed-in.
    val firebaseUser = firebaseAuth.currentUser!!
    firebaseUser
        .startActivityForLinkWithProvider(activity, provider.build())
        .addOnSuccessListener {
            // Provider credential is linked to the current user.
            // IdP data available in
            // authResult.getAdditionalUserInfo().getProfile().
            // The OAuth access token can also be retrieved:
            // authResult.getCredential().getAccessToken().
            // The OAuth secret can be retrieved by calling:
            // authResult.getCredential().getSecret().
        }
        .addOnFailureListener {
            // Handle failure.
        }

    Java

    // The user is already signed-in.
    FirebaseUser firebaseUser = firebaseAuth.getCurrentUser();
    
    firebaseUser
            .startActivityForLinkWithProvider(/* activity= */ this, provider.build())
            .addOnSuccessListener(
                    new OnSuccessListener<AuthResult>() {
                        @Override
                        public void onSuccess(AuthResult authResult) {
                            // Provider credential is linked to the current user.
                            // IdP data available in
                            // authResult.getAdditionalUserInfo().getProfile().
                            // The OAuth access token can also be retrieved:
                            // authResult.getCredential().getAccessToken().
                            // The OAuth secret can be retrieved by calling:
                            // authResult.getCredential().getSecret().
                        }
                    })
            .addOnFailureListener(
                    new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                            // Handle failure.
                        }
                    });

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

    Kotlin

    // The user is already signed-in.
    val firebaseUser = firebaseAuth.currentUser!!
    firebaseUser
        .startActivityForReauthenticateWithProvider(activity, provider.build())
        .addOnSuccessListener {
            // User is re-authenticated with fresh tokens and
            // should be able to perform sensitive operations
            // like account deletion and email or password
            // update.
        }
        .addOnFailureListener {
            // Handle failure.
        }

    Java

    // The user is already signed-in.
    FirebaseUser firebaseUser = firebaseAuth.getCurrentUser();
    
    firebaseUser
            .startActivityForReauthenticateWithProvider(/* activity= */ this, provider.build())
            .addOnSuccessListener(
                    new OnSuccessListener<AuthResult>() {
                        @Override
                        public void onSuccess(AuthResult authResult) {
                            // User is re-authenticated with fresh tokens and
                            // should be able to perform sensitive operations
                            // like account deletion and email or password
                            // update.
                        }
                    })
            .addOnFailureListener(
                    new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                            // Handle failure.
                        }
                    });

Дальнейшие действия

После первого входа пользователя создается новый аккаунт, связанный с учетными данными, которые он использовал (именем пользователя и паролем, номером телефона или информацией поставщика услуг аутентификации). Этот новый аккаунт хранится в проекте Firebase и позволяет идентифицировать пользователя во всех приложениях проекта независимо от того, как он вошел в аккаунт.

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

  • В Firebase Realtime Database и Cloud Storage правилах безопасности можно получить уникальный идентификатор пользователя, выполнившего вход, из переменной auth и использовать его, чтобы контролировать, к каким данным у пользователя есть доступ.

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

Чтобы выйти из аккаунта пользователя, вызовите функцию signOut:

Kotlin

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();