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

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

準備

  1. Firebase を Android プロジェクトに追加します
  2. Firebase Authentication と Google ログインの依存関係をアプリレベルの build.gradle ファイルに追加します。
    compile 'com.google.firebase:firebase-auth:10.0.1'
    compile 'com.google.android.gms:play-services-auth:10.0.1'
    
  3. アプリを Firebase プロジェクトに接続していない場合は、Firebase console で接続します。
  4. アプリの SHA-1 フィンガープリントを指定していない場合は、Firebase console の [設定] ページで指定します。アプリの SHA-1 フィンガープリントを取得する方法の詳細については、クライアントの認証をご覧ください。
  5. Firebase console で Google ログインを有効にします。
    1. Firebase console で [認証] を開きます。
    2. [ログイン方法] タブで [Google] を有効にし、[保存] をクリックします。

Firebase で認証する

  1. Android アプリへの Google ログインの統合ページの手順に沿って Google ログインをアプリに統合します。 GoogleSignInOptions オブジェクトを設定する場合は、requestIdToken を呼び出します。
            // Configure Google Sign In
            GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                    .requestIdToken(getString(R.string.default_web_client_id))
                    .requestEmail()
                    .build();
    
    サーバーのクライアント IDrequestIdToken メソッドに渡す必要があります。OAuth 2.0 クライアント ID を確認する方法は次のとおりです。
    1. Cloud Platform Console で認証情報ページを開きます。
    2. ウェブ アプリケーション タイプのクライアント ID がバックエンド サーバーの OAuth 2.0 クライアント ID です。
    Google ログインを統合すると、ログイン アクティビティに次のようなコードが追加されます。
        private void signIn() {
            Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
            startActivityForResult(signInIntent, RC_SIGN_IN);
        }
    
        @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
    
            // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...);
            if (requestCode == RC_SIGN_IN) {
                GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
                if (result.isSuccess()) {
                    // Google Sign In was successful, authenticate with Firebase
                    GoogleSignInAccount account = result.getSignInAccount();
                    firebaseAuthWithGoogle(account);
                } else {
                    // Google Sign In failed, update UI appropriately
                    // ...
                }
            }
        }
    
  2. ログイン アクティビティの onCreate メソッドで、FirebaseAuth オブジェクトの共有インスタンスを取得します。
        private FirebaseAuth mAuth;
    // ...
            mAuth = FirebaseAuth.getInstance();
    
  3. ユーザーのログイン状態の変更に対応する AuthStateListener を設定します。
        private FirebaseAuth.AuthStateListener mAuthListener;
    
    // ...
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // ...
        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");
                }
                // ...
            }
        };
        // ...
    }
    
        @Override
        public void onStart() {
            super.onStart();
            mAuth.addAuthStateListener(mAuthListener);
        }
    
        @Override
        public void onStop() {
            super.onStop();
            if (mAuthListener != null) {
                mAuth.removeAuthStateListener(mAuthListener);
            }
        }
    
  4. ユーザーがログインに成功したら、GoogleSignInAccount オブジェクトから ID トークンを取得して Firebase 認証情報と交換し、Firebase 認証情報を使用して Firebase での認証を行います。
        private void firebaseAuthWithGoogle(GoogleSignInAccount acct) {
            Log.d(TAG, "firebaseAuthWithGoogle:" + acct.getId());
    
            AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
            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(GoogleSignInActivity.this, "Authentication failed.",
                                        Toast.LENGTH_SHORT).show();
                            }
                            // ...
                        }
                    });
        }
    
    signInWithCredential の呼び出しが成功すると、AuthStateListener によって onAuthStateChanged コールバックが実行されます。このコールバックでは、getCurrentUser メソッドを使用してユーザーのアカウント データを取得できます。

次のステップ

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

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

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

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

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

FirebaseAuth.getInstance().signOut();

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