【问题标题】:Testing passwordless auth in Firebase test lab for iOS在 iOS 的 Firebase 测试实验室中测试无密码身份验证
【发布时间】:2019-04-03 16:25:18
【问题描述】:

我正在试图弄清楚如何通过 iOS 的 firebase 测试实验室执行 e2e 测试,该测试允许检查无密码身份验证流程,这基本上应该执行以下操作

  1. 在我的应用程序中输入电子邮件
  2. Firebase 将身份验证链接发送到此类电子邮件
  3. 不知何故,我需要在 firebases 测试设备的某处登录此类电子邮件,我假设是在邮件应用程序或 gmail 中?
  4. 我需要知道新电子邮件何时到达并打开它
  5. 打开电子邮件后,我需要点击授权链接
  6. 这应该让我回到应用程序并进行身份验证

目前我最大的问题是弄清楚在我的应用程序之外发生的步骤,即我如何准备这个测试并使用我的电子邮件地址登录(例如,在 safari 中登录 gmail 或者以某种方式添加这个 acc 会更好吗?到苹果邮件应用程序?)。

【问题讨论】:

  • 我认为您无法完全按照您的描述执行此操作,因为 Firebase 测试实验室只能使用自己的 Google 帐户登录设备上的应用程序。您不能提供自己的帐户。
  • @DougStevenson 是否有可能以某种方式利用firebase的谷歌帐户?本质上,我需要使用无密码身份验证登录我的游戏,以测试仅允许经过身份验证的用户的所有其他功能。
  • @Ilja 我并不完全熟悉 iOS 的 e2e 测试流程,但您可以使用任何电子邮件提供商(可能使用时间戳作为唯一标识符)登录,然后使用端到端测试代码以阅读电子邮件并使用该链接登录。根据您的要求,mailtrap.io 之类的内容可能适合您。或者,您可以设置自己的简单 api,以便从您发送到的任意电子邮件中获取登录链接。如果您特别想测试本机电子邮件应用程序,那就另当别论了,但是如果您的要求只是“链接是否有效”,那么应该这样做。

标签: ios firebase testing firebase-authentication firebase-test-lab


【解决方案1】:

测试邮件

根据我的经验,除了检查您希望发送电子邮件的方法调用是否发生之外,测试您自己的代码以查看是否发送了电子邮件并不简单。

除此之外使用 Firebase,它不会公开其底层电子邮件发送代码,这对我来说似乎是一个挑战。

在测试方面,我建议您断言您发送电子邮件的方法调用发生或到达了相关代码路径。在 Firebase 网络中,这看起来像:

firebase.auth().sendSignInLinkToEmail(email, actionCodeSettings)
  .then(function() {
    // The link was successfully sent. Inform the user.
    // Save the email locally so you don't need to ask the user for it again
    // if they open the link on the same device.
    window.localStorage.setItem('emailForSignIn', email);
    // TODO save email to something accessible in your iOS tests
    // TODO In your tests, confirm that email was saved after it was sent
  })
  .catch(function(error) {
    // Some error occurred, you can inspect the code: error.code
  });

见:https://firebase.google.com/docs/auth/web/email-link-auth#send_an_authentication_link_to_the_users_email_address

另一种选择:

您可以使用您管理的邮件服务器上的电子邮件地址设置测试用户,并使用您自己的自定义邮件阅读代码检查该测试用户的传入邮件。

我会为此使用 Firebase 管理工具:https://firebase.google.com/docs/auth/admin/manage-users#create_a_user

【讨论】:

  • 您好,谢谢您的回答!我对我的问题进行了澄清。我本质上是在设备 e2e 测试中执行,并询问如何测试通过无密码链接登录的用户流程,而不是实际检查是否发送了电子邮件。
【解决方案2】:

我认为您应该首先查看适用于 iOS 的 firebase 文档,了解如何创建可用于电子邮件身份验证的动态链接。

https://firebase.google.com/docs/auth/ios/email-link-auth https://firebase.google.com/docs/auth/ios/passing-state-in-email-actions#configuring_firebase_dynamic_links

完成这两个后,请查看以下代码:

func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
   // [END old_delegate]
   if handlePasswordlessSignIn(withURL: url) {
     return true
   }
}

func handlePasswordlessSignIn(withURL url: URL) -> Bool {
    let link = url.absoluteString
    // [START is_signin_link]
    if Auth.auth().isSignIn(withEmailLink: link) {
      // [END is_signin_link]
      UserDefaults.standard.set(link, forKey: "Link")
      (window?.rootViewController as? UINavigationController)?.popToRootViewController(animated: false)
      window?.rootViewController?.children[0].performSegue(withIdentifier: "passwordless", sender: nil)
      return true
    }
    return false
 }

这只是一个示例,说明在用户点击链接后如何处理应用中的深层链接。委托方法

func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool

in AppDelegate 用于应用程序的所有深层链接。例如,您可以设置您自己的应用程序符合的方案。例如,您可以将带有自定义方案的 url 类型链接从浏览器发送到您的应用程序中。

要做到这一点,只需打开 Xcode,转到项目设置 -> 信息,然后在“URL 类型”部分中添加一个新的 URL 方案。添加 com.myApp 之类的东西,以使其尽可能统一。然后你可以在浏览器中输入 com.myApp://main 并在 appDelegate 中处理。

编辑:在他们的文档中这样说,您可以在应用程序内显示提示,让用户输入电子邮件。只要您的动态链接设置正确,用户从哪里打开他的电子邮件并不是您真正关心的问题。

【讨论】:

  • 谢谢 Alex,但这是 iOS 中动态链接的一般用法,与问题中提到的在测试实验室中测试它们无关。
猜你喜欢
  • 2020-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-29
  • 2013-02-21
  • 1970-01-01
相关资源
最近更新 更多