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

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

Прежде чем вы начнете

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

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

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

    dependencies {
        // Import the BoM for the Firebase platform
        implementation(platform("com.google.firebase:firebase-bom:32.7.2"))
    
        // 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, вы должны указать каждую версию библиотеки 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:22.3.1")
    }
    
    Ищете библиотечный модуль, специфичный для Kotlin? Начиная с октября 2023 года (Firebase BoM 32.5.0) от основного модуля библиотеки могут зависеть как разработчики Kotlin, так и Java (подробнее см. FAQ по этой инициативе ).

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

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

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

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

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

    Kotlin+KTX

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

    Java

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

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

    Kotlin+KTX

    // Target specific email with login hint.
    provider.addCustomParameter("login", "your-email@gmail.com")

    Java

    // Target specific email with login hint.
    provider.addCustomParameter("login", "your-email@gmail.com");

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

  3. Необязательно : укажите дополнительные области OAuth 2.0 помимо базового профиля, которые вы хотите запросить у поставщика аутентификации. Если вашему приложению требуется доступ к частным данным пользователя из API GitHub, вам потребуется запросить разрешения на доступ к API GitHub в разделе «Разрешения API» в консоли разработчика GitHub. Запрошенные области OAuth должны точно соответствовать предварительно настроенным в разрешениях API приложения.

    Kotlin+KTX

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

    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>() {
                {
                    add("user:email");
                }
            };
    provider.setScopes(scopes);

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

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

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

    Kotlin+KTX

    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+KTX

    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 GitHub .

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

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

    Kotlin+KTX

    // 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+KTX

    // 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 вы можете получить уникальный идентификатор пользователя, вошедшего в систему, из переменной auth и использовать его для управления тем, к каким данным пользователь может получить доступ.

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

Чтобы выйти из системы, вызовите signOut :

Kotlin+KTX

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();