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

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

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

認証エミュレータは、Firebase認証サービスの忠実度の高いローカルエミュレーションを提供し、本番のFirebaseAuthenticationにある機能の多くを提供します。 Appleプラットフォーム、AndroidおよびWeb Firebase SDKと組み合わせると、エミュレーターで次のことが可能になります。

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

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

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

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

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

プロジェクトタイプ特徴エミュレーターで使用
本物

実際のFirebaseプロジェクトは、(ほとんどの場合、Firebaseコンソールを介して)作成および構成したプロジェクトです。

実際のプロジェクトには、データベースインスタンス、ストレージバケット、関数、またはそのFirebaseプロジェクト用に設定したその他のリソースなどのライブリソースがあります。

実際のFirebaseプロジェクトで作業する場合、サポートされている製品のいずれかまたはすべてに対してエミュレータを実行できます。

エミュレートしていない製品の場合、アプリとコードはライブリソース(データベースインスタンス、ストレージバケット、関数など)と相互作用します。

デモ

デモのFirebaseプロジェクトには、実際のFirebase構成やライブリソースはありません。これらのプロジェクトには通常、コードラボまたは他のチュートリアルを介してアクセスします。

デモプロジェクトのプロジェクトIDには、 demo-プレフィックスが付いています。

デモFirebaseプロジェクトで作業する場合、アプリとコードはエミュレーターとの対話します。アプリがエミュレーターが実行されていないリソースと対話しようとすると、そのコードは失敗します。

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

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

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

Android、iOS、およびWeb SDK

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

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

Web version 9

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

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

Web version 8

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

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

管理SDK

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

export FIREBASE_AUTH_EMULATOR_HOST="localhost:9099"

Cloud Functionsエミュレーターは認証エミュレーターを自動的に認識するため、Cloud Functionsエミュレーターと認証エミュレーターの統合をテストする場合は、この手順をスキップできます。環境変数は、CloudFunctionsのAdminSDKに自動的に設定されます。

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

Admin SDKコードを別の環境で実行されている共有エミュレータに接続する場合は、FirebaseCLIを使用して設定したものと同じプロジェクトIDを指定する必要があります。プロジェクトIDを渡してinitializeAppを直接実行するか、 GCLOUD_PROJECT環境変数を設定できます。

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

IDトークン

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

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

firebase emulators:start

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

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

  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. 認証サインアップ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)を呼び出します。

エミュレートされたサードパーティ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アプリからの認証。このローカルで提供されるサインインページは、プラットフォームのWebビューライブラリによってレンダリングされるモバイルアプリにも表示されます。

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

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

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

エミュレーターは、Googleサインイン、Apple、およびJSON Web Token(JWT)として実装されたIDトークンを使用するその他のプロバイダーから取得した資格情報に対してのみ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に置き換えることができます。

認証エミュレータと本番環境の違い

Firebase Authenticationエミュレーターは、本番製品の多くの機能をシミュレートします。ただし、どのような種類の認証システムも複数のレベル(デバイス、サードパーティプロバイダー、Firebaseなど)のセキュリティに大きく依存しているため、エミュレーターがすべてのフローを適切に再作成することは困難です。

クラウドIAM

Firebase Emulator Suiteは、IAM関連の動作を複製または尊重して実行しようとはしません。エミュレーターは提供されているFirebaseセキュリティルールに準拠していますが、IAMが通常使用される状況では、たとえば、サービスアカウントを呼び出すCloud Functionsを設定して権限を設定する場合、エミュレーターは構成できず、開発者のマシンでグローバルに利用可能なアカウントを使用します。ローカルスクリプトを直接実行するのと似ています。

モバイルプラットフォームでは、メールリンクのログインはFirebase Dynamic Linksに依存しているため、このようなリンクはすべて(モバイル)ウェブプラットフォームで開かれます。

サードパーティのサインイン

サードパーティのサインインフローの場合、FirebaseAuthenticationはTwitterやGithubなどのサードパーティプロバイダーからの安全な認証に依存しています。

GoogleやAppleなどのOpenIDConnectプロバイダーからの実際のクレデンシャルは、認証エミュレーターによって受け入れられます。 OpenIDConnect以外のプロバイダーからの資格情報はサポートされていません。

メール/SMSサインイン

本番アプリでは、電子メールとSMSのサインインフローには、ユーザーが受信したメッセージを確認し、サインインインターフェイスにログインコードを入力する非同期操作が含まれます。認証エミュレータは電子メールやSMSメッセージを送信しませんが、上記のように、ログインコードを生成し、テストで使用するために端末に出力します。

エミュレータは、Firebaseコンソールを使用して実行できるように、固定ログインコードでテスト電話番号を定義する機能をサポートしていません。

レート制限/不正使用防止

認証エミュレーターは、本番レート制限または不正使用防止機能を複製しません。

次は何?