0Pricing
Android Academy · レッスン

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Firebaseのセットアップ
  2. Firebase Authentication
  3. Cloud Firestoreの基本
  4. Cloud Messagingでプッシュ通知
← Android Academyに戻る