Google は、黒人コミュニティのための人種的公平の促進に取り組んでいます。詳細をご覧ください。

アプリを認証エミュレーターに接続します

アプリで認証エミュレーターを使用する前に、 Firebase Local Emulator Suiteワークフロー全体理解し、Local Emulator Suiteインストールして構成し、そのCLIコマンドを確認してください。

認証エミュレータで何ができますか?

Authentication エミュレーターは、Firebase Authentication サービスの忠実度の高いローカル エミュレーションを提供し、本番環境の Firebase Authentication に見られる機能の多くを提供します。 iOS、Android、ウェブのFirebase SDKと組み合わせると、エミュレーターで次のことが可能になります。

  • E メール/パスワード、電話番号/SMS をテストし、サードパーティの ID プロバイダー (Google など) でサインインするために、エミュレートされたユーザー アカウントを作成、更新、および管理します。
  • エミュレートされたユーザーの表示と編集
  • [エミュレータUIログ]タブで認証関連のメッセージを確認します。

Firebaseプロジェクトを選択してください

Firebase Local Emulator Suiteは、単一のFirebaseプロジェクトの製品をエミュレートします。

使用するプロジェクトを選択するには、エミュレーターを起動する前に、CLIで作業ディレクトリでfirebase use実行します。または、各エミュレーター コマンドに--projectフラグを渡すことができます。

Local Emulator Suite は、実際のFirebase プロジェクトとデモプロジェクトのエミュレーションをサポートします。

プロジェクトタイプ特徴エミュレーターで使用
リアル実際のプロジェクトは、Firebase コンソールで構成してアクティブ化したものです。実際のプロジェクトには、データベース、ストレージバケット、関数、またはそのプロジェクト用に設定したその他のリソースなどのライブリソースがあります。実際のプロジェクトで作業する場合、プロジェクトでサポートされている製品のいずれかまたはすべてに対してエミュレーターを実行できます。

エミュレートしていない製品の場合、アプリとコードはライブデータベース、ストレージ バケット、関数などとやり取りします。
デモデモ プロジェクトには、Firebase コンソール構成もライブ リソースもありません。

デモプロジェクトIDにはdemo-プレフィックスが付いています。
デモプロジェクトで作業する場合、アプリとコードはエミュレーターとのみ対話します。アプリがエミュレーターが実行されていないリソースと対話すると、そのコードは失敗します。

可能な限り、デモプロジェクトを使用することをお勧めします。利点は次のとおりです。

  • Firebaseプロジェクトを作成せずにエミュレータを実行できるため、セットアップが簡単になります
  • コードが誤ってエミュレートされていない(本番)リソースを呼び出した場合、データの変更、使用、請求の可能性がないため、より強力な安全性
  • SDK構成をダウンロードするためにインターネットにアクセスする必要がないため、オフラインサポートが向上します。

認証エミュレーターと通信するようにアプリをインストルメント化する

Android、iOS、およびWeb SDK

次のように、アプリ内構成またはテスト クラスを設定して、認証エミュレーターと対話します。

アンドロイド
FirebaseAuth.getInstance().useEmulator('10.0.2.2', 9099);
iOS-Swift
Auth.auth().useEmulator(withHost:"localhost", port:9099)

Web v8

var auth = firebase.auth();
auth.useEmulator("http://localhost:9099");

ウェブ v9

import { getAuth, useAuthEmulator } from "firebase/auth";

const auth = getAuth();
useAuthEmulator(auth, "http://localhost:9099");

Authentication と Cloud Functions または Cloud Firestore または Realtime Database の Firebase セキュリティ ルールとの間の相互作用のプロトタイプを作成してテストするために、追加の設定は必要ありません。認証エミュレーターが構成され、他のエミュレーターが実行されている場合、それらは自動的に連携して動作します。

管理SDK

FIREBASE_AUTH_EMULATOR_HOST環境変数が設定されている場合、 FIREBASE_AUTH_EMULATOR_HOSTは自動的に認証エミュレータに接続します。

export FIREBASE_AUTH_EMULATOR_HOST="localhost:9099"

Cloud Functions エミュレーターは自動的に Authentication エミュレーターを認識するため、Cloud Functions と Authentication エミュレーター間の統合をテストするときにこのステップをスキップできることに注意してください。 Cloud Functions の Admin SDK に対して環境変数が自動的に設定されます。

環境変数を設定すると、Firebase Admin SDKは、認証エミュレーターによって発行された署名されていないIDトークンとセッションCookieを受け入れ(それぞれverifyIdTokenメソッドとcreateSessionCookieメソッドを介して)、ローカル開発とテストを容易にします。本番環境では環境変数を設定しないでください。

認証エミュレータに接続するときは、プロジェクトIDを指定する必要があります。プロジェクトIDを渡してinitializeApp直接実行するか、 GCLOUD_PROJECT環境変数を設定GCLOUD_PROJECTます。実際の Firebase プロジェクト ID を使用する必要はありません。認証エミュレーターはすべてのプロジェクトIDを受け入れます。

Node.js 管理 SDK
admin.initializeApp({ projectId: "your-project-id" });
環境変数
export GCLOUD_PROJECT="your-project-id"

IDトークン

セキュリティ上の理由から、認証エミュレータは署名されていないIDトークンを発行します。これは、他のFirebaseエミュレータ、または設定時にFirebase AdminSDKでのみ受け入れられます。これらのトークンは、本番モードで実行されている本番FirebaseサービスまたはFirebase Admin SDKによって拒否されます(たとえば、上記のセットアップ手順を使用しないデフォルトの動作)。

認証エミュレータとエミュレータスイートUIを使用してインタラクティブなプロトタイピングを開始するには、Firebaseローカルエミュレータスイートを起動します。

firebase emulators:start

匿名認証の場合、アプリはプラットフォーム( iOSAndroidWeb )のサインインロジックを実行できます。

メール/パスワード認証の場合、Authentication SDK メソッドを使用して、または Emulator Suite UI を使用して、アプリから Authentication エミュレーターにユーザー アカウントを追加することにより、プロトタイピングを開始できます。

  1. Emulator Suite UI で、[認証] タブをクリックします。
  2. [ユーザー追加]ボタンをクリックします。
  3. ユーザー アカウント作成ウィザードに従って、電子メール認証フィールドに入力します。

テストユーザーを作成すると、アプリはプラットフォーム( iOSAndroidWeb )のSDKロジックを使用してユーザーをサインインおよびサインアウトできます。

電子メールリンクフローを使用した電子メール検証/サインインをテストするために、エミュレーターは、 firebase emulators:startが実行された端末へのURLを出力します。

i  To verify the email address customer@ex.com, follow this link:
http://localhost:9099/emulator/action?mode=verifyEmail&lang=en&oobCode=XYZ123&apiKey=fake-api-key

リンクをブラウザに貼り付けて検証イベントをシミュレートし、検証が成功したかどうかを確認します。

{
  "authEmulator": {
    "success": "The email has been successfully verified.",
    "email": "customer@example.com"
  }
}

パスワードのリセットをテストするために、エミュレーターはnewPasswordパラメーター (必要に応じて変更できます) を含む同様の URL を端末に出力します。

http://localhost:9099/emulator/action?mode=resetPassword&oobCode=XYZ!23&apiKey=fake-api-key&newPassword=YOUR_NEW_PASSWORD

非対話型テスト

Emulator Suite UIまたはクライアントコードを使用して電子メール/パスワードのユーザーアカウントを管理する代わりに、REST APIを呼び出してユーザーアカウントを作成および削除し、帯域外の電子メール検証コードをフェッチしてエミュレーターの電子メール検証にデータを入力するテストセットアップスクリプトを作成できます。 URL。これにより、プラットフォームとテスト コードが分離され、非対話型のテストが可能になります。

非対話型の電子メールとパスワードのテスト フローの場合、一般的なシーケンスは次のとおりです。

  1. Authentication signUp REST エンドポイントを使用してユーザーを作成します
  2. メールとパスワードを使用してユーザーにサインインし、テストを実行します。
  3. テストに適用できる場合は、エミュレータ固有の REST エンドポントから利用可能な帯域外電子メール確認コードを取得します。
  4. データをクリアするために、エミュレーター固有のRESTエンドポイントでユーザーレコードをフラッシュします。

エミュレートされた電話/ SMS認証

電話認証の場合、Auth エミュレーターは以下をサポートしていません。

  • reCAPTCHAとAPNのフロー。エミュレーターと対話するように構成されると、クライアントSDKは、統合テスト( iOSAndroidWeb )で説明したのと同様の方法でこれらの検証方法を無効にします。
  • Firebase コンソールで事前構成されたコードを使用して電話番号をテストします。

それ以外の点では、クライアントコードに関して、電話/ SMS認証フローは本番環境iOSAndroidWeb )で説明されているものと同じです。

Emulator Suite UIの使用:

  1. Emulator Suite UI で、[認証] タブをクリックします。
  2. [ユーザー追加] ボタンをクリックします。
  3. ユーザーアカウント作成ウィザードに従って、電話認証フィールドに入力します。

ただし、電話認証フローの場合、エミュレーターはテキスト メッセージの配信をトリガーしません。これは、通信事業者に連絡することは範囲外であり、ローカル テストには適していないためです。代わりに、エミュレーターは、SMS経由でfirebase emulators:startを実行したのと同じ端末に送信されたはずのコードを出力します。このコードをアプリに入力して、ユーザーがテキスト メッセージをチェックすることをシミュレートします。

非対話型テスト

非対話型の電話認証テストの場合は、認証エミュレーターのREST APIを使用して、使用可能なSMSコードを取得します。フローを開始するたびにコードが異なることに注意してください。

典型的なシーケンスは次のとおりです。

  1. プラットフォームのsignInWithPhoneNumberを呼び出して、検証プロセスを開始します。
  2. エミュレーター固有のRESTエンドポイントを使用して検証コードを取得します
  3. confirmationResult.confirm(code)を使用して、通常どおりconfirmationResult.confirm(code)を呼び出します。

エミュレートされたサードパーティIDプロバイダー(IDP)認証

認証エミュレーターを使用すると、本番コードから変更を加えることなく、iOS、Android、またはWebアプリで多くのサードパーティ認証フローをテストできます。認証フローの例については、アプリで使用できるプロバイダーとプラットフォームのさまざまな組み合わせに関するドキュメントを参照してください

一般的に、Firebase SDKを使用して、次の2つの方法のいずれかで認証できます。

  • アプリを使用すると、SDKは、クレデンシャルを取得するためのサードパーティIDPプロバイダーとのすべてのやり取りを含め、プロセス全体をエンドツーエンドで処理できます。
  • アプリは、サードパーティのSDKを使用してサードパーティプロバイダーから手動でクレデンシャルを取得し、それらのクレデンシャルを認証SDKに渡します。

繰り返しになりますが、上記のドキュメント リンクを確認し、使用するフロー (Firebase SDK で管理された認証情報と手動の認証情報取得) に精通していることを確認してください。認証エミュレーターは、どちらのアプローチのテストもサポートします。

FirebaseSDK主導のIDPフローのテスト

アプリがMicrosoft、GitHub、YahooでのログインにOAuthProviderなどのFirebase SDKエンドツーエンドフローを使用してインタラクティブなテストを行う場合、認証エミュレーターは対応するサインインページのローカルバージョンを提供してテストに役立てますsigninWithPopupまたはsignInWithRedirectメソッドを呼び出すWebアプリからの認証。このローカルで提供されるサインインページは、プラットフォームのWebViewライブラリによってレンダリングされるモバイルアプリにも表示されます。

エミュレーターは、フローの進行に応じて、必要に応じてモックのサードパーティユーザーアカウントと資格情報を作成します。

手動のクレデンシャル取得によるIDPフローのテスト

「手動」サインイン手法を使用し、プラットフォームのsignInWithCredentialsメソッドを呼び出すと、通常どおり、アプリは実際のサードパーティのサインインを要求し、実際のサードパーティのクレデンシャルを取得します。

エミュレーターは、JSON Web トークン (JWT) として実装された ID トークンを使用する Google サインイン、Apple、およびその他のプロバイダーから取得した資格情報のsignInWithCredential認証のみをサポートすることに注意してください。アクセストークン(たとえば、JWTではないFacebookまたはTwitterによって提供されるもの)はサポートされていません。次のセクションでは、これらの場合の代替方法について説明します。

非対話型テスト

非対話型テストへの1つのアプローチは、エミュレーターによって提供されるサインインページでのユーザークリックを自動化することです。 Web アプリの場合は、WebDriver などのコントロール インターフェイスを使用します。モバイルの場合は、EspressoやXcodeなどのプラットフォームのUIテストツールを使用します。

または、 signInWithCredentialを使用するようにコードを更新し(コードブランチなど)、実際の資格情報の代わりにアカウントのモックIDトークンを使用したトークン認証フローを使用することもできます。

  1. IDP から idToken を取得するコードの一部を再配線またはコメント アウトします。これにより、テスト中に実際のユーザー名とパスワードを入力する必要がなくなり、IDP での API クォータとレート制限からテストが解放されます。
  2. 次に、 signInWithCredentialのトークンの代わりにリテラルJSON文字列を使用します。例としてWebSDKを使用すると、コードを次のように変更できます。
firebase.auth().signInWithCredential(firebase.auth.GoogleAuthProvider.credential(
  '{"sub": "abc123", "email": "foo@example.com", "email_verified": true}'
));

エミュレータでこのコードを使用すると、Google のメールfoo@example.comでユーザーが正常に認証されます。サブフィールドを主キーと考えてください。主キーは任意の文字列に変更でき、さまざまなユーザーのサインインをモックします。あなたは置き換えることができfirebase.auth.GoogleAuthProvider 、例えば、でnew firebase.auth.OAuthProvider('yahoo.com')か、モックとしたい任意の他のプロバイダのIDを。

次は何?