Android で Facebook ログインを使用して認証する

Facebook ログインをアプリに統合して、ユーザーが Firebase での認証に Facebook アカウントを使用できるようにすることができます。

準備

  1. Firebase を Android プロジェクトに追加します
  2. アプリを Firebase プロジェクトに接続していない場合は、Firebase console で接続します。
  3. Firebase Authentication の依存関係をアプリレベルの build.gradle ファイルに追加します。
    compile 'com.google.firebase:firebase-auth:10.0.1'
  4. Facebook for Developers サイトで、アプリのアプリケーション IDアプリ シークレットを取得します。
  5. Facebook ログインを有効にします。
    1. Firebase console で [認証] セクションを開きます。
    2. [ログイン方法] タブで [Facebook] を有効にし、Facebook から取得した [アプリケーション ID] と [アプリ シークレット] を指定します。
    3. 次に、Firebase console で生成された OAuth リダイレクト URImy-app-12345.firebaseapp.com/__/auth/handler など)を、Facebook for Developers サイトの [Product Settings] > [Facebook Login] 設定にある Facebook アプリ設定ページの [OAuth redirect URIs] に追加します。

Firebase で認証する

  1. デベロッパー向けドキュメントに沿って Facebook ログインをアプリに統合します。LoginButton または LoginManager オブジェクトを設定する場合は、public_profile 権限と email 権限をリクエストします。LoginButton を使用して Facebook ログインを統合した場合は、ログイン アクティビティに次のようなコードが含まれます。
     verbatim de11e3d340a620144c7def96a497467b // Initialize Facebook Login button
    mCallbackManager = CallbackManager.Factory.create();
    LoginButton loginButton = (LoginButton) findViewById(R.id.button_facebook_login);
    loginButton.setReadPermissions("email", "public_profile");
    loginButton.registerCallback(mCallbackManager, new FacebookCallback<LoginResult>() {
        @Override
        public void onSuccess(LoginResult loginResult) {
            Log.d(TAG, "facebook:onSuccess:" + loginResult);
            handleFacebookAccessToken(loginResult.getAccessToken());
        }
    
        @Override
        public void onCancel() {
            Log.d(TAG, "facebook:onCancel");
            // ...
        }
    
        @Override
        public void onError(FacebookException error) {
            Log.d(TAG, "facebook:onError", error);
            // ...
        }
    }); endverbatim de11e3d340a620144c7def96a497467b 
    
    // ...
    
     verbatim 2b3a33c0e5c45674c4d5150fb05301ba @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
    
        // Pass the activity result back to the Facebook SDK
        mCallbackManager.onActivityResult(requestCode, resultCode, data);
    } endverbatim 2b3a33c0e5c45674c4d5150fb05301ba 
    
  2. ログイン アクティビティの onCreate メソッドで、FirebaseAuth オブジェクトの共有インスタンスを取得します。
     verbatim 69458c03986c585598dcf97060ca7ee3 private FirebaseAuth mAuth; endverbatim 69458c03986c585598dcf97060ca7ee3 
    // ...
     verbatim 0b3d48191477527941c34cc6f363cba6 // Initialize Firebase Auth
    mAuth = FirebaseAuth.getInstance(); endverbatim 0b3d48191477527941c34cc6f363cba6 
    
  3. ユーザーのログイン状態の変更に対応する AuthStateListener を設定します。
     verbatim 1838d6d325e04b143330f8a7018182b6 private FirebaseAuth.AuthStateListener mAuthListener; endverbatim 1838d6d325e04b143330f8a7018182b6 
    
    // ...
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // ...
     verbatim 5454ba2482913c48b3e75b4cbf106037     mAuthListener = new FirebaseAuth.AuthStateListener() {
            @Override
            public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
                FirebaseUser user = firebaseAuth.getCurrentUser();
                if (user != null) {
                    // User is signed in
                    Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid());
                } else {
                    // User is signed out
                    Log.d(TAG, "onAuthStateChanged:signed_out");
                }
                // ...
            }
        }; endverbatim 5454ba2482913c48b3e75b4cbf106037 
        // ...
    }
    
     verbatim 9c619571164ac208e64b26a9c153377a @Override
    public void onStart() {
        super.onStart();
        mAuth.addAuthStateListener(mAuthListener);
    } endverbatim 9c619571164ac208e64b26a9c153377a 
    
     verbatim 7d1e3bfe5b688235a6eaee2487a9e50d @Override
    public void onStop() {
        super.onStop();
        if (mAuthListener != null) {
            mAuth.removeAuthStateListener(mAuthListener);
        }
    } endverbatim 7d1e3bfe5b688235a6eaee2487a9e50d 
    
  4. ユーザーがログインに成功したら、LoginButtononSuccess コールバック メソッドで、ログインしたユーザーのアクセス トークンを取得して Firebase 認証情報と交換し、Firebase 認証情報を使用して Firebase での認証を行います。
     verbatim b52ea0d13b9d377c904b0abaa9b7c37d private void handleFacebookAccessToken(AccessToken token) {
        Log.d(TAG, "handleFacebookAccessToken:" + token);
    
        AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
        mAuth.signInWithCredential(credential)
                .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        Log.d(TAG, "signInWithCredential:onComplete:" + task.isSuccessful());
    
                        // If sign in fails, display a message to the user. If sign in succeeds
                        // the auth state listener will be notified and logic to handle the
                        // signed in user can be handled in the listener.
                        if (!task.isSuccessful()) {
                            Log.w(TAG, "signInWithCredential", task.getException());
                            Toast.makeText(FacebookLoginActivity.this, "Authentication failed.",
                                    Toast.LENGTH_SHORT).show();
                        }
    
                        // ...
                    }
                });
    } endverbatim b52ea0d13b9d377c904b0abaa9b7c37d 
    
    signInWithCredential の呼び出しが成功すると、AuthStateListener によって onAuthStateChanged コールバックが実行されます。このコールバックでは、getCurrentUser メソッドを使用してユーザーのアカウント データを取得できます。

次のステップ

ユーザーが初めてログインすると新しいユーザー アカウントが作成され、ユーザーがログインに使用した認証情報(ユーザー名とパスワードや認証プロバイダ情報)にリンクされます。この新しいアカウントは Firebase プロジェクトの一部として保存され、ユーザーのログイン方法にかかわらず、プロジェクトのすべてのアプリでユーザーを識別するためにこれを使用できます。

  • アプリでは FirebaseUser オブジェクトからユーザーの基本的なプロフィール情報を取得できます。ユーザーの管理についての記事をご覧ください。

  • Firebase Realtime Database と Firebase Storage のセキュリティ ルールで、ログイン済みユーザーの固有ユーザー ID を auth 変数から取得し、これを使用して、ユーザーがアクセスできるデータを制御できます。

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

ユーザーのログアウトを行うには signOut を呼び出します。

FirebaseAuth.getInstance().signOut();

フィードバックを送信...