Аутентификация с помощью 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. Используя Firebase Android BoM , объявите зависимость для библиотеки Firebase Authentication Android в файле Gradle вашего модуля (на уровне приложения) (обычно app/build.gradle ).

    Java

    dependencies {
        // Import the BoM for the Firebase platform
        implementation platform('com.google.firebase:firebase-bom:30.1.0')
    
        // Declare 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 {
        // Declare 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:21.0.6'
    }
    

    Kotlin+KTX

    dependencies {
        // Import the BoM for the Firebase platform
        implementation platform('com.google.firebase:firebase-bom:30.1.0')
    
        // Declare 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-ktx'
    }
    

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

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

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

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

    dependencies {
        // Declare 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-ktx:21.0.6'
    }
    

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

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

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

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

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

    OAuthProvider.Builder provider = OAuthProvider.newBuilder("github.com");
    
  2. Необязательно : укажите дополнительные настраиваемые параметры OAuth, которые вы хотите отправить с запросом OAuth.

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

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

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

    // 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 :

    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:
                  // authResult.getCredential().getAccessToken().
                }
              })
          .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 :

    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:
                // authResult.getCredential().getAccessToken().
              }
            })
        .addOnFailureListener(
            new OnFailureListener() {
              @Override
              public void onFailure(@NonNull Exception e) {
                // Handle failure.
              }
            });
    

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

    Используя токен доступа OAuth, вы можете вызывать GitHub API .

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

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

    // 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) {
                // GitHub 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().
              }
            })
        .addOnFailureListener(
            new OnFailureListener() {
              @Override
              public void onFailure(@NonNull Exception e) {
                // Handle failure.
              }
            });
    
    
  6. Тот же шаблон можно использовать с startActivityForReauthenticateWithProvider , который можно использовать для получения новых учетных данных для конфиденциальных операций, требующих недавнего входа в систему.

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

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

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

Java

FirebaseAuth.getInstance().signOut();

Kotlin+KTX

Firebase.auth.signOut()