Firebase 身份验证 link 不工作 - 缺少尾部斜线?

Firebase Authentication link not working - missing trailing slash?

我想在我的 iOS (Flutter) 应用程序中使用 Firebase 电子邮件 link 身份验证和 自定义域:

  1. 应用程序请求 Firebase Auth 后端向用户发送电子邮件。 -- 作品

  2. 用户单击电子邮件中的 link 并返回到应用程序。 -- 作品

  3. 该应用程序处理该 link 的负载以执行登录。-- 不起作用

Firebase Dynamic Links 在一般情况下确实有效,但来自特定 Firebase 自动生成的电子邮件的 link 无效。从技术上讲,该应用程序会被带到前台,但不会触发 Firebase Dynamic Link onLink 回调。我将其追踪到电子邮件 link URL:

中缺少的一个微小的尾部斜线
https://link.mydomain.com?link=https://app.mydomain.com/__/auth/action?apiKey=... (not working)

https://link.mydomain.com/?link=https://app.mydomain.com/__/auth/action?apiKey=... (works)
-------------------------^

为了解决这个问题,我尝试向我的域添加路径后缀,但这给出了相同的结果:

https://link.mydomain.com/app?link=https://app.mydomain.com/__/auth/action?apiKey=... (not working)

https://link.mydomain.com/app/?link=https://app.mydomain.com/__/auth/action?apiKey=... (works)
-----------------------------^

这种差异中最糟糕的部分是,如果您将 link 复制到 iOS 或长按它以查看预览,斜杠会自动添加在正确的地方!您可以将 link 粘贴到笔记应用程序中,单击它,就可以了!

只有在查看邮件的源代码时,您才能看到它实际上不存在:

请求 link 时,我调用 FirebaseAuth.instance.sendSignInWithEmailLink 并设置了这些参数:

url: 'https://app.mydomain.com',
dynamicLinkDomain: 'link.mydomain.com',

dynamicLinkDomain 参数不接受协议或路径。

有谁知道如何...


供参考

我的 Info.plist 包含此密钥:

<key>FirebaseDynamicLinksCustomDomains</key>
<array>
    <string>https://link.mydomain.com</string>
</array>

我的权利文件包含这个密钥:

<key>com.apple.developer.associated-domains</key>
<array>
    <string>applinks:link.mydomain.com</string>
</array>

apple-app-site-association (https://link.mydomain.com/apple-app-site-association):

{
  "applinks": {
    "apps": [],
    "details": [{
      "appID": "XYZ.com.mydomain.app",
      "paths": [
        "NOT /_/*",
        "/*"
      ]
    }]
  }
}

别忘了加上dynamicLinkDomain: 'link.mydomain.com',

url: 'https://app.mydomain.com',
dynamicLinkDomain: 'link.mydomain.com'

我在添加 dynamicLinkDomain: 'link.mydomain.com'

后开始工作

P.S Flutter 项目

在调试 Firebase 动态链接的 iOS 实现后,发现缺少的斜杠明确地是 required in code(虽然我不确定为什么)。它在电子邮件 link 中的缺失似乎是一个错误,应该在 Firebase 后端修复;我就此提交了错误报告。 Firebase 控制台没有配置动态 link 域用于自动生成的 sign-in links 的选项(而是从配置的域列表中获取任何第一个但不知何故没有路径)所以我希望将来可以配置它。

解决方法

我只是更改了 code(在我的 Flutter 项目中它位于 Pods/FirebaseDynamicLinks/FIRDynamicLinks.m)并删除了对尾部斜杠的检查。但是我必须在更新依赖项时重复它并且我不知道为什么检查明确在那里所以它可能会导致其他问题。

关于调试动态 links

的另外两个提示
  1. 检查link本身

将 link 复制到浏览器的地址行并添加 &d=1 以获得调试视图。它在图表上方的大红色框中显示错误 - 如果有的话。

  1. 检查您的 iOS 配置

将这两行临时添加到 AppDelegate.m 中的 didFinishLaunchingWithOptions:

[FIRApp configure];
[FIRDynamicLinks performDiagnosticsWithCompletion:nil];

(您可能需要 @import Firebase;

运行 Xcode 中的项目在调试控制台中看到这样的报告:

---- Firebase Dynamic Links diagnostic output start ----
Firebase Dynamic Links framework version 4.0.8
System information: OS iOS, OS version 14.0.1, model iPhone
Current date 2020-10-02 05:02:39 +0000
Device locale en-US (raw en_US), timezone Europe/Berlin
    Specified custom URL scheme is com.domain and Info.plist contains such scheme in CFBundleURLTypes key.
    AppID Prefix: XXXXXXXX, Team ID: XXXXXXXX, AppId Prefix equal to Team ID: YES
performDiagnostic completed successfully! No errors found.
---- Firebase Dynamic Links diagnostic output end ----

带有自定义域的链接在 Apple Mail 中工作正常,但在其他电子邮件客户端中没有。

作为临时解决方案,您可以使用 Google 提供的域(例如 projectname.page.link)生成登录链接。

你可以跟踪它here

这似乎已在后来的 firebase sdks 中得到修复,如果你查看 linked in this github issue 的 PR(我没有测试过,但我有一个较旧的 sdk 版本问题)

如果您不想立即更新您的 SDK,另一种解决方案是不使用 firebase auto-generated 电子邮件,而是在插入 firebase link 的位置提供您自己的电子邮件。

在这种情况下,您可以在将 link 插入电子邮件之前调整它,并确保它有尾部斜杠。