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 を呼び出します。
     verbatim 41920be21df8831b3d4287b5fc2081ba         // Configure Google Sign In
            GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                    .requestIdToken(getString(R.string.default_web_client_id))
                    .requestEmail()
                    .build(); endverbatim 41920be21df8831b3d4287b5fc2081ba 
    
    サーバーのクライアント IDrequestIdToken メソッドに渡す必要があります。OAuth 2.0 クライアント ID を確認する方法は次のとおりです。
    1. Cloud Platform Console で認証情報ページを開きます。
    2. ウェブ アプリケーション タイプのクライアント ID がバックエンド サーバーの OAuth 2.0 クライアント ID です。
    Google ログインを統合すると、ログイン アクティビティに次のようなコードが追加されます。
     verbatim b8d488d04f9f140f71182b528c5dc2b4     private void signIn() {
            Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
            startActivityForResult(signInIntent, RC_SIGN_IN);
        } endverbatim b8d488d04f9f140f71182b528c5dc2b4 
    
     verbatim 8d287c3152e0fc58819b4cf1ebc3cd8a     @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
                    // ...
                }
            }
        } endverbatim 8d287c3152e0fc58819b4cf1ebc3cd8a 
    
  2. ログイン アクティビティの onCreate メソッドで、FirebaseAuth オブジェクトの共有インスタンスを取得します。
     verbatim aa2d2f9402d9f718aa7bc9e091c692d5     private FirebaseAuth mAuth; endverbatim aa2d2f9402d9f718aa7bc9e091c692d5 
    // ...
     verbatim e40c74fbba4c883a85c3b158a11fc81e         mAuth = FirebaseAuth.getInstance(); endverbatim e40c74fbba4c883a85c3b158a11fc81e 
    
  3. ユーザーのログイン状態の変更に対応する AuthStateListener を設定します。
     verbatim afbeb71c024a4a9d308a53355ab441b6     private FirebaseAuth.AuthStateListener mAuthListener; endverbatim afbeb71c024a4a9d308a53355ab441b6 
    
    // ...
    
    @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 b526618a893a5099b881d10f043bf5ac     @Override
        public void onStart() {
            super.onStart();
            mAuth.addAuthStateListener(mAuthListener);
        } endverbatim b526618a893a5099b881d10f043bf5ac 
    
     verbatim 203f5349b5854a59e9d5a184a1cdb73a     @Override
        public void onStop() {
            super.onStop();
            if (mAuthListener != null) {
                mAuth.removeAuthStateListener(mAuthListener);
            }
        } endverbatim 203f5349b5854a59e9d5a184a1cdb73a 
    
  4. ユーザーがログインに成功したら、GoogleSignInAccount オブジェクトから ID トークンを取得して Firebase 認証情報と交換し、Firebase 認証情報を使用して Firebase での認証を行います。
     verbatim 348654a51e5a1dc78117cb54d2a26f26     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();
                            }
                            // ...
                        }
                    });
        } endverbatim 348654a51e5a1dc78117cb54d2a26f26 
    
    signInWithCredential の呼び出しが成功すると、AuthStateListener によって onAuthStateChanged コールバックが実行されます。このコールバックでは、getCurrentUser メソッドを使用してユーザーのアカウント データを取得できます。

次のステップ

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

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

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

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

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

FirebaseAuth.getInstance().signOut();

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