このガイドでは、KMP + Compose Multiplatform アプリで moon-firebase-auth-kmp
を使う手順を説明します。本モジュールは moon-auth-kmp が提供する L1
AuthProvider SPI の Firebase 実装であり、機能コードは SPI のみに依存して
テストでは Fake に置き換えられます。
- Kotlin 2.0.20、Compose Multiplatform 1.7.x、AGP 8.6.x、Gradle 8.10、Java 21。
- メール/パスワードサインインを有効化した Firebase プロジェクト。
- 有効な MoonDeveloper ライセンスキー (
moonLicenseKeyGradle プロパティ)。 - アプリで Koin 4.1.0 を設定済み。
settings.gradle.kts:
dependencyResolutionManagement {
repositories {
google()
mavenCentral()
maven {
url = uri("https://moon-server-production.up.railway.app/maven/releases")
credentials {
username = "license"
password = providers.gradleProperty("moonLicenseKey").getOrElse("")
}
content { includeGroup("io.moondeveloper") }
}
}
}composeApp/build.gradle.kts (commonMain):
implementation("io.moondeveloper:moon-firebase-auth-kmp:1.0.0")google-services.jsonをcomposeApp/src/androidMain/または Android アプリモジュールに配置します。- Firebase ドキュメントに従い Google Services プラグインを適用します。
INTERNETパーミッションが付与されていることを確認します (デフォルトで付与)。
- Xcode ターゲットに
GoogleService-Info.plistを追加します。 AppDelegateで、KoinKt.doInitKoin()の前にFirebaseApp.configure()を呼びます。
import io.moondev.auth.AuthProvider
import io.moondev.firebase.auth.FirebaseAuthProvider
import io.moondev.firebase.auth.firebaseAuthModule
import org.koin.dsl.bind
import org.koin.dsl.module
val appModule = module {
single<AuthProvider> { get<FirebaseAuthProvider>() } bind AuthProvider::class
}
startKoin {
modules(firebaseAuthModule, appModule)
}class AuthStore(private val auth: AuthProvider) {
val state: StateFlow<AuthUser?> = auth.currentUser
suspend fun signIn(email: String, pw: String) {
auth.signInWithEmailPassword(email, pw)
}
suspend fun signOut() {
auth.signOut()
}
}Store は AuthProvider にのみ依存するため、テストでは Firebase を読み込まずに
Fake と差し替えられます。
@Composable
fun AuthScreen(store: AuthStore = koinInject()) {
val user by store.state.collectAsState()
// ... サインインフォームを描画し、`user` を購読します。
}- 依存関係解決時の
401/ 認証失敗 —moonLicenseKeyが未設定または期限切れです。 https://moondeveloper.com/trial で再発行してください。 - Firebase "default app not initialized" — iOS では Koin 起動前に必ず
FirebaseApp.configure()を呼んでください。 - Koin "No definition found for AuthProvider" — 手順 4 の
bind宣言が抜けています。
- ユーザーごとのデータ同期には moon-firestore-sync-kmp を併用します。
- サンプル参照:
samples/full-demo-app/.../AuthScreen.kt。