Firebase Authentication
メールアドレスとGoogleによるサインインを実装します。
「Firebase Authentication」はCoddyKit上の無料Android Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAndroid Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Android Academyコースには全4レッスンが含まれています。
Firebase Authを使う理由
Firebase Authenticationは、安全なパスワード保存、トークンの更新、アカウント復旧、複数の認証プロバイダー(メール、Google、Apple、電話番号、匿名)など、ユーザーのサインインに必要な複雑な処理を担います。
ログインサーバーを自分で構築する代わりに、いくつかのAPIを呼び出すだけで、認証済みのFirebaseUserを取得できます。このレッスンでは、メールアドレスとパスワードによるサインインとGoogleサインインを実装します。
サインイン方法の有効化
コードを書く前に、Firebaseコンソールで使用する認証プロバイダーを有効にします。
- Authentication → Sign-in methodに移動します。
- Email/Passwordをオンにします。
- Googleをオンにします(サポート用メールアドレスを選択します)。
Googleサインインでは、プロジェクト設定にアプリのSHA-1フィンガープリントも追加する必要があります。追加しないと、デベロッパーエラーでサインインに失敗します。
FirebaseAuthインスタンスの取得
エントリーポイントはFirebase.authです。現在のユーザーや、アカウントの作成、サインイン、サインアウトを行うメソッドにアクセスできます。
誰もサインインしていない場合、auth.currentUserはnullになります。これは、起動時に表示する画面を決める簡単な方法です。
import com.google.firebase.Firebase
import com.google.firebase.auth.auth
val auth = Firebase.auth
fun isLoggedIn(): Boolean {
return auth.currentUser != null
}アカウントを作成
createUserWithEmailAndPasswordで新しいユーザーを登録します。戻り値はTaskですが、コルーチンのコードではawait()(kotlinx-coroutines-play-servicesから)で待機できます。
成功すると、ユーザーはすぐにサインインします。
import com.google.firebase.Firebase
import com.google.firebase.auth.auth
import kotlinx.coroutines.tasks.await
suspend fun register(email: String, password: String): Result<Unit> {
return try {
Firebase.auth
.createUserWithEmailAndPassword(email, password)
.await()
Result.success(Unit)
} catch (e: Exception) {
Result.failure(e)
}
}メールアドレスでサインイン
既存のユーザーをサインインさせるには、signInWithEmailAndPasswordを使用します。基本的な構造は登録の場合と同じです。
呼び出しをtry/catchで囲むと、パスワードの誤り、ユーザーが存在しない、メールアドレスの形式が不正といったエラーをわかりやすく表示できます。
import com.google.firebase.Firebase
import com.google.firebase.auth.auth
import com.google.firebase.auth.FirebaseUser
import kotlinx.coroutines.tasks.await
suspend fun login(email: String, password: String): FirebaseUser? {
val result = Firebase.auth
.signInWithEmailAndPassword(email, password)
.await()
return result.user
}Composeでログイン画面を作成
認証機能を小さなCompose画面に組み込みます。メールアドレスとパスワードをstateで保持し、コルーチンスコープからsuspend関数を呼び出して、エラーを表示します。
@Composable
fun LoginScreen(onLoggedIn: () -> Unit) {
var email by remember { mutableStateOf("") }
var password by remember { mutableStateOf("") }
var error by remember { mutableStateOf<String?>(null) }
val scope = rememberCoroutineScope()
Column(Modifier.padding(16.dp)) {
TextField(email, { email = it }, label = { Text("Email") })
TextField(password, { password = it }, label = { Text("Password") })
error?.let { Text(it, color = Color.Red) }
Button(onClick = {
scope.launch {
val user = login(email, password)
if (user != null) onLoggedIn() else error = "Login failed"
}
}) { Text("Sign in") }
}
}現在のユーザーを読み取る
FirebaseUserには、本人確認に関する情報が含まれています。uid(安定した一意のID)、email、displayName、photoUrlなどです。
Firestoreにそのユーザーのデータを保存するときは、キーとしてuidを使用します。uidは一意で、変わらないことが保証されているためです。
import com.google.firebase.Firebase
import com.google.firebase.auth.auth
fun describeUser() {
val user = Firebase.auth.currentUser ?: return
println("UID: ${user.uid}")
println("Email: ${user.email}")
println("Name: ${user.displayName ?: "(none)"}")
}認証状態を監視する
認証状態は、サインイン、サインアウト、トークンの更新などによっていつでも変化します。ポーリングする代わりに、AuthStateListenerを登録して変化に反応します。
ログイン画面とホーム画面の間を自動的に移動する処理に最適です。
import com.google.firebase.Firebase
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.auth.auth
val listener = FirebaseAuth.AuthStateListener { auth ->
val user = auth.currentUser
if (user == null) {
println("Signed out -> show login")
} else {
println("Signed in as ${user.email}")
}
}
// Attach and detach with lifecycle
Firebase.auth.addAuthStateListener(listener)
// Firebase.auth.removeAuthStateListener(listener)Credential ManagerでGoogleサインイン
現在のGoogleサインインには、Credential Manager APIを使用する方法が推奨されています。Google IDトークンを要求し、それをFirebaseの認証情報に交換します。
重要なのは、返されたIDトークンからGoogleAuthProviderの認証情報を作成し、それをsignInWithCredentialに渡すことです。
import com.google.firebase.Firebase
import com.google.firebase.auth.GoogleAuthProvider
import com.google.firebase.auth.auth
import kotlinx.coroutines.tasks.await
suspend fun firebaseSignInWithGoogle(idToken: String) {
// idToken comes from Credential Manager / Google Identity
val credential = GoogleAuthProvider.getCredential(idToken, null)
Firebase.auth.signInWithCredential(credential).await()
}サインアウト
サインアウトは1回の呼び出しで行えます。auth.signOut()を使用してください。ローカルのユーザー情報が消去され、認証状態リスナーが呼び出されます。
Googleサインインでは、次回にアカウント選択画面を表示できるよう、Credential Managerの状態も消去するとよいでしょう。サインアウト後、currentUserはnullになります。
import com.google.firebase.Firebase
import com.google.firebase.auth.auth
fun logout() {
Firebase.auth.signOut()
// currentUser is now null; your AuthStateListener fires
}認証エラーを処理する
認証に失敗すると、種類が指定された例外がスローされるため、種類ごとに処理を分岐できます。
FirebaseAuthInvalidUserException— ユーザーが存在しない、または無効になっている。FirebaseAuthInvalidCredentialsException— パスワードが間違っている、またはメールアドレスが不正。FirebaseAuthUserCollisionException— そのメールアドレスはすでに登録されている。
生のスタックトレースを表示するのではなく、これらをユーザーにわかりやすいメッセージに変換して表示します。
import com.google.firebase.auth.FirebaseAuthInvalidCredentialsException
import com.google.firebase.auth.FirebaseAuthUserCollisionException
fun messageFor(e: Throwable): String = when (e) {
is FirebaseAuthInvalidCredentialsException -> "Wrong email or password"
is FirebaseAuthUserCollisionException -> "That email is already in use"
else -> "Something went wrong, try again"
}理解度チェック
ユーザーがサインインまたはサインアウトしたとき、ログイン画面とホーム画面を自動的に切り替えたいとします。最も適切な方法は何でしょうか。
まとめ:認証
これでFirebaseを使ってユーザーを認証できるようになりました。
- コンソールでプロバイダを有効にし、Google用のSHA-1を追加します。
Firebase.authとcreateUserWithEmailAndPassword/signInWithEmailAndPasswordを使用します。- Googleサインインでは、IDトークンを取得し、
GoogleAuthProviderの認証情報を作成して、signInWithCredentialを呼び出します。 currentUserで本人確認情報を読み取ります(データのキーにはuidを使用します)。- AuthStateListenerで状態の変化に反応し、
signOut()でサインアウトします。
次は、そのユーザーのデータをCloud Firestoreに保存します。
よくある質問
「Firebase Authentication」レッスンは無料ですか?
はい。「Firebase Authentication」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Android Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Android Academyコースには全4レッスンが含まれています。
「Firebase Authentication」で何を学びますか?
メールアドレスとGoogleによるサインインを実装します。 ブラウザで直接実行するハンズオンコードでAndroid Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Android Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのAndroid Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「Firebase Authentication」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このAndroid Academyレッスンでコードを書いて実行できますか?
はい。すべてのAndroid Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Firebaseのセットアップ
- Firebase Authentication
- Cloud Firestoreの基本
- Cloud Messagingでプッシュ通知