Аутентификация с помощью Twitter на Android

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

Прежде чем начать

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

  1. Если вы еще этого не сделали, добавьте Firebase в свой проект Android .

  2. В консоли Firebase откройте раздел Auth .
  3. На вкладке «Способ входа» включите провайдера Twitter .
  4. Добавьте ключ API и секрет API из консоли разработчика этого провайдера в конфигурацию провайдера:
    1. Зарегистрируйте свое приложение как приложение разработчика в Twitter и получите ключ API OAuth и секретный ключ API вашего приложения.
    2. Убедитесь, что ваш URI перенаправления Firebase OAuth (например, my-app-12345.firebaseapp.com/__/auth/handler ) установлен в качестве URL-адреса обратного вызова авторизации на странице настроек вашего приложения в конфигурации приложения Twitter .
  5. Нажмите «Сохранить» .
  6. В файле Gradle вашего модуля (уровня приложения) (обычно <project>/<app-module>/build.gradle.kts или <project>/<app-module>/build.gradle ) добавьте зависимость для библиотеки Firebase Authentication для Android. Мы рекомендуем использовать Firebase Android BoM для управления версиями библиотеки.

    dependencies {
        // Import the BoM for the Firebase platform
        implementation(platform("com.google.firebase:firebase-bom:33.14.0"))
    
        // Add the dependency for the Firebase Authentication library
        // When using the BoM, you don't specify versions in Firebase library dependencies
        implementation("com.google.firebase:firebase-auth")
    }

    Благодаря использованию Firebase Android BoM ваше приложение всегда будет использовать совместимые версии библиотек Firebase Android.

    (Альтернатива) Добавьте зависимости библиотеки Firebase без использования BoM

    Если вы решите не использовать Firebase BoM , вам необходимо указать каждую версию библиотеки Firebase в строке ее зависимостей.

    Обратите внимание: если вы используете в своем приложении несколько библиотек Firebase, мы настоятельно рекомендуем использовать BoM для управления версиями библиотек, что гарантирует совместимость всех версий.

    dependencies {
        // Add the dependency for the Firebase Authentication library
        // When NOT using the BoM, you must specify versions in Firebase library dependencies
        implementation("com.google.firebase:firebase-auth:23.2.1")
    }
    Ищете модуль библиотеки, специфичный для Kotlin? Начиная с октября 2023 года ( Firebase BoM 32.5.0) разработчики Kotlin и Java смогут полагаться на основной модуль библиотеки (подробности см. в разделе часто задаваемых вопросов об этой инициативе ).

  7. Если вы еще не указали отпечаток SHA-1 вашего приложения, сделайте это на странице настроек консоли Firebase . Обратитесь к разделу Аутентификация вашего клиента для получения подробной информации о том, как получить отпечаток SHA-1 вашего приложения.

Управляйте процессом входа с помощью Firebase SDK

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

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

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

    Kotlin

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

    Java

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

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

    Kotlin

    // Localize to French.
    provider.addCustomParameter("lang", "fr")

    Java

    // Localize to French.
    provider.addCustomParameter("lang", "fr");

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

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

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

    Чтобы проверить, есть ли ожидающий результат, вызовите 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, вы можете вызывать API Twitter .

    Например, чтобы получить базовую информацию профиля, вы можете вызвать REST API, передав токен доступа в заголовке Authorization :

  4. Хотя приведенные выше примеры фокусируются на потоках входа, у вас также есть возможность связать провайдера Twitter с существующим пользователем с помощью 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.
                        }
                    });

  5. Тот же шаблон можно использовать с 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();