Catch up on everthing we announced at this year's Firebase Summit. Learn more

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

あなたのアプリと認証エミュレータを使用する前に、あなたがいることを確認して、全体的なFirebaseローカルエミュレータスイートのワークフローを理解し、あなたはそれをインストールして設定ローカルエミュレータスイートをし、その見直しCLIコマンドを

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

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

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

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

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

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

ローカルエミュレータ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バージョン9

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

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

Webバージョン8

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

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

管理SDK

ときFirebase管理SDKは自動的に認証エミュレータに接続FIREBASE_AUTH_EMULATOR_HOST環境変数が設定されています。

export FIREBASE_AUTH_EMULATOR_HOST="localhost:9099"

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

環境変数を設定すると、Firebase管理SDKが(を介して認証エミュレータによって発行された符号なしのIDトークンとセッションCookieを受け入れるverifyIdTokencreateSessionCookieローカルdevelopmemtとテストを容易にするために、それぞれの方法を)。生産の環境変数を設定していないことを確認してください。

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

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

IDトークン

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

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

firebase emulators:start

匿名認証のために、あなたのアプリケーションは、ご使用のプラットフォーム(のためのサインインのロジックを行使することができますのiOSアンドロイドウェブ)。

電子メール/パスワード認証の場合、あなたは、認証SDKのメソッドを使用して、アプリから認証エミュレータにユーザーアカウントを追加することによって、またはエミュレータスイートUIを使用して試作を開始することができます。

  1. エミュレータスイートUIで、[認証]タブをクリックします。
  2. ユーザーの追加]ボタンをクリックしてください。
  3. ユーザーアカウント作成ウィザードに従って、電子メール認証フィールドに入力します。

作成したテストユーザーを使用すると、あなたのアプリがあなたのプラットフォーム(のためのSDKロジックとユーザーとアウトに署名することができiOS版Androidのウェブ)。

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

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"
  }
}

パスワードのリセットをテストするために、エミュレータは端末に、(必要に応じて変更可能)新パスワードパラメータを含む類似した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 endpont
  4. 洗い流すユーザレコードエミュレータ固有のRESTエンドポイント決済データのため。

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

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

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

それ以外の場合は、クライアントコードの面で、電話/ SMS認証フローは、生産(のために説明したものと同一であるのiOSアンドロイドウェブ)。

Emulator Suite UIの使用:

  1. エミュレータスイート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フローのテスト

あなたのアプリのような任意のFirebase SDKエンド・ツー・エンドのフロー、使用している場合はOAuthProviderマイクロソフト、GitHubの、またはYahooと、サインイン用に、インタラクティブなテストのために、認証エミュレータは、ヘルプあなたの試験に対応したサインインページのローカルバージョンを提供しています呼び出すWebアプリケーションからの認証signinWithPopupまたはsignInWithRedirect方法を。このローカルで提供されるサインインページは、プラットフォームのWebViewライブラリによってレンダリングされるモバイルアプリにも表示されます。

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

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

あなたが「手動」サインイン技術を使用して、プラットフォームの呼び出した場合signInWithCredentials方法を、そして、いつものように、あなたのアプリケーションは、実際のサードパーティ製のサインインを要求し、実際のサードパーティの資格情報を取得します。

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

非対話型テスト

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

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

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

エミュレータで使用する場合、このコードが正常に電子メールでユーザー認証を行いますfoo@example.com Googleのを。サブフィールドを主キーと考えてください。主キーは任意の文字列に変更でき、さまざまなユーザーのサインインをモックします。あなたは置き換えることができ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以外のプロバイダーからの資格情報はサポートされていません。

Eメール/ SMSサインイン

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

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

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

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

次は何?