将您的应用程序连接到身份验证模拟器

使用验证仿真器与您的应用程序之前,请确保您了解整体火力地堡本地模拟器套房的工作流程,并且您安装并配置本地仿真器套件和审查其CLI命令

我可以用身份验证模拟器做什么?

身份验证仿真器提供的火力地堡认证服务高保真本地仿真,提供多中找到的功能,生产火力地堡认证。与 iOS、Android 和 Web Firebase SDK 搭配使用,模拟器可让您:

  • 创建、更新和管理模拟用户帐户,以测试电子邮件/密码、电话号码/短信以及使用第三方身份提供商(例如 Google)登录
  • 查看和编辑模拟用户
  • 在 Emulator UI Logs 选项卡中检查与身份验证相关的消息。

选择一个 Firebase 项目

Firebase 本地模拟器套件模拟单个 Firebase 项目的产品。

要选择项目中使用,启动模拟器前,在命令行运行firebase use在你的工作目录。或者,您可以通过--project标志给每个仿真命令。

当地仿真器套件支持实时火力地堡项目和示范项目的仿真。

项目类型特征与模拟器一起使用
真实的

一个真正的 Firebase 项目是您创建和配置的(很可能通过 Firebase 控制台)。

真实项目具有实时资源,例如数据库实例、存储桶、函数或您为该 Firebase 项目设置的任何其他资源。

在处理真实的 Firebase 项目时,您可以为任何或所有受支持的产品运行模拟器。

因为你不模仿任何产品,您的应用程序和代码将用资源(数据库实例,存储斗,功能等)进行交互。

演示

一个演示火力地堡项目有没有真正的火力地堡配置和没有活的资源。这些项目通常通过代码实验室或其他教程访问。

项目编号为示范项目有demo-前缀。

当演示火力地堡的项目,你的应用程序和用仿真器代码交互工作。如果您的应用尝试与模拟器未运行的资源进行交互,则该代码将失败。

我们建议您尽可能使用演示项目。好处包括:

  • 设置更简单,因为您无需创建 Firebase 项目即可运行模拟器
  • 更强的安全性,因为如果您的代码不小心调用了非模拟(生产)资源,则不会发生数据更改、使用和计费
  • 更好的离线支持,因为无需访问互联网即可下载您的 SDK 配置。

检测您的应用程序以与身份验证模拟器对话

Android、iOS 和 Web SDK

设置您的应用内配置或测试类以与身份验证模拟器交互,如下所示。

安卓
FirebaseAuth.getInstance().useEmulator('10.0.2.2', 9099);
iOS - 斯威夫特
Auth.auth().useEmulator(withHost:"localhost", port:9099)

网页版 9

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

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

网页版 8

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

无需额外设置即可对身份验证与 Cloud Functions 或 Cloud Firestore 或实时数据库的 Firebase 安全规则之间的交互进行原型设计和测试。当配置了身份验证模拟器并且其他模拟器正在运行时,它们会自动协同工作。

管理 SDK

当在火力地堡管理员SDK会自动连接到认证模拟器FIREBASE_AUTH_EMULATOR_HOST环境变量设置。

export FIREBASE_AUTH_EMULATOR_HOST="localhost:9099"

请注意,Cloud Functions 模拟器会自动识别身份验证模拟器,因此您可以在测试 Cloud Functions 和身份验证模拟器之间的集成时跳过此步骤。将自动为 Cloud Functions 中的 Admin 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令牌,其仅由其他火力地堡仿真器所接受,或火力地堡管理员SDK时配置。这些令牌将被在生产模式下运行的生产 Firebase 服务或 Firebase Admin SDK 拒绝(例如,没有上述设置步骤的默认行为)。

要开始使用身份验证模拟器和模拟器套件 UI 进行交互式原型设计,请启动 Firebase 本地模拟器套件。

firebase emulators:start

对于匿名身份验证,应用程序可以锻炼登录逻辑平台( iOS版Android版网络)。

对于电子邮件/密码验证,就可以开始使用认证SDK方法,从您的应用程序将用户帐户添加到验证仿真器或通过使用模拟器套房UI原型。

  1. 在模拟器套房UI中,单击身份验证选项卡。
  2. 点击添加用户按钮。
  3. 按照用户帐户创建向导,填写电子邮件身份验证字段。

随着测试用户创建的,您的应用程序可以登录和退出与SDK逻辑平台(用户的iOS安卓网络)。

为了测试电子邮件验证/登录与电子邮件链接流动时,仿真器输出一个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,包括NEWPASSWORD参数(其可以在需要时可以改变),到终端。

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

非交互式测试

您可以编写测试设置脚本,调用 REST API 来创建和删除用户帐户并获取带外电子邮件验证码以填充模拟器电子邮件验证,而不是使用 Emulator Suite UI 或客户端代码来管理电子邮件/密码用户帐户网址。这将平台和测试代码分开,让您以非交互方式进行测试。

对于非交互式电子邮件和密码测试流程,典型序列如下。

  1. 创建具有认证用户注册REST端点
  2. 使用电子邮件和密码登录用户以执行测试。
  3. 如果适用于您的测试,取从可用出带外的电子邮件验证码模拟器专用的REST endpont
  4. 同花顺用户记录与模拟器专用的REST端点用的数据。

模拟电话/短信认证

对于电话身份验证,身份验证模拟器不支持:

  • reCAPTCHA 和 APN 流程。一旦配置进行互动与仿真器,客户端软件开发工具包以类似的集成测试(描述的方式禁用这些验证方法的iOS安卓网络)。
  • 使用 Firebase 控制台中预配置的代码测试电话号码。

否则,在客户端代码而言,电话/ SMS认证流程是相同的,用于产生(描述的iOSAndroid的网络)。

使用模拟器套件 UI:

  1. 在模拟器套房UI中,单击身份验证选项卡。
  2. 点击添加用户按钮。
  3. 按照用户帐户创建向导,填写电话身份验证字段。

但是,对于电话身份验证流程,模拟器不会触发任何文本消息的传递,因为联系运营商不在范围内并且对本地测试不友好!取而代之的是,仿真器打印出的是将已通过短信发送到您运行相同的终端代码firebase emulators:start ;将此代码输入应用程序以模拟用户查看他们的短信。

非交互式测试

对于非交互式电话身份验证测试,请使用身份验证模拟器 REST API 来检索可用的 SMS 代码。请注意,每次启动流程时代码都不同。

典型的顺序如下。

  1. 呼叫平台signInWithPhoneNumber开始验证过程。
  2. 使用检索验证码特定模拟器-REST端点
  3. 呼叫confirmationResult.confirm(code)照常与验证码。

模拟第三方身份提供商 (IDP) 身份验证

身份验证模拟器可让您在 iOS、Android 或 Web 应用程序中测试许多第三方身份验证流程,而无需更改生产代码。对于认证流程的例子,请查阅各种文件提供商和平台,你可以在你的应用程序中使用的组合

一般来说,您可以通过以下两种方式之一使用 Firebase SDK 进行身份验证:

  • 您的应用程序让 SDK 处理端到端的整个过程,包括与第三方 IDP 提供商的所有交互以检索凭据。
  • 您的应用程序使用第三方提供商的 SDK 从第三方提供商那里手动检索凭据,并将这些凭据传递给身份验证 SDK。

再次检查上面的文档链接,并确保您熟悉要使用的任何流程 - Firebase SDK 管理与手动凭据检索。身份验证模拟器支持任一方法的测试。

测试 Firebase SDK 驱动的 IDP 流

如果应用程序使用任何火力地堡SDK终端到终端的流量,如OAuthProvider在登录微软,GitHub上,或雅虎,交互式测试,验证仿真器提供相应的登录页面的本地版本来帮助你测试从Web认证应用包含的通话signinWithPopupsignInWithRedirect方法。这个本地提供的登录页面也出现在移动应用程序中,由您平台的 webview 库呈现。

随着流程的进行,模拟器根据需要创建模拟第三方用户帐户和凭据。

使用手动凭证检索测试 IDP 流

如果使用“手动”登录技术和呼叫平台的signInWithCredentials方法,那么,像往常一样,您的应用程序会要求真正的第三方登录和检索实时第三方凭据。

请注意,模拟器只支持signInWithCredential对于使用ID令牌实现为JSON网络令牌(JWTs)从谷歌帐户登录,苹果,和其他供应商获取的证书认证。不支持访问令牌(例如,由 Facebook 或 Twitter 提供的不是 JWT 的令牌)。下一节将讨论这些情况下的替代方案。

非交互式测试

非交互式测试的一种方法是自动执行用户在模拟器提供的登录页面上的点击。对于 Web 应用程序,请使用 WebDriver 之类的控制界面。对于移动设备,请使用您平台上的 UI 测试工具,例如 Espresso 或 Xcode。

或者,您可以更新您的代码以使用signInWithCredential (例如,在代码分支),并使用与模拟ID令牌的令牌认证流程的账户,而不是真正的凭据。

  1. 重新连接或注释掉从 IDP 检索 idTokens 的代码部分;这消除了在您的测试期间输入真实用户名和密码的需要,并使您的测试免于在 IDP 的 API 配额和速率限制。
  2. 其次,在地方令牌的使用文字JSON字符串signInWithCredential 。以 web SDK 为例,您可以将代码更改为:
firebase.auth().signInWithCredential(firebase.auth.GoogleAuthProvider.credential(
  '{"sub": "abc123", "email": "foo@example.com", "email_verified": true}'
));

当仿真器使用,这个代码将成功地验证与电子邮件用户foo@example.com在谷歌。将子字段视为主键,可以更改为任何字符串,模拟不同用户的签名。您可以替换firebase.auth.GoogleAuthProvider用,例如, new firebase.auth.OAuthProvider('yahoo.com')或者你想嘲笑任何其他供应商ID。

接下来是什么?