Firebase Summit で発表されたすべての情報をご覧ください。Firebase を使用してアプリ開発を加速し、自信を持ってアプリを実行する方法を紹介しています。詳細

AndroidでGitHubを使用して認証する

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

Firebase SDK を使用してウェブベースの汎用 OAuth ログインをアプリに統合し、エンド ツー エンドのサインイン フローを実行することで、ユーザーが GitHub アカウントを使用して Firebase で認証できるようにすることができます。

あなたが始める前に

GitHub アカウントを使用してユーザーをサインインするには、最初に GitHub を Firebase プロジェクトのサインイン プロバイダーとして有効にする必要があります。

  1. まだ行っていない場合は、 Firebase を Android プロジェクトに追加します

  2. Firebase コンソールで、 Authセクションを開きます。
  3. [サインイン方法] タブで、 GitHubプロバイダーを有効にします。
  4. そのプロバイダーの開発者コンソールからプロバイダー構成にクライアント IDクライアント シークレットを追加します。
    1. アプリを開発者アプリケーションとして GitHub に登録し、アプリの OAuth 2.0 Client IDClient Secretを取得します。
    2. GitHub アプリの configにあるアプリの設定ページで、Firebase OAuth リダイレクト URI (例: my-app-12345.firebaseapp.com/__/auth/handler ) が認証コールバック URLとして設定されていることを確認してください。
  5. [保存]をクリックします。
  6. モジュール (アプリ レベル) の Gradle ファイル(通常は<project>/<app-module>/build.gradle ) で、Firebase Authentication Android ライブラリの依存関係を追加します。ライブラリのバージョン管理には、 Firebase Android BoMを使用することをお勧めします。

    Java

    dependencies {
        // Import the BoM for the Firebase platform
        implementation platform('com.google.firebase:firebase-bom:31.1.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 ライブラリを使用します。

    (代替) BoM を使用せずに Firebase ライブラリの依存関係を追加する

    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:21.1.0'
    }
    

    Kotlin+KTX

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

    Firebase Android BoMを使用すると、アプリは常に互換性のあるバージョンの Firebase Android ライブラリを使用します。

    (代替) BoM を使用せずに Firebase ライブラリの依存関係を追加する

    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-ktx:21.1.0'
    }
    

  7. アプリの SHA-1 フィンガープリントをまだ指定していない場合は、Firebase コンソールの[設定] ページから指定してください。アプリの SHA-1 フィンガープリントを取得する方法の詳細については、クライアントの認証を参照してください。

Firebase SDK でログイン フローを処理する

Android アプリを構築している場合、GitHub アカウントを使用して Firebase でユーザーを認証する最も簡単な方法は、Firebase Android SDK でサインイン フロー全体を処理することです。

Firebase Android SDK でサインイン フローを処理するには、次の手順に従います。

  1. プロバイダー ID github.comBuilderを使用して、 OAuthProviderのインスタンスを構築します。

    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 ドキュメントを参照してください。 setCustomParameters()で Firebase に必要なパラメータを渡すことはできないことに注意してください。これらのパラメータはclient_idresponse_typeredirect_uristatescope 、およびresponse_modeです。

  3. オプション: 基本プロファイル以外に、認証プロバイダーに要求する追加の OAuth 2.0 スコープを指定します。アプリケーションが GitHub API からプライベート ユーザー データにアクセスする必要がある場合は、GitHub 開発者コンソールのAPI 権限で GitHub API にアクセスするための権限を要求する必要があります。要求された 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. OAuth プロバイダー オブジェクトを使用して Firebase で認証します。他の FirebaseAuth 操作とは異なり、これはCustom Chrome Tabをポップアップして UI を制御することに注意してください。そのため、アタッチしたOnSuccessListenerOnFailureListenerで Activity を参照しないでください。これらは、操作が UI を開始するとすぐにデタッチされます。

    最初に、すでに応答を受け取っているかどうかを確認する必要があります。この方法でサインインすると、Activity がバックグラウンドに置かれます。つまり、サインイン フロー中にシステムによって再利用される可能性があります。これが発生した場合にユーザーに再試行させないようにするために、結果が既に存在するかどうかを確認する必要があります。

    保留中の結果があるかどうかを確認するには、 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:
                  // ((OAuthCredential)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:
                // ((OAuthCredential)authResult.getCredential()).getAccessToken().
              }
            })
        .addOnFailureListener(
            new OnFailureListener() {
              @Override
              public void onFailure(@NonNull Exception e) {
                // Handle failure.
              }
            });
    

    正常に完了すると、プロバイダーに関連付けられた OAuth アクセス トークンを、返されたOAuthCredentialオブジェクトから取得できます。

    OAuth アクセス トークンを使用して、 GitHub APIを呼び出すことができます。

    たとえば、基本的なプロファイル情報を取得するには、REST API を呼び出して、 Authorizationヘッダーでアクセス トークンを渡します。

  5. 上記の例はサインイン フローに焦点を当てていますが、 startActivityForLinkWithProviderを使用して GitHub プロバイダーを既存のユーザーにリンクすることもできます。たとえば、複数のプロバイダーを同じユーザーにリンクして、いずれかでサインインできるようにすることができます。

    // 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 Database と Cloud Storageセキュリティ ルールでは、サインインしているユーザーの一意のユーザー ID をauth変数から取得し、それを使用してユーザーがアクセスできるデータを制御できます。

認証プロバイダーの資格情報を既存のユーザー アカウントにリンクすることで、ユーザーが複数の認証プロバイダーを使用してアプリにサインインできるようにすることができます。

ユーザーをサインアウトするには、 signOutを呼び出します。

Java

FirebaseAuth.getInstance().signOut();

Kotlin+KTX

Firebase.auth.signOut()