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

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

Googleアカウント認証の手順は Firebase Assistant でフォローされていなかったので、公式ドキュメントベースで実装していきます。
手順としては、以下の通りです。
- Android アプリを Firebase プロジェクトに接続する
- Google ログインに必要な依存関係を build.gradle に追加する
- Firebase コンソールから、アプリの「SHA-1 フィンガープリント」を指定する
- Firebase コンソールから、「Google ログイン」を有効にする
- アプリにコードを記述する
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.
この場合は、こちらの記事を参考にしてみてください。












