開発ブログ

株式会社Nextatのスタッフがお送りする技術コラムメインのブログ。

電話でのお問合わせ 075-744-6842 ([月]-[金] 10:00〜17:00)

  1. top >
  2. 開発ブログ >
  3. Kotlin >
  4. 【Compose Multiplatform】KMPAuthを使用したFirebaseソーシャルログイン(Android編)

【Compose Multiplatform】KMPAuthを使用したFirebaseソーシャルログイン(Android編)

logo.png
みなさんこんにちは。今回はCompose Mutiplatform第5回目の記事になります。
Firebaseとの連携をして、ソーシャルログインを実装してみましょう。
少し長い記事になるので、AndroidとiOSでそれぞれ記事を作成していこうと思います。今回はAndoridです。

これまでのCompose Multiplatform記事はこちら。
Compose Multiplatform入門(環境構築編)
Compose Multiplatform入門(プロジェクト作成編)
Compose Multiplatform入門(画面遷移編)
Compose Multiplatform入門(ロギング編)
 

Firebaseアプリケーションの作成

最初の段階では、Firebaseドキュメントの「AndroidプロジェクトにFirebaseを追加する」のページの通りに進めていけばOKです。
今回はGoogleアカウントでのソーシャルログインを実装していこうと思うので、ログインプロバイダ「Google」を有効にしておきましょう。

Firebaseアプリケーションの名前設定

アプリケーションの作成から、名前をつけます。既存のアプリケーションと被らないようにする必要があるようです。
firebase-app-name.png

Googleアナリティクスの設定

今回はアナリティクス系の機能は使う予定がないので、OFFにしておきました。使用する予定がある場合はONのままで進みましょう。
firebase-analytics.png

パッケージ名・デバッグ用書名証明書SHA-1の設定

パッケージ名はAndroidStudioで開いたプロジェクトから確認しましょう。 build.gradle.kts にapplicationIdとして記載されているはずです。 デバッグ用書名証明書SHA-1フィンガープリントはkeytoolなどを使って用意しておきます。
appname-fingerprint.png

構成ファイルのダウンロード

パッケージ名・デバッグ用書名証明書SHA-1フィンガープリントを登録すると構成ファイル「google-services.json」が用意されるのでこちらをダウンロードします。 ダウンロードした構成ファイル・登録したデバッグ証明書のkeystoreファイルをcomposeApp直下に配置します。
download.png

KMPAuthの利用

公式ではまだCompose MultiplatformでのFirebase連携がサポートされていないので、有志の方が開発したライブラリ「KMPAuth」を利用します。 Compose MultiplatformプロジェクトでAndroid、iOSでのFirebase ソーシャルログインが使えるようになるライブラリです。

libs.versions.tomlの更新


androidx-credentials = "1.2.2"
google-services = "4.4.2"
kmp-auth = "2.0.0"

[libraries]
androidx-credentials = { module = "androidx.credentials:credentials", version.ref = "androidx-credentials"}
androidx-credentials-play-services-auth = { module = "androidx.credentials:credentials-play-services-auth", version.ref = "androidx-credentials"}
kmpauth-firebase = { module = "io.github.mirzemehdi:kmpauth-firebase", version.ref = "kmp-auth" }
kmpauth-google = { module = "io.github.mirzemehdi:kmpauth-google", version.ref = "kmp-auth" }
kmpauth-uihelper = { module = "io.github.mirzemehdi:kmpauth-uihelper", version.ref = "kmp-auth" }

[plugins]
googleServices = { id = "com.google.gms.google-services", version.ref = "google-services" }

composeApp/build.gradle.ktsの更新


plugins {
    alias(libs.plugins.googleServices)
}

kotlin {
    sourceSets {
        androidMain.dependencies {
            implementation(libs.androidx.credentials.play.services.auth)
        }
        commonMain.dependencies {
            implementation(libs.kmpauth.google)
            implementation(libs.kmpauth.firebase)
            implementation(libs.kmpauth.uihelper)
        }

android {
    signingConfigs {
        // ここにkeystoreファイルの情報を書く
        getByName("debug") {
            storeFile = file("$rootDir/composeApp/debug.keystore")
            storePassword = ""
            keyAlias = ""
            keyPassword = ""
        }
    }
}

初期化処理を書く

KMPAuthを利用するときにはアプリケーション起動時に初期化を行う必要があります。 commonMain/kotlin ファイルにAppInitializer.ktファイルを作成し、初期化関数を書きます。

import com.mmk.kmpauth.google.GoogleAuthCredentials
import com.mmk.kmpauth.google.GoogleAuthProvider

object AppInitializer {
    fun onApplicationStart() {
        // クライアントIDはFirebaseでGoogleログインを有効化したときにgoogle-service.jsonに追加されるので、そちらを確認して入力する
       // client_typeが3のクライアントID
        GoogleAuthProvider.create(credentials = GoogleAuthCredentials(serverId = ""))
    }
}
androidMainファイル内のMainActivity.ktで初期化関数を呼びます。

class MainActivity : ComponentActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        AppInitializer.onApplicationStart()
        setContent {
            App()
        }
    }
}

Googleサインインボタンの配置

今回はHomeScreenにログインボタンを配置します。 ログイン状態がわかるように、ログイン後にGoogleアカウントの名前を表示するようにもしておきます。 画面がゴチャゴチャし始めるので、「Click me!」のボタン並びにボタン押下後の処理などは削除しました。

class HomeScreen : Screen {

    @OptIn(ExperimentalResourceApi::class)
    @Composable
    override fun Content() {
        val viewModel: HomeScreenViewModel = getScreenModel()
        val navigator = LocalNavigator.currentOrThrow

        Column(
            modifier = Modifier.fillMaxWidth(),
            horizontalAlignment = Alignment.CenterHorizontally
        ) {
            val anotherScreen = rememberScreen(Screens.Another(postId = "dummy_post_id"))

            Button(onClick = { navigator.push(anotherScreen) }) {
                Text("画面遷移")
            }

            var signedInUserName: String by remember { mutableStateOf("") }
            val onFirebaseResult: (Result) -> Unit = { result ->
                if (result.isSuccess) {
                    val firebaseUser = result.getOrNull()
                    signedInUserName =
                        firebaseUser?.displayName ?: firebaseUser?.email ?: "不明なユーザー"
                } else {
                    signedInUserName = "サインインしていません"
                    println("Error Result: ${result.exceptionOrNull()?.message}")
                }

            }

            GoogleButtonUiContainerFirebase(onResult = onFirebaseResult) {
                GoogleSignInButton(modifier = Modifier.fillMaxWidth()) { this.onClick() }
            }

            Text(
                text = signedInUserName,
            )
        }
    }
}
Googleサインインボタンが表示され、そのボタンを押してログイン処理を完了するとGoogleアカウントでの名前が表示されるかと思います。 そこまで実行できれば成功です!
android-firebase-auth.png

さいごに

ここでAndroidでのFirebase ソーシャルログイン処理は完了になります。 次回はiOSでのFirebase ソーシャルログイン処理について書いていきます。最後までご覧いただきありがとうございました。
  • posted by りっちゃん
  • Kotlin
TOPに戻る