【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 ログインを使用するための依存関係を追加します(以下)。
1 |
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だと、以下のコマンドを打ち込みます。
1 |
keytool -list -v -alias androiddebugkey -keystore ~/.android/debug.keystore |
パスワードを求められたら、「android」がデフォルトのパスワードなのでそれを打ち込みます。
コマンドが成功すると、「証明書のフィンガプリント ... SH1」の部分の文字列をコピーします。
コピーしたフィンガープリントを、Firebase コンソールから当該箇所に打ち込みます。
↓
↓
4. Firebase コンソールから、「Google ログイン」を有効にする
先ほどと同様に、Firebaseコンソールに移動して設定します。
↓
↓
↓
↓
「プロジェクトのサポートメール」は必須のようなので、入力します。
5. アプリにコードを記述する
ここまでで Google アカウント認証を行う設定は完了です。
あとは、アプリに「Google認証用のボタン」を追加して、それがタップされたときの処理を記述していきます。
Google認証用のボタンは、自分で作成しても良いですが、既存の View (SignInButton)を使用すると楽です(詳細はこちら)
1 2 3 4 |
<com.google.android.gms.common.SignInButton android:id="@+id/sign_in_button" android:layout_width="wrap_content" android:layout_height="wrap_content" /> |
レイアウトファイルにボタンを追加したら、実際に処理するコードを記述します。(以下はkotlinのコードです)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
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 メソッドが実行され、認証成功時の処理、失敗時の処理に分岐できます。
なお、サインアウトする場合は、以下のコードを実行します。
1 2 |
mAuth?.signOut() mGoogleSignInClient?.signOut() |
Firebase と、Googleの両方からサインアウトする形です。
補足
実行の際に、以下のエラーが出た場合は、Firebase の接続設定がうまくいっていない可能性があります。
1 |
Caused by: java.lang.IllegalStateException: Default FirebaseApp is not initialized in this process com.example.authtestgoogle. Make sure to call FirebaseApp.initializeApp(Context) first. |
この場合は、こちらの記事を参考にしてみてください。