Firebase SDK を使用してウェブベースの汎用 OAuth ログインをアプリに統合し、エンド ツー エンドのサインイン フローを実行することで、ユーザーが GitHub アカウントを使用して Firebase で認証できるようにすることができます。
あなたが始める前に
GitHub アカウントを使用してユーザーをサインインするには、最初に GitHub を Firebase プロジェクトのサインイン プロバイダーとして有効にする必要があります。
まだ行っていない場合は、 Firebase を Android プロジェクトに追加します。
- Firebase コンソールで、 Authセクションを開きます。
- [サインイン方法] タブで、 GitHubプロバイダーを有効にします。
- そのプロバイダーの開発者コンソールからプロバイダー構成にクライアント IDとクライアント シークレットを追加します。
- アプリを開発者アプリケーションとして GitHub に登録し、アプリの OAuth 2.0 Client IDとClient Secretを取得します。
- GitHub アプリの configにあるアプリの設定ページで、Firebase OAuth リダイレクト URI (例:
my-app-12345.firebaseapp.com/__/auth/handler
) が認証コールバック URLとして設定されていることを確認してください。
- [保存]をクリックします。
モジュール (アプリ レベル) の Gradle ファイル(通常は
<project>/<app-module>/build.gradle
) で、Firebase Authentication Android ライブラリの依存関係を追加します。ライブラリのバージョン管理には、 Firebase Android BoMを使用することをお勧めします。Kotlin+KTX
dependencies { // Import the BoM for the Firebase platform implementation platform('com.google.firebase:firebase-bom:31.2.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' }
Java
dependencies { // Import the BoM for the Firebase platform implementation platform('com.google.firebase:firebase-bom:31.2.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' }
アプリの SHA-1 フィンガープリントをまだ指定していない場合は、Firebase コンソールの[設定] ページから指定してください。アプリの SHA-1 フィンガープリントを取得する方法の詳細については、クライアントの認証を参照してください。
Firebase SDK でログイン フローを処理する
Android アプリを構築している場合、GitHub アカウントを使用して Firebase でユーザーを認証する最も簡単な方法は、Firebase Android SDK でサインイン フロー全体を処理することです。
Firebase Android SDK でサインイン フローを処理するには、次の手順に従います。
プロバイダー ID github.comのBuilderを使用して、 OAuthProviderのインスタンスを構築します。
Kotlin+KTX
val provider = OAuthProvider.newBuilder("github.com")
Java
OAuthProvider.Builder provider = OAuthProvider.newBuilder("github.com");
オプション: 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 ドキュメントを参照してください。
setCustomParameters()
で Firebase に必要なパラメータを渡すことはできないことに注意してください。これらのパラメータはclient_id 、 response_type 、 redirect_uri 、 state 、 scope 、およびresponse_modeです。オプション: 基本プロファイル以外に、認証プロバイダーに要求する追加の OAuth 2.0 スコープを指定します。アプリケーションが GitHub API からプライベート ユーザー データにアクセスする必要がある場合は、GitHub 開発者コンソールのAPI 権限で GitHub API にアクセスするための権限を要求する必要があります。要求された 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);
OAuth プロバイダー オブジェクトを使用して Firebase で認証します。他の FirebaseAuth 操作とは異なり、これはCustom Chrome Tabをポップアップして UI を制御することに注意してください。そのため、アタッチした
OnSuccessListener
とOnFailureListener
で Activity を参照しないでください。これらは、操作が UI を開始するとすぐにデタッチされます。最初に、すでに応答を受け取っているかどうかを確認する必要があります。この方法でサインインすると、Activity がバックグラウンドに置かれます。つまり、サインイン フロー中にシステムによって再利用される可能性があります。これが発生した場合にユーザーに再試行させないようにするために、結果が既に存在するかどうかを確認する必要があります。
保留中の結果があるかどうかを確認するには、
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 = */this, 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 アクセス トークンを使用して、 GitHub APIを呼び出すことができます。
たとえば、基本的なプロファイル情報を取得するには、REST API を呼び出して、
Authorization
ヘッダーでアクセス トークンを渡します。上記の例はサインイン フローに焦点を当てていますが、
startActivityForLinkWithProvider
を使用して GitHub プロバイダーを既存のユーザーにリンクすることもできます。たとえば、複数のプロバイダーを同じユーザーにリンクして、いずれかでサインインできるようにすることができます。Kotlin+KTX
// The user is already signed-in. val firebaseUser = firebaseAuth.currentUser!! firebaseUser .startActivityForLinkWithProvider( /* activity = */this, 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+KTX
// The user is already signed-in. val firebaseUser = firebaseAuth.currentUser!! firebaseUser .startActivityForReauthenticateWithProvider( /* activity = */this, 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セキュリティ ルールでは、サインインしているユーザーの一意のユーザー ID を
auth
変数から取得し、それを使用してユーザーがアクセスできるデータを制御できます。
認証プロバイダーの資格情報を既存のユーザー アカウントにリンクすることで、ユーザーが複数の認証プロバイダーを使用してアプリにサインインできるようにすることができます。
ユーザーをサインアウトするには、 signOut
を呼び出します。
Kotlin+KTX
Firebase.auth.signOut()
Java
FirebaseAuth.getInstance().signOut();