Firebase Summit で発表されたすべての情報をご覧ください。Firebase を使用してアプリ開発を加速し、自信を持ってアプリを実行する方法を紹介しています。詳細

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

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

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

このトピックは、本番環境向けの Firebase Authentication ソリューションの開発に精通していることを前提としています。必要に応じて、プラットフォームと認証手法の組み合わせに関するドキュメントを確認してください。

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

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

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

Firebase プロジェクトを選択

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

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

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

プロジェクトの種類特徴エミュレーターで使用する
本物

実際の Firebase プロジェクトは、ユーザーが作成して構成したものです (ほとんどの場合、Firebase コンソールを使用して)。

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

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

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

デモ

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

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

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

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

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

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

Android、iOS、および Web SDK

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

アンドロイド
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");

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

管理 SDK

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

export FIREBASE_AUTH_EMULATOR_HOST="localhost:9099"

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

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

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

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

IDトークン

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

エミュレーターを起動する

認証エミュレーターは、Emulator Suite UI を介して対話的に使用することも、ローカル REST インターフェイスを介して非対話的に使用することもできます。次のセクションでは、対話型および非対話型のユース ケースについて説明します。

認証エミュレーター、その REST インターフェイス、および Emulator Suite UI を開始するには、次のコマンドを実行します。

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. Authentication signUp REST endpointを使用してユーザーを作成します。
  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)を呼び出します。

多要素 SMS

認証エミュレーターは、 iOSAndroid 、およびWebの本番環境で使用可能な SMS 多要素認証 (MFA) フローのプロトタイピングとテストをサポートしています。

エミュレーターにモック ユーザーを追加すると、MFA を有効にして、第 2 要素の SMS メッセージが送信される 1 つ以上の電話番号を構成できます。メッセージは、 firebase emulators:startを実行したのと同じターミナルに出力され、REST インターフェースから利用できます。

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

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

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

  • アプリでは、SDK がプロセス全体をエンドツーエンドで処理できます。これには、資格情報を取得するためのサードパーティ IDP プロバイダーとのすべてのやり取りが含まれます。
  • アプリは、サードパーティの SDK を使用してサードパーティ プロバイダーから資格情報を手動で取得し、それらの資格情報を Authentication SDK に渡します。

もう一度、上記のドキュメント リンクを確認し、使用するフロー (Firebase SDK で管理された資格情報取得と手動の資格情報の取得) のいずれについても十分に理解していることを確認してください。認証エミュレーターは、どちらのアプローチのテストもサポートしています。

Firebase SDK 駆動型 IDP フローのテスト

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

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

手動認証情報取得による IDP フローのテスト

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

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

非対話型テスト

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

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

  1. IDP から idToken を取得するコードの部分を再配線またはコメントアウトします。これにより、テスト中に実際のユーザー名とパスワードを入力する必要がなくなり、IDP での API 割り当てとレート制限からテストが解放されます。
  2. 次に、 signInWithCredentialのトークンの代わりにリテラル JSON 文字列を使用します。例として Web SDK を使用すると、コードを次のように変更できます。
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 に置き換えることができます。

エミュレートされたカスタム トークン認証

認証エミュレーターは、サポートされているプラ​​ットフォームでsignInWithCustomTokenメソッドへの呼び出しを使用して、カスタム JSON Web トークンで認証を処理します

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

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

クラウド IAM

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

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

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

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

Google や Apple などの OpenID Connect プロバイダーからの実際の資格情報は、Authentication エミュレーターによって受け入れられます。非 OpenID Connect プロバイダーからの資格情報はサポートされていません。

メール / SMS サインイン

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

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

カスタム トークン認証

認証エミュレーターは、カスタム トークンの署名または有効期限を検証しません。これにより、手作りのトークンを使用し、プロトタイプ作成およびテスト シナリオで無期限にトークンを再利用できます。

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

認証エミュレーターは、実稼働率の制限や不正使用防止機能を複製しません。

次は何?

  • 精選された一連のビデオと詳細なハウツーの例については、 Firebase Emulators Training Playlistに従ってください。

  • トリガーされた関数は認証との一般的な統合であるため、Cloud Functions for Firebase エミュレーターの詳細については、関数をローカルで実行するを参照してください。