Вы можете разрешить своим пользователям проходить аутентификацию в Firebase с использованием их учетных записей GitHub, интегрировав в свое приложение универсальный веб-вход OAuth с помощью Firebase SDK для реализации сквозного процесса входа.
Прежде чем начать
Чтобы авторизовать пользователей с помощью учетных записей GitHub, необходимо сначала включить GitHub в качестве поставщика входа для вашего проекта Firebase:
Если вы еще этого не сделали, добавьте Firebase в свой Android-проект .
- В консоли Firebase откройте раздел «Аутентификация» .
- На вкладке «Способ входа» включите поставщика GitHub .
- Добавьте идентификатор клиента и секретный ключ клиента из консоли разработчика этого провайдера в конфигурацию провайдера:
- Зарегистрируйте свое приложение как приложение разработчика на GitHub и получите идентификатор клиента OAuth 2.0 и секретный ключ клиента для своего приложения.
- Убедитесь, что ваш URI перенаправления Firebase OAuth (например,
my-app-12345.firebaseapp.com/__/auth/handler
) установлен в качестве URL-адреса обратного вызова авторизации на странице настроек вашего приложения в конфигурации вашего приложения GitHub .
- Нажмите «Сохранить» .
В файле 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:34.0.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:24.0.0") }
Если вы ещё не указали цифровой отпечаток SHA-1 для своего приложения, сделайте это на странице настроек консоли Firebase . Подробнее о получении цифрового отпечатка SHA-1 для вашего приложения см. в разделе «Аутентификация клиента» .
Управляйте процессом входа с помощью Firebase SDK
Если вы создаете приложение для Android, самый простой способ аутентификации пользователей в Firebase с использованием их учетных записей GitHub — это обработка всего процесса входа с помощью Firebase Android SDK.
Чтобы организовать процесс входа с помощью Firebase Android SDK, выполните следующие действия:
Создайте экземпляр OAuthProvider , используя его Builder с идентификатором провайдера github.com.
Kotlin
val provider = OAuthProvider.newBuilder("github.com")
Java
OAuthProvider.Builder provider = OAuthProvider.newBuilder("github.com");
Необязательно : укажите дополнительные пользовательские параметры OAuth, которые вы хотите отправить с запросом OAuth.
Kotlin
// 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 . Обратите внимание, что с помощью
setCustomParameters()
нельзя передать требуемые Firebase параметры. К ним относятся client_id , response_type , redirect_uri , state , scope и response_mode .Необязательно : укажите дополнительные области действия OAuth 2.0, помимо базового профиля, которые вы хотите запросить у поставщика аутентификации. Если вашему приложению требуется доступ к личным данным пользователей через API GitHub, вам необходимо запросить разрешения на доступ к API GitHub в разделе «Разрешения API» консоли разработчика GitHub. Запрашиваемые области действия OAuth должны точно соответствовать предварительно настроенным в разрешениях API приложения.
Kotlin
// 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);
Выполните аутентификацию в Firebase с помощью объекта провайдера OAuth. Обратите внимание, что в отличие от других операций FirebaseAuth, эта операция перехватит управление вашим пользовательским интерфейсом, открыв пользовательскую вкладку 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 GitHub .
Например, чтобы получить базовую информацию профиля, вы можете вызвать REST API, передав токен доступа в заголовке
Authorization
:Хотя приведенные выше примеры фокусируются на процессах входа, вы также можете связать провайдера GitHub с существующим пользователем с помощью
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. } });
Тот же шаблон можно использовать с
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();