【Android】Firebase Authentication で Googleアカウント認証する手順【アプリ開発】

Firebase Authentication Googleアカウント認証する手順をまとめました。

Left Caption
ねじまき
「メールアドレスとパスワード」を使用した認証は、Android Studio の Firebase Assistant に指示されるとおりに実装すれば良いのですが、、、

Googleアカウント認証の手順は Firebase Assistant でフォローされていなかったので、公式ドキュメントベースで実装していきます。

手順としては、以下の通りです。

  1. Android アプリを Firebase プロジェクトに接続する
  2. Google ログインに必要な依存関係を build.gradle に追加する
  3. Firebase コンソールから、アプリの「SHA-1 フィンガープリント」を指定する
  4. Firebase コンソールから、「Google ログイン」を有効にする
  5. アプリにコードを記述する

1. Android アプリを Firebase プロジェクトに接続する

Android Studio の Firebase Assistant を使用して、Android アプリを Firebase プロジェクトに接続します。

なお、まだ Firebase プロジェクトを作成していない場合は、こちらから作成しておきます。

Firebase Assistant は、Android Studio の「Tools」->「Firebase」から起動できます(↓)。

上記画像の赤く囲っている箇所をクリックします。

「Email and password ...」と書いていますが、アプリを Firebase プロジェクトに接続するまでの手順は同じなので、上記アシスタントを使用します。

↑赤く囲っている手順(1, 2)まで完了したら、アシスタントを閉じます。

 

2. Google ログインに必要な依存関係を build.gradle に追加する

アプリレベルの build.gradle (app配下) に、Google ログインを使用するための依存関係を追加します(以下)。

implementation 'com.google.android.gms:play-services-auth:16.0.1'

なお、指定するバージョンは、こちらに記載されているものを参照した方がよいと思います。

2019年4月時点では、Google Account Login は 16.0.1 が最新なので、それを指定しました。

 

3. Firebase コンソールから、アプリの「SHA-1 フィンガープリント」を指定する

デバッグ用の SHA-1 フィンガープリントを取得する手順は、こちらに記載されています。

例えば、Macだと、以下のコマンドを打ち込みます。

keytool -list -v -alias androiddebugkey -keystore ~/.android/debug.keystore


パスワードを求められたら、「android」がデフォルトのパスワードなのでそれを打ち込みます。

コマンドが成功すると、「証明書のフィンガプリント ... SH1」の部分の文字列をコピーします。

コピーしたフィンガープリントを、Firebase コンソールから当該箇所に打ち込みます。


 

 

4. Firebase コンソールから、「Google ログイン」を有効にする

先ほどと同様に、Firebaseコンソールに移動して設定します。



「プロジェクトのサポートメール」は必須のようなので、入力します。

 

5. アプリにコードを記述する

ここまでで Google アカウント認証を行う設定は完了です。

あとは、アプリに「Google認証用のボタン」を追加して、それがタップされたときの処理を記述していきます。

Google認証用のボタンは、自分で作成しても良いですが、既存の View (SignInButton)を使用すると楽です(詳細はこちら


レイアウトファイルにボタンを追加したら、実際に処理するコードを記述します。(以下はkotlinのコードです)

class MainActivity : AppCompatActivity() {

    var mAuth : FirebaseAuth? = null
    var googleLoginButton : SignInButton? = null
    var mGoogleSignInClient : GoogleSignInClient? = null
    //サーバーのクライアントIDの取得方法はこちらを参照
    //https://developers.google.com/identity/sign-in/android/start-integrating?hl=ja#get_your_backend_servers_oauth_20_client_id
    val CLIENT_ID = "****"
    //任意の数字を指定
    val RC_GOOGLE_SIGN_IN_CODE = 9001

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        //Googleサインインのためのオプションを指定
        var gso = GoogleSignInOptions
            .Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestIdToken(CLIENT_ID)
            .requestEmail()
            .build()

        mGoogleSignInClient = GoogleSignIn.getClient(this, gso)
        mAuth = FirebaseAuth.getInstance()
        //Googleサインインボタンにクリックリスナーを登録
        googleLoginButton = findViewById(R.id.google_sign_in_button)
        googleLoginButton?.setOnClickListener{
            googleSignIn()
        }
    }

    private fun googleSignIn(){
        var googleSignInIntent  = mGoogleSignInClient?.signInIntent
        //Googleサインイン画面に遷移
        startActivityForResult(googleSignInIntent, RC_GOOGLE_SIGN_IN_CODE)
    }

    //Googleサインイン画面から戻ってきたときに実行される。
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)

        if (requestCode == RC_GOOGLE_SIGN_IN_CODE){
            var task = GoogleSignIn.getSignedInAccountFromIntent(data)
            try {
                var account = task.result
                //Googleアカウントの情報が取得できた際の処理 
                if (account != null) firebaseAuthWithGoogle(account)
            }catch (e : ApiException){
                Log.d("ApiExeption", e.toString())
            }
        }
    }

    //Googleアカウント情報を元に、firebaseで認証する。
    private fun firebaseAuthWithGoogle(acct : GoogleSignInAccount){

        var credential = GoogleAuthProvider.getCredential(acct.idToken, null)
        mAuth?.signInWithCredential(credential)
            ?.addOnCompleteListener{
                //認証成功時の処理
                if (it.isSuccessful){
                    Log.d("currentUser", mAuth?.currentUser.toString())
                }//認証失敗時の処理
                 else{

                }
            }
    }

}


実際にエミュレータで実行してみました。


任意のGoogleアカウントを選択すると、Googleサインイン画面が閉じて、元の画面に戻ります。

その後、firebaseAuthWithGoogle メソッドが実行され、認証成功時の処理、失敗時の処理に分岐できます。

なお、サインアウトする場合は、以下のコードを実行します。

mAuth?.signOut()
mGoogleSignInClient?.signOut()


Firebase と、Googleの両方からサインアウトする形です。

補足

実行の際に、以下のエラーが出た場合は、Firebase の接続設定がうまくいっていない可能性があります。

Caused by: java.lang.IllegalStateException: Default FirebaseApp is not initialized in this process com.example.authtestgoogle. Make sure to call FirebaseApp.initializeApp(Context) first.


この場合は、こちらの記事を参考にしてみてください。