Android で電話番号を使用して Firebase 認証を行う

Firebase Authentication を使用してユーザーのスマートフォンに SMS メッセージを送信することで、ユーザーはログインすることができます。ユーザーは SMS メッセージに記載されたワンタイム コードを使用してログインします。

電話番号ログインをアプリに追加する最も簡単な方法は、FirebaseUI を使用することです。このライブラリには、電話番号ログインのほか、パスワードに基づくログインやフェデレーション ログインのログインフローを実装するドロップイン式のログイン ウィジェットが含まれています。このドキュメントでは、Firebase SDK を使用して電話番号ログインフローを実装する方法について説明します。

始める前に

  1. まだ Firebase を Android プロジェクトに追加していない場合は追加します。
  2. モジュール(アプリレベル)の Gradle ファイル(通常は <project>/<app-module>/build.gradle.kts または <project>/<app-module>/build.gradle)に、Firebase Authentication Android ライブラリの依存関係を追加します。ライブラリのバージョニングの制御には、Firebase Android 部品構成表(BoM)を使用することをおすすめします。

    Kotlin+KTX

    dependencies {
        // Import the BoM for the Firebase platform
        implementation(platform("com.google.firebase:firebase-bom:32.3.1"))
    
        // 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-ktx")
    }
    

    Firebase Android 部品構成表を使用すると、アプリは常に互換性のあるバージョンの 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-ktx:22.1.2")
    }
    

    Java

    dependencies {
        // Import the BoM for the Firebase platform
        implementation(platform("com.google.firebase:firebase-bom:32.3.1"))
    
        // 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 部品構成表を使用すると、アプリは常に互換性のあるバージョンの 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:22.1.2")
    }
    
  3. アプリを Firebase プロジェクトに接続していない場合は、Firebase コンソールで接続します。
  4. アプリの SHA-1 ハッシュを Firebase コンソールにまだ設定していない場合は設定します。アプリの SHA-1 ハッシュを見つける方法についてはクライアントの認証をご覧ください。

セキュリティに関する懸念

電話番号の所有権はユーザー間で簡単に移転できるため、電話番号のみを使用する認証は便利である反面、セキュリティ面では他の認証方法より劣ります。また、複数のユーザー プロフィールを持つデバイスでは、SMS メッセージを受信できるすべてのユーザーが、デバイスの電話番号を使用してアカウントにログインできます。

アプリで電話番号ベースのログインを使用する場合は、よりセキュリティの高いログイン方法も同時に提供し、電話番号ログインを使用した場合のセキュリティ面での懸念をユーザーに通知する必要があります。

Firebase プロジェクトで電話番号ログインを有効にする

ユーザーが SMS を介してログインできるようにするには、まず Firebase プロジェクトで電話番号ログイン方法を有効にする必要があります。

  1. Firebase コンソールで [Authentication] セクションを開きます。
  2. [Sign-in method] ページで、[電話番号] のログイン方法を有効にします。

Firebase の電話番号ログイン リクエストの割り当ては、ほとんどのアプリにとっては十分な量です。ただし、大量のユーザーが電話認証でログインできるようにする場合は、料金プランをアップグレードしなければならないことがあります。料金ページをご覧ください。

アプリの確認を有効にする

電話番号認証を使用するには、アプリから送信される電話番号ログイン リクエストを、Firebase が検証できるようにしなければなりません。Firebase Authentication でこれを可能にするには、次の 3 つの方法があります。

  • Play Integrity API: Google Play 開発者サービスがインストールされているデバイスをユーザーが使用していて、Firebase Authentication でそのデバイスが Play Integrity API によって正規のものであると検証できる場合は、電話番号によるログインを続行できます。Play Integrity API は、開発者のプロジェクトではなく、Firebase Authentication によって Google 所有のプロジェクトで有効になっています。これは、開発者のプロジェクトの Play Integrity API の割り当てに影響しません。Play Integrity は Authentication SDK v21.2.0 以降(Firebase BoM v31.4.0 以降)でサポートされています。

    Play Integrity を使用するには、アプリの SHA-256 フィンガープリントを指定していない場合は Firebase コンソールの [プロジェクトの設定] で指定します。アプリの SHA-256 フィンガープリントを取得する方法の詳細については、クライアントの認証をご覧ください。

  • reCAPTCHA による確認: Play Integrity API を使用できない場合(ユーザーがデバイスに Google Play 開発者サービスをインストールしていない場合など)、Firebase Authentication は reCAPTCHA による確認を使用して電話番号ログインフロー行います。通常、reCAPTCHA による確認を完了するためにユーザーが解決しなければならないものはありません。このフローでは、SHA-1 がアプリケーションに関連付けられている必要があります。また、このフローでは、API キーに制限が設定されていないか、API キーが PROJECT_ID.firebaseapp.com の許可リストに含まれている必要があります。

    reCAPTCHA がトリガーされるシナリオの例を次に示します。

    • エンドユーザーのデバイスに Google Play 開発者サービスがインストールされていない場合。
    • Authentication SDK v21.2.0 以降で)アプリが Google Play ストアを通じて配布されたものでない場合。
    • (Authentication SDK バージョン v21.2.0 より前で)取得した SafetyNet トークンが有効でない場合。

    アプリの確認に SafetyNet または Play Integrity を使用する場合、SMS テンプレートの %APP_NAME% フィールドに、Google Play ストアで特定されているアプリ名が入力されます。reCAPTCHA がトリガーされるシナリオでは、%APP_NAME%PROJECT_ID.firebaseapp.com として入力されます。

forceRecaptchaFlowForTesting を使用して、reCAPTCHA による確認フローを強制的に実行できます。setAppVerificationDisabledForTesting を使用して、アプリの確認を無効にできます(架空の電話番号を使用する場合)。

トラブルシューティング

  • アプリの確認に reCAPTCHA を使用する際に「Missing initial state(初期状態がありません)」というエラーが表示される

    このエラーは、reCAPTCHA フローが正常に完了したにもかかわらず、ユーザーがネイティブ アプリにリダイレクトされなかった場合に発生することがあります。このエラーが発生した場合、ユーザーはフォールバック URL PROJECT_ID.firebaseapp.com/__/auth/handler にリダイレクトされます。Firefox ブラウザでは、ネイティブ アプリ リンクを開く操作はデフォルトで無効になっています。Firefox で上記のエラーが表示された場合は、Android 版 Firefox でネイティブ アプリでリンクを開くように設定するの手順に沿って、アプリリンクを開いてください。

ユーザーの電話に確認コードを送信する

電話番号ログインを開始するには、電話番号の入力を求めるインターフェースをユーザーに表示します。法的要件はさまざまに異なりますが、電話番号ログインを使用する場合は確認用の SMS メッセージが送られる旨、それには標準料金がかかる旨をユーザーにあらかじめ知らせることをおすすめします。

次に、電話番号を PhoneAuthProvider.verifyPhoneNumber メソッドに渡して、ユーザーの電話番号を確認するよう Firebase にリクエストします。例:

Kotlin+KTX

val options = PhoneAuthOptions.newBuilder(auth)
    .setPhoneNumber(phoneNumber) // Phone number to verify
    .setTimeout(60L, TimeUnit.SECONDS) // Timeout and unit
    .setActivity(this) // Activity (for callback binding)
    .setCallbacks(callbacks) // OnVerificationStateChangedCallbacks
    .build()
PhoneAuthProvider.verifyPhoneNumber(options)

Java

PhoneAuthOptions options = 
  PhoneAuthOptions.newBuilder(mAuth) 
      .setPhoneNumber(phoneNumber)       // Phone number to verify
      .setTimeout(60L, TimeUnit.SECONDS) // Timeout and unit
      .setActivity(this)                 // (optional) Activity for callback binding
      // If no activity is passed, reCAPTCHA verification can not be used.
      .setCallbacks(mCallbacks)          // OnVerificationStateChangedCallbacks
      .build();
  PhoneAuthProvider.verifyPhoneNumber(options);     

verifyPhoneNumber メソッドはリエントラントです。たとえば、アクティビティの onStart メソッドなどで複数回呼び出された場合でも、元のリクエストがタイムアウトしていなければ、verifyPhoneNumber メソッドから 2 番目の SMS は送信されません。

この動作を利用して、ユーザーがログインする前にアプリが終了した場合でも(たとえばユーザーが SMS のアプリを使用している間など)、電話番号のログイン プロセスを再開できます。verifyPhoneNumber を呼び出した後で、確認中を示すフラグを設定します。次に、アクティビティの onSaveInstanceState メソッドでフラグを保存したら、フラグを onRestoreInstanceState で復元します。最後に、アクティビティの onStart メソッドで、確認が実行されているところかどうかをチェックし、実行中の場合は verifyPhoneNumber を再度呼び出します。確認が完了または失敗した場合は、必ずフラグをクリアしてください(詳しくは確認のコールバックをご覧ください)。

画面の回転など、アクティビティを再起動するインスタンスを簡単に扱うには、アクティビティを verifyPhoneNumber メソッドに渡します。アクティビティが停止するとコールバックは自動的に接続解除されるので、UI 遷移コードをコールバック メソッドに自由に書き込むことができます。

Firebase によって送信された SMS メッセージは、Auth インスタンスの setLanguageCode メソッドを使用して認証言語を指定することによってローカライズすることもできます。

Kotlin+KTX

auth.setLanguageCode("fr")
// To apply the default app language instead of explicitly setting it.
// auth.useAppLanguage()

Java

auth.setLanguageCode("fr");
// To apply the default app language instead of explicitly setting it.
// auth.useAppLanguage();

PhoneAuthProvider.verifyPhoneNumber を呼び出すときは、リクエストの結果を処理するコールバック関数の実装を含む、OnVerificationStateChangedCallbacks のインスタンスも指定する必要があります。例:

Kotlin+KTX

callbacks = object : PhoneAuthProvider.OnVerificationStateChangedCallbacks() {

    override fun onVerificationCompleted(credential: PhoneAuthCredential) {
        // This callback will be invoked in two situations:
        // 1 - Instant verification. In some cases the phone number can be instantly
        //     verified without needing to send or enter a verification code.
        // 2 - Auto-retrieval. On some devices Google Play services can automatically
        //     detect the incoming verification SMS and perform verification without
        //     user action.
        Log.d(TAG, "onVerificationCompleted:$credential")
        signInWithPhoneAuthCredential(credential)
    }

    override fun onVerificationFailed(e: FirebaseException) {
        // This callback is invoked in an invalid request for verification is made,
        // for instance if the the phone number format is not valid.
        Log.w(TAG, "onVerificationFailed", e)

        if (e is FirebaseAuthInvalidCredentialsException) {
            // Invalid request
        } else if (e is FirebaseTooManyRequestsException) {
            // The SMS quota for the project has been exceeded
        } else if (e is FirebaseAuthMissingActivityForRecaptchaException) {
            // reCAPTCHA verification attempted with null Activity
        }

        // Show a message and update the UI
    }

    override fun onCodeSent(
        verificationId: String,
        token: PhoneAuthProvider.ForceResendingToken,
    ) {
        // The SMS verification code has been sent to the provided phone number, we
        // now need to ask the user to enter the code and then construct a credential
        // by combining the code with a verification ID.
        Log.d(TAG, "onCodeSent:$verificationId")

        // Save verification ID and resending token so we can use them later
        storedVerificationId = verificationId
        resendToken = token
    }
}

Java

mCallbacks = new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {

    @Override
    public void onVerificationCompleted(@NonNull PhoneAuthCredential credential) {
        // This callback will be invoked in two situations:
        // 1 - Instant verification. In some cases the phone number can be instantly
        //     verified without needing to send or enter a verification code.
        // 2 - Auto-retrieval. On some devices Google Play services can automatically
        //     detect the incoming verification SMS and perform verification without
        //     user action.
        Log.d(TAG, "onVerificationCompleted:" + credential);

        signInWithPhoneAuthCredential(credential);
    }

    @Override
    public void onVerificationFailed(@NonNull FirebaseException e) {
        // This callback is invoked in an invalid request for verification is made,
        // for instance if the the phone number format is not valid.
        Log.w(TAG, "onVerificationFailed", e);

        if (e instanceof FirebaseAuthInvalidCredentialsException) {
            // Invalid request
        } else if (e instanceof FirebaseTooManyRequestsException) {
            // The SMS quota for the project has been exceeded
        } else if (e instanceof FirebaseAuthMissingActivityForRecaptchaException) {
            // reCAPTCHA verification attempted with null Activity
        }

        // Show a message and update the UI
    }

    @Override
    public void onCodeSent(@NonNull String verificationId,
                           @NonNull PhoneAuthProvider.ForceResendingToken token) {
        // The SMS verification code has been sent to the provided phone number, we
        // now need to ask the user to enter the code and then construct a credential
        // by combining the code with a verification ID.
        Log.d(TAG, "onCodeSent:" + verificationId);

        // Save verification ID and resending token so we can use them later
        mVerificationId = verificationId;
        mResendToken = token;
    }
};

確認のコールバック

ほとんどのアプリにおいて、onVerificationCompletedonVerificationFailedonCodeSent のコールバックを実装することになります。アプリの要件によっては、onCodeAutoRetrievalTimeOut も実装することになる場合があります。

onVerificationCompleted(PhoneAuthCredential)

このメソッドは、次の 2 つの状況で呼び出されます。

  • 即時確認: 確認コードを送信または入力することなく電話番号を即座に確認することができる場合があります。
  • 自動取得: 一部のデバイスでは、受信した確認 SMS を Google Play 開発者サービスが自動的に検出して確認を行うことができます。この場合、ユーザーの操作は不要です(この機能は、一部の携帯通信会社では使用できない場合があります)。これには、SMS メッセージの末尾に 11 文字のハッシュを記載する SMS Retriever API が使用されます。
いずれの場合も、ユーザーの電話番号が正常に確認されたら、コールバックに渡された PhoneAuthCredential オブジェクトを使用してユーザーのログインを行うことができます。

onVerificationFailed(FirebaseException)

このメソッドは、無効な確認リクエスト(無効な電話番号や確認コードが指定されたリクエストなど)に対するレスポンスとして呼び出されます。

onCodeSent(String verificationId, PhoneAuthProvider.ForceResendingToken)

省略可。このメソッドは、確認コードが指定の電話番号に SMS で送信された後で呼び出されます。

このメソッドが呼び出されると、ほとんどのアプリでは、SMS メッセージに示されている確認コードの入力をユーザーに要求する UI が表示されます(これと同時に、バックグラウンドで自動確認が処理されている場合があります)。次に、ユーザーが確認コードを入力したら、メソッドに渡された確認コードと確認 ID を使用して PhoneAuthCredential オブジェクトを生成し、これをユーザーのログインに使用できます。アプリによっては、onCodeAutoRetrievalTimeOut が呼び出されるのを待ってから確認コードの UI を表示する場合がありますが、これは推奨されません。

onCodeAutoRetrievalTimeOut(String verificationId)

省略可。このメソッドは、onVerificationCompleted がトリガーされずに、verifyPhoneNumber に指定されているタイムアウト時間が経過した場合に呼び出されます。SIM カードが挿入されていないデバイスでは、SMS の自動取得を実行できないため、このメソッドが直ちに呼び出されます。

一部のアプリでは、自動確認時間がタイムアウトになるまでユーザーの入力はブロックされ、その後で SMS メッセージに示されている確認コードの入力をユーザーに要求する UI が表示されますが、これは推奨されません。

PhoneAuthCredential オブジェクトを作成する

Firebase からユーザーのスマートフォンに送信された確認コードをユーザーが入力したら、確認コードと onCodeSent または onCodeAutoRetrievalTimeOut コールバックに渡された確認 ID を使用して、PhoneAuthCredential オブジェクトを作成します。(onVerificationCompleted が呼び出された場合は PhoneAuthCredential オブジェクトが直接取得されるため、この手順はスキップできます)。

PhoneAuthCredential オブジェクトを作成するには PhoneAuthProvider.getCredential を呼び出します。

Kotlin+KTX

val credential = PhoneAuthProvider.getCredential(verificationId!!, code)

Java

PhoneAuthCredential credential = PhoneAuthProvider.getCredential(verificationId, code);

ユーザーのログインを行う

PhoneAuthCredential オブジェクトを取得したら、onVerificationCompleted コールバックを使用するか、PhoneAuthProvider.getCredential を呼び出して、PhoneAuthCredential オブジェクトを FirebaseAuth.signInWithCredential に渡しログインフローを完了します。

Kotlin+KTX

private fun signInWithPhoneAuthCredential(credential: PhoneAuthCredential) {
    auth.signInWithCredential(credential)
        .addOnCompleteListener(this) { task ->
            if (task.isSuccessful) {
                // Sign in success, update UI with the signed-in user's information
                Log.d(TAG, "signInWithCredential:success")

                val user = task.result?.user
            } else {
                // Sign in failed, display a message and update the UI
                Log.w(TAG, "signInWithCredential:failure", task.exception)
                if (task.exception is FirebaseAuthInvalidCredentialsException) {
                    // The verification code entered was invalid
                }
                // Update UI
            }
        }
}

Java

private void signInWithPhoneAuthCredential(PhoneAuthCredential credential) {
    mAuth.signInWithCredential(credential)
            .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, "signInWithCredential:success");

                        FirebaseUser user = task.getResult().getUser();
                        // Update UI
                    } else {
                        // Sign in failed, display a message and update the UI
                        Log.w(TAG, "signInWithCredential:failure", task.getException());
                        if (task.getException() instanceof FirebaseAuthInvalidCredentialsException) {
                            // The verification code entered was invalid
                        }
                    }
                }
            });
}

架空の電話番号でテストする

Firebase コンソールを使用して、開発用の架空の電話番号を設定できます。架空の電話番号でテストすると、次のメリットがあります。

  • 使用量の割り当てを消費することなく電話番号認証をテストできます。
  • 実際の SMS メッセージを送信することなく電話番号認証をテストできます。
  • 同じ電話番号で連続してテストを実施してもスロットルが発生しません。このため、レビュー担当者が偶発的にテストに同じ電話番号を使用しても、アプリストアのレビュー プロセス中に拒否されるリスクが最小限に抑えられます。
  • 追加の作業を必要とせずに開発環境で簡単にテストできます。たとえば、Google Play 開発者サービスを使用せずに iOS シミュレータや Android Emulator で開発できます。
  • セキュリティ チェックによるブロックが生じない統合テストを作成できます。通常、本番環境の実際の電話番号にはセキュリティ チェックが適用されます。

架空の電話番号は、次の要件を満たしている必要があります。

  1. 間違いなく架空で、存在していない電話番号を使用します。Firebase Authentication では、実際のユーザーが使用している既存の電話番号をテスト番号として設定することはできません。1 つの選択肢としては、+1 650-555-3434 のように、555 プレフィックス付きの番号を米国のテスト電話番号として使用します。
  2. 長さなどの制約に関して、正しい形式の電話番号を使用する必要があります。番号には、実際のユーザーの電話番号と同じ検証が行われます。
  3. 開発用に最大 10 個の電話番号を追加できます。
  4. 推測が困難なテスト用の電話番号やコードを使用し、頻繁に変更してください。

架空の電話番号と確認コードを作成する

  1. Firebase コンソールで [Authentication] セクションを開きます。
  2. [Sign-in method] タブで、[電話番号] をまだ有効にしていない場合は有効にします。
  3. [テスト用の電話番号] アコーディオン メニューを開きます。
  4. テストする電話番号を入力します(例: +1 650-555-3434)。
  5. 特定の番号用の 6 桁の確認コードを入力します(例: 654321)。
  6. 番号を追加します。必要に応じて、電話番号の対応する行にカーソルを合わせてゴミ箱アイコンをクリックすると、電話番号とそのコードを削除できます。

手動テスト

架空の電話番号をアプリケーションで直接使用できます。これにより、割り当ての問題やスロットルを発生させることなく、開発段階で手動テストを実施できます。また、Google Play 開発者サービスをインストールすることなく、iOS シミュレータや Android Emulator から直接テストすることもできます。

架空の電話番号を指定して確認コードを送信しても、実際の SMS は送信されません。代わりに、以前に構成した確認コードを入力してログインを完了する必要があります。

ログインが完了すると、その電話番号を使用して Firebase ユーザーが作成されます。そのユーザーの動作やプロパティは実際の電話番号のユーザーと同じであり、また同じ方法で Realtime Database や Cloud Firestore などのサービスにアクセスできます。このプロセス中に作成された ID トークンには、実際の電話番号のユーザーと同じ署名が含まれます。

別の選択肢としては、アクセス制限をさらに厳格にする場合、これらのユーザーにカスタム クレームを介してテスト役割を設定して、架空のユーザーとして区別します。

reCAPTCHA フローを手動でトリガーしてテストするには、forceRecaptchaFlowForTesting() メソッドを使用します。

// Force reCAPTCHA flow
FirebaseAuth.getInstance().getFirebaseAuthSettings().forceRecaptchaFlowForTesting();

統合テスト

Firebase Authentication には、手動テスト以外にも、スマートフォン認証テスト用の統合テストの作成に役立つ API が用意されています。これらの API は、ウェブの reCAPTCHA の要件や iOS のサイレント プッシュ通知を無効にすることで、アプリの確認を無効にします。これにより、これらのフローで自動テストを実施でき、実装が容易になります。また、Android で即時確認のフローをテストするための機能も備わっています。

Android では、signInWithPhoneNumber 呼び出しの前に setAppVerificationDisabledForTesting() を呼び出します。これによりアプリの確認が自動的に無効になるため、手動で解決せずに電話番号を渡すことができます。Play Integrity と reCAPTCHA が無効になっている場合であっても、実際の電話番号を使用するとログインが完了しません。この API では、架空の電話番号のみ使用できます。

// Turn off phone auth app verification.
FirebaseAuth.getInstance().getFirebaseAuthSettings()
   .setAppVerificationDisabledForTesting();

架空の番号を使用して verifyPhoneNumber を呼び出すと、onCodeSent コールバックが呼ばれ、対応する確認コードを提供する必要が生じます。これにより、Android Emulatorsでのテストが可能になります。

Java

String phoneNum = "+16505554567";
String testVerificationCode = "123456";

// Whenever verification is triggered with the whitelisted number,
// provided it is not set for auto-retrieval, onCodeSent will be triggered.
FirebaseAuth auth = FirebaseAuth.getInstance();
PhoneAuthOptions options = PhoneAuthOptions.newBuilder(auth)
        .setPhoneNumber(phoneNum)
        .setTimeout(60L, TimeUnit.SECONDS)
        .setActivity(this)
        .setCallbacks(new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
            @Override
            public void onCodeSent(@NonNull String verificationId,
                                   @NonNull PhoneAuthProvider.ForceResendingToken forceResendingToken) {
                // Save the verification id somewhere
                // ...

                // The corresponding whitelisted code above should be used to complete sign-in.
                MainActivity.this.enableUserManuallyInputCode();
            }

            @Override
            public void onVerificationCompleted(@NonNull PhoneAuthCredential phoneAuthCredential) {
                // Sign in with the credential
                // ...
            }

            @Override
            public void onVerificationFailed(@NonNull FirebaseException e) {
                // ...
            }
        })
        .build();
PhoneAuthProvider.verifyPhoneNumber(options);

Kotlin+KTX

val phoneNum = "+16505554567"
val testVerificationCode = "123456"

// Whenever verification is triggered with the whitelisted number,
// provided it is not set for auto-retrieval, onCodeSent will be triggered.
val options = PhoneAuthOptions.newBuilder(Firebase.auth)
    .setPhoneNumber(phoneNum)
    .setTimeout(30L, TimeUnit.SECONDS)
    .setActivity(this)
    .setCallbacks(object : PhoneAuthProvider.OnVerificationStateChangedCallbacks() {

        override fun onCodeSent(
            verificationId: String,
            forceResendingToken: PhoneAuthProvider.ForceResendingToken,
        ) {
            // Save the verification id somewhere
            // ...

            // The corresponding whitelisted code above should be used to complete sign-in.
            this@MainActivity.enableUserManuallyInputCode()
        }

        override fun onVerificationCompleted(phoneAuthCredential: PhoneAuthCredential) {
            // Sign in with the credential
            // ...
        }

        override fun onVerificationFailed(e: FirebaseException) {
            // ...
        }
    })
    .build()
PhoneAuthProvider.verifyPhoneNumber(options)

さらに、setAutoRetrievedSmsCodeForPhoneNumber を呼び出して、架空の番号とそれに対応する確認コードを自動取得用に設定すると、Android で自動取得のフローをテストできます。

verifyPhoneNumber が呼び出されると、PhoneAuthCredential を使用して onVerificationCompleted が直接呼ばれます。この動作は、架空の電話番号でのみ機能します。

アプリケーションを Google Play ストアで公開する際には、この動作が無効になっていること、および架空の電話番号がアプリにハードコードされていないことを確認してください。

Java

// The test phone number and code should be whitelisted in the console.
String phoneNumber = "+16505554567";
String smsCode = "123456";

FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();
FirebaseAuthSettings firebaseAuthSettings = firebaseAuth.getFirebaseAuthSettings();

// Configure faking the auto-retrieval with the whitelisted numbers.
firebaseAuthSettings.setAutoRetrievedSmsCodeForPhoneNumber(phoneNumber, smsCode);

PhoneAuthOptions options = PhoneAuthOptions.newBuilder(firebaseAuth)
        .setPhoneNumber(phoneNumber)
        .setTimeout(60L, TimeUnit.SECONDS)
        .setActivity(this)
        .setCallbacks(new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
            @Override
            public void onVerificationCompleted(@NonNull PhoneAuthCredential credential) {
                // Instant verification is applied and a credential is directly returned.
                // ...
            }

            // ...
        })
        .build();
PhoneAuthProvider.verifyPhoneNumber(options);

Kotlin+KTX

// The test phone number and code should be whitelisted in the console.
val phoneNumber = "+16505554567"
val smsCode = "123456"

val firebaseAuth = Firebase.auth
val firebaseAuthSettings = firebaseAuth.firebaseAuthSettings

// Configure faking the auto-retrieval with the whitelisted numbers.
firebaseAuthSettings.setAutoRetrievedSmsCodeForPhoneNumber(phoneNumber, smsCode)

val options = PhoneAuthOptions.newBuilder(firebaseAuth)
    .setPhoneNumber(phoneNumber)
    .setTimeout(60L, TimeUnit.SECONDS)
    .setActivity(this)
    .setCallbacks(object : PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
        override fun onVerificationCompleted(credential: PhoneAuthCredential) {
            // Instant verification is applied and a credential is directly returned.
            // ...
        }

        // ...
    })
    .build()
PhoneAuthProvider.verifyPhoneNumber(options)

次のステップ

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

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

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

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

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

Kotlin+KTX

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();