Android でパスワード ベースのアカウントを使用して Firebase 認証を行う

Firebase Authentication を使用することで、ユーザーが Firebase での認証にメールアドレスとパスワードを使用できるようにし、アプリのパスワード ベースのアカウントを管理できます。

始める前に

  1. まだ Firebase を Android プロジェクトに追加していない場合は追加します。

  2. アプリを Firebase プロジェクトに接続していない場合は、Firebase コンソールで接続します。
  3. メールアドレスとパスワードによるログインを有効にします。
    1. Firebase コンソールで [Auth] セクションを開きます。
    2. [ログイン方法] タブで [メール / パスワード] を有効にして、[保存] をクリックします。
  4. モジュール(アプリレベル)の Gradle ファイル(通常は <project>/<app-module>/build.gradle.kts または <project>/<app-module>/build.gradle)に、Android 用 Firebase Authentication ライブラリの依存関係を追加します。ライブラリのバージョニングの制御には、Firebase Android BoM を使用することをおすすめします。

    dependencies {
        // Import the BoM for the Firebase platform
        implementation(platform("com.google.firebase:firebase-bom:33.4.0"))
    
        // Add the dependency for the Firebase Authentication library
        // When using the BoM, you don't specify versions in Firebase library dependencies
        implementation("com.google.firebase:firebase-auth")
    }
    

    Firebase Android BoM を使用すると、アプリは常に互換性のあるバージョンの Firebase Android ライブラリを使用します。

    (代替方法)BoM を使用せずに Firebase ライブラリの依存関係を追加する

    Firebase BoM を使用しない場合は、依存関係の行でそれぞれの Firebase ライブラリのバージョンを指定する必要があります。

    アプリで複数の Firebase ライブラリを使用する場合は、すべてのバージョンの互換性を確保するため、BoM を使用してライブラリのバージョンを管理することを強くおすすめします。

    dependencies {
        // Add the dependency for the Firebase Authentication library
        // When NOT using the BoM, you must specify versions in Firebase library dependencies
        implementation("com.google.firebase:firebase-auth:23.0.0")
    }
    
    Kotlin 固有のライブラリ モジュールをお探しの場合、 2023 年 10 月(Firebase BoM 32.5.0)以降、Kotlin と Java のどちらのデベロッパーもメイン ライブラリ モジュールを利用できるようになります(詳しくは、このイニシアチブに関するよくある質問をご覧ください)。

パスワード ベースのアカウントを作成する

パスワードを使用する新しいユーザー アカウントを作成するには、アプリのログイン アクティビティで次の手順に沿って操作します。

  1. 登録アクティビティの onCreate メソッドで、FirebaseAuth オブジェクトの共有インスタンスを取得します。

    Kotlin+KTX

    private lateinit var auth: FirebaseAuth
    // ...
    // Initialize Firebase Auth
    auth = Firebase.auth

    Java

    private FirebaseAuth mAuth;
    // ...
    // Initialize Firebase Auth
    mAuth = FirebaseAuth.getInstance();
  2. アクティビティを初期化するときに、ユーザーが現在ログインしているかどうかを確認します。

    Kotlin+KTX

    public override fun onStart() {
        super.onStart()
        // Check if user is signed in (non-null) and update UI accordingly.
        val currentUser = auth.currentUser
        if (currentUser != null) {
            reload()
        }
    }

    Java

    @Override
    public void onStart() {
        super.onStart();
        // Check if user is signed in (non-null) and update UI accordingly.
        FirebaseUser currentUser = mAuth.getCurrentUser();
        if(currentUser != null){
            reload();
        }
    }
  3. 新しいユーザーがアプリの登録フォームを使用して登録したら、アプリで必要な新しいアカウントの検証手順(新しいアカウントのパスワードが正しく入力されていることや、パスワードの複雑さの要件を満たしているかの確認など)を行います。
  4. 新しいユーザーのメールアドレスとパスワードを createUserWithEmailAndPassword に渡して、新しいアカウントを作成します。

    Kotlin+KTX

    auth.createUserWithEmailAndPassword(email, password)
        .addOnCompleteListener(this) { task ->
            if (task.isSuccessful) {
                // Sign in success, update UI with the signed-in user's information
                Log.d(TAG, "createUserWithEmail:success")
                val user = auth.currentUser
                updateUI(user)
            } else {
                // If sign in fails, display a message to the user.
                Log.w(TAG, "createUserWithEmail:failure", task.exception)
                Toast.makeText(
                    baseContext,
                    "Authentication failed.",
                    Toast.LENGTH_SHORT,
                ).show()
                updateUI(null)
            }
        }

    Java

    mAuth.createUserWithEmailAndPassword(email, password)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        // Sign in success, update UI with the signed-in user's information
                        Log.d(TAG, "createUserWithEmail:success");
                        FirebaseUser user = mAuth.getCurrentUser();
                        updateUI(user);
                    } else {
                        // If sign in fails, display a message to the user.
                        Log.w(TAG, "createUserWithEmail:failure", task.getException());
                        Toast.makeText(EmailPasswordActivity.this, "Authentication failed.",
                                Toast.LENGTH_SHORT).show();
                        updateUI(null);
                    }
                }
            });
    新しいアカウントが作成されると、ユーザーのログインも行われます。コールバックでは、getCurrentUser メソッドを使用してユーザーのアカウント データを取得できます。

メールアドレスとパスワードを使用してユーザーのログインを行う

パスワードを使用したユーザーのログイン手順は、新しいアカウントの作成手順と似ています。アプリのログイン アクティビティでの手順は次のとおりです。

  1. ログイン アクティビティの onCreate メソッドで、FirebaseAuth オブジェクトの共有インスタンスを取得します。

    Kotlin+KTX

    private lateinit var auth: FirebaseAuth
    // ...
    // Initialize Firebase Auth
    auth = Firebase.auth

    Java

    private FirebaseAuth mAuth;
    // ...
    // Initialize Firebase Auth
    mAuth = FirebaseAuth.getInstance();
  2. アクティビティを初期化するときに、ユーザーが現在ログインしているかどうかを確認します。

    Kotlin+KTX

    public override fun onStart() {
        super.onStart()
        // Check if user is signed in (non-null) and update UI accordingly.
        val currentUser = auth.currentUser
        if (currentUser != null) {
            reload()
        }
    }

    Java

    @Override
    public void onStart() {
        super.onStart();
        // Check if user is signed in (non-null) and update UI accordingly.
        FirebaseUser currentUser = mAuth.getCurrentUser();
        if(currentUser != null){
            reload();
        }
    }
  3. ユーザーがアプリにログインしたら、そのユーザーのメールアドレスとパスワードを signInWithEmailAndPassword に渡します。

    Kotlin+KTX

    auth.signInWithEmailAndPassword(email, password)
        .addOnCompleteListener(this) { task ->
            if (task.isSuccessful) {
                // Sign in success, update UI with the signed-in user's information
                Log.d(TAG, "signInWithEmail:success")
                val user = auth.currentUser
                updateUI(user)
            } else {
                // If sign in fails, display a message to the user.
                Log.w(TAG, "signInWithEmail:failure", task.exception)
                Toast.makeText(
                    baseContext,
                    "Authentication failed.",
                    Toast.LENGTH_SHORT,
                ).show()
                updateUI(null)
            }
        }

    Java

    mAuth.signInWithEmailAndPassword(email, password)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        // Sign in success, update UI with the signed-in user's information
                        Log.d(TAG, "signInWithEmail:success");
                        FirebaseUser user = mAuth.getCurrentUser();
                        updateUI(user);
                    } else {
                        // If sign in fails, display a message to the user.
                        Log.w(TAG, "signInWithEmail:failure", task.getException());
                        Toast.makeText(EmailPasswordActivity.this, "Authentication failed.",
                                Toast.LENGTH_SHORT).show();
                        updateUI(null);
                    }
                }
            });
    ログインが成功したら、返された FirebaseUser を使用して処理を進めることができます。

推奨: パスワード ポリシーを設定する

パスワードの複雑さの要件を適用することで、アカウントのセキュリティを強化できます。

プロジェクトのパスワード ポリシーを構成するには、Firebase コンソールの [認証設定] ページで [パスワード ポリシー] タブを開きます。

認証の設定

Firebase Authentication パスワード ポリシーは、次のパスワード要件をサポートしています。

  • 小文字は必須です

  • 大文字は必須です

  • 数字は必須です

  • 英数字以外の文字は必須です

    次の文字は英数字以外の文字の要件を満たします。 ^ $ * . [ ] { } ( ) ? " ! @ # % & / \ , > < ' : ; | _ ~

  • パスワードの最小文字数(6~30 文字。デフォルトは 6)

  • パスワードの最大文字数(最大 4,096 文字)

パスワード ポリシーの適用は、次の 2 つのモードで有効にできます。

  • 必須: ユーザーがポリシーに準拠したパスワードに更新するまで、ログインの試行は失敗します。

  • 通知: ユーザーは遵守していないパスワードを使用してログインできます。このモードを使用する場合は、ユーザーのパスワードがクライアント側でポリシーに準拠しているかどうかを確認し、準拠していない場合はパスワードを更新するようユーザーに何らかの方法でプロンプトを表示する必要があります。

新規ユーザーは、常にポリシーに準拠したパスワードを選択する必要があります。

アクティブ ユーザーがいる場合は、パスワードがポリシーに準拠していないユーザーへのアクセスをブロックする場合を除き、必須モードを有効にしないことをおすすめします。代わりに、通知モードを使用します。これにより、ユーザーは現在のパスワードでログインし、パスワードに関する要件を詳しく説明した通知が送信されます。

推奨: メール列挙保護を有効にする

メールアドレスをパラメータとして受け取る Firebase Authentication メソッドの中には、メールアドレスが登録されている必要がある処理(たとえばメールアドレスとパスワードを使用してログインするなど)においてメールアドレスが未登録である場合、またはメールアドレスが未使用であることが必要な処理(たとえばユーザーのメールアドレスを変更するなど)においてメールアドレスが登録済みである場合に、特定のエラーをスローするものがあります。これは、ユーザーに具体的な解決策を提示するのに役立つ一方で、ユーザーが登録したメールアドレスを検出するために悪意のあるアクターによって悪用される可能性もあります。

このリスクを軽減するため、Google Cloud の gcloud ツールを使用して、プロジェクトでメール列挙保護を有効にすることをおすすめします。この機能を有効にすると Firebase Authentication のエラーレポートの動作が変わるため、アプリが具体的なエラーに依存しないように注意してください。

次のステップ

ユーザーが初めてログインすると、新しいユーザー アカウントが作成され、ユーザーがログイン時に使用した認証情報(ユーザー名とパスワード、電話番号、または認証プロバイダ情報)にアカウントがリンクされます。この新しいアカウントは Firebase プロジェクトの一部として保存され、ユーザーのログイン方法にかかわらず、プロジェクトのすべてのアプリでユーザーを識別するために使用できます。

  • アプリでは、FirebaseUser オブジェクトからユーザーの基本的なプロフィール情報を取得できます。ユーザーを管理するをご覧ください。

  • Firebase Realtime DatabaseCloud Storageセキュリティ ルールでは、ログイン済みユーザーの一意のユーザー ID を auth 変数から取得し、それを使用して、ユーザーがアクセスできるデータを制御できます。

既存のユーザー アカウントに認証プロバイダの認証情報をリンクすることで、ユーザーは複数の認証プロバイダを使用してアプリにログインできるようになります。

ユーザーのログアウトを行うには、signOut を呼び出します。

Kotlin+KTX

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();