【Kotlin/Firebase】AuthenticationでGoogleアカウントでログインを実装する方法!
この記事からわかること
- Kotlin/Firebaseで作成したAndroidアプリにAuthenticationを導入する方法
- Googleアカウントでログインできるようにする方法
- エラー:com.google.android.gms.common.api.ApiException: 10:の解消方法
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
今回はFirebase Authenticationでログイン機能を実装する際に、Googleアカウントでログインできるようにする方法をまとめていきます。
AuthenticationでGoogleアカウントでログインする方法
手順
- Firebase プロジェクトにAuthenticationを追加
- gradleにSDKの追加
- フィンガープリントの取得/登録
- マニフェストファイルに権限を追加
- ログインボタン(UI)の実装
- ログイン機能の実装
1. Firebase プロジェクトにAuthenticationを追加
参考文献:Android で Google を使用して認証する
まずはFirebase Authenticationを「始める」をクリックして認証するログインプロバイダを選択します。
ここでGoogleを選択します。
「有効にする」にチェックを入れてサポートメールアドレスを設定しておきます。
これでプロジェクトの準備が整ったのでプロジェクトにAndroidアプリを追加しておいてください。すでにAndroidアプリを追加していた場合は「google-services.json」が更新されているので変更しておく必要があります。ここらへんの詳細な流れは以下の記事を参考にしてください。
【Android Studio】Firebaseの導入方法!Firebase Analytics/Google Analytics
2.gradleにSDK追加
続いて「build.gradle」にAuthenticationのFirebase SDK(Software Development Kit)を追加していきます。追加するのは以下の2つです。
dependencies {
// 〜〜〜〜〜〜〜〜〜〜
// Authentication
implementation 'com.google.firebase:firebase-auth-ktx'
implementation 'com.google.android.gms:play-services-auth:20.7.0'
}
3.フィンガープリントの取得/登録
Authenticationを使用するためにはフィンガープリント(SHA-1フィンガープリント)が必要になります。これはFirebaseとAndroidアプリを安全に関連づけるために必要になります。
登録が必要なフィンガープリントはデバッグ用とリリース用の2つになります。デバッグ用のフィンガープリントはターミナルに以下のコマンドを入力します。
$ keytool -list -v -keystore /Users/ユーザー名/.android/debug.keystore -alias androiddebugkey
するとパスワードを問われるのでandroid
と入力します。
キーストアのパスワードを入力してください: android
すると以下のように出力されます。このMD5
に記載されているXX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX
部分をコピーします。(SHA1に記載されているのはSHA256形式でした。なぜか1行ずれているみたいです。)
別名: androiddebugkey
作成日: 2023/07/13
エントリ・タイプ: PrivateKeyEntry
証明書チェーンの長さ: 1
証明書[1]:
所有者: C=US, O=Android, CN=Android Debug
発行者: C=US, O=Android, CN=Android Debug
シリアル番号: 1
有効期間の開始日: Thu Jul 13 19:56:40 JST 2023 終了日: Sat Jul 05 19:56:40 JST 2053
証明書のフィンガプリント:
MD5: XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX
SHA1: XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX
SHA256: SHA256withRSA
署名アルゴリズム名: 2048ビットRSA鍵
サブジェクト公開鍵アルゴリズム: 1
バージョン: {10}
コピーしたフィンガープリントをFirebaseのプロジェクトの「歯車マーク」>「プロジェクトの設定」>「全般」>「Androidアプリ」にある「SHA 証明書フィンガープリント」に追加します。
リリース用のフインガープリント
リリース用のフインガープリントはAABファイル作成時に作成するKeyStoreのパスを使用して以下のコマンドを実行することで取得できます。
$ keytool -list -v -keystore /[Key storeのパス]/keyfile.jks
上記のやり方がよくわからない場合は「app-release.aab」を生成した後であれば以下コマンドで取得することもできます。
$ keytool -printcert -jarfile app-release.aab
4.マニフェストファイルに権限を追加
Authenticationの機能を利用するにはネットワークアクセスが必要になるので以下の権限を追加しておきます。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<application
5.ログインボタン(UI)の実装
ログインボタンはSignInButton
を使用することで簡単に実装することができます。
<com.google.android.gms.common.SignInButton
android:id="@+id/google_sign_in_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
6.ログイン機能の実装
実装は以下のとおりです。ざっくり説明するとGoogleアカウント認証用のIntent
を実行してその結果で取得できたアカウント情報を使用してサインインしています。
おすすめ記事:【Kotlin/Android Studio】registerForActivityResultの使い方!launcherとは?
class MainActivity : AppCompatActivity() {
private lateinit var repository: FirebaseAuthRepository
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
repository = FirebaseAuthRepository(this)
val signInButton: SignInButton = findViewById(R.id.google_sign_in_button)
signInButton.setOnClickListener {
val signInIntent = repository.mGoogleSignInClient.signInIntent
googleSignInLauncher.launch(signInIntent)
}
}
/**
* Googleアカウント認証Intentの結果を操作
*/
private var googleSignInLauncher: ActivityResultLauncher<Intent> = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) { result ->
if (result.resultCode == Activity.RESULT_OK) {
result.data?.let { repository.googleSignIn(it) }
} else {
Log.d("Auth", "サインインキャンセルまたは失敗")
}
}
}
クライアントIDは「google-services.json」の中に記載されているものを使用すればOKです。
class FirebaseAuthRepository(context: Context) {
private val mAuth = FirebaseAuth.getInstance()
public val mGoogleSignInClient: GoogleSignInClient
init {
mAuth.setLanguageCode("ja")
val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken("クライアントID") // 自身のクライアントIDを使用する
.requestEmail()
.build()
mGoogleSignInClient = GoogleSignIn.getClient(context, gso)
}
/**
* Google新規登録&サインイン
* IntentからGoogleアカウント情報を取得し
* クレデンシャルサインインを実行
*/
public fun googleSignIn(data: Intent) {
val task = GoogleSignIn.getSignedInAccountFromIntent(data)
try {
val account = task.getResult(ApiException::class.java)
account?.idToken?.let { token ->
credentialGoogleSignIn(token)
}
} catch (e: ApiException) {
Log.d("Auth", "アカウント情報取得失敗 エラー:", e)
}
}
/**
* クレデンシャル(認証情報)でサインインを試みる
*/
private fun credentialGoogleSignIn(idToken: String) {
val credential = GoogleAuthProvider.getCredential(idToken, null)
mAuth.signInWithCredential(credential)
.addOnCompleteListener { task ->
if (task.isSuccessful) {
Log.d("Auth", "Googleサインイン成功")
} else {
Log.d("Auth", "Googleサインイン失敗", task.exception)
}
}
}
}
エラー:com.google.android.gms.common.api.ApiException: 10:
実装完了後に以下のようなエラーが発生してサインインに失敗してしまいました。
com.google.android.gms.common.api.ApiException: 10
このエラーはどうやらフィンガープリントやクライアントIDが異なると発生するようなので両者が正しくセットされているか確認してみてください。
iOSでの実装はこちら
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。