【Kotlin/Firebase】AuthenticationでGoogleアカウントでログインを実装する方法!

【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アカウントでログインする方法

手順

  1. Firebase プロジェクトにAuthenticationを追加
  2. gradleにSDKの追加
  3. フィンガープリントの取得/登録
  4. マニフェストファイルに権限を追加
  5. ログインボタン(UI)の実装
  6. ログイン機能の実装

1. Firebase プロジェクトにAuthenticationを追加

参考文献:Android で Google を使用して認証する

まずはFirebase Authenticationを「始める」をクリックして認証するログインプロバイダを選択します。

【Swift UI/Firebase】Authentication導入方法と使い方!ログイン機能の実装

ここでGoogleを選択します。

【Swift UI/Firebase】Authentication導入方法と使い方!ログイン機能の実装

有効にする」にチェックを入れてサポートメールアドレスを設定しておきます。

【Swift UI/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 証明書フィンガープリント」に追加します。

【Kotlin/Firebase】AuthenticationでGoogleアカウントでログインを実装する方法!

リリース用のフインガープリント

リリース用のフインガープリントは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" />
【Kotlin/Firebase】AuthenticationでGoogleアカウントでログインを実装する方法!

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での実装はこちら

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index