Firebase 身份验证链接不起作用 - 缺少尾部斜杠?

Posted

技术标签:

【中文标题】Firebase 身份验证链接不起作用 - 缺少尾部斜杠?【英文标题】:Firebase Authentication link not working - missing trailing slash? 【发布时间】:2020-08-07 03:49:46 【问题描述】:

我想在带有自定义域ios (Flutter) 应用中使用 Firebase 电子邮件链接身份验证:

    应用请求 Firebase 身份验证后端向用户发送电子邮件。 -- 有效

    用户单击电子邮件中的链接并返回到应用程序。 -- 有效

    应用程序处理该链接的有效负载以执行登录。 -- 不起作用

Firebase 动态链接通常可以正常工作,但来自该特定 Firebase 自动生成的电子邮件的链接却不能。从技术上讲,应用程序被带到前台,但 Firebase 动态链接 onLink 回调未被触发。我将其追踪到电子邮件链接 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)
-----------------------------^

这种差异的最糟糕的部分是,如果你在 iOS 上复制链接或长按它来查看预览,斜线只是默默地添加到正确的位置!您可以将链接粘贴到笔记应用程序,单击它,它就可以工作了!

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

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

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

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

有人知道如何...

让 Firebase 在发送邮件时在链接中添加这个斜杠?

让 Firebase 动态链接的 onLink 回调对没有尾部斜杠的点击链接做出反应?

供参考

我的 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 /_/*",
        "/*"
      ]
    ]
  

【问题讨论】:

【参考方案1】:

带有自定义域的链接在 Apple Mail 中运行良好,但在其他电子邮件客户端中没有。

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

你可以追踪它here。

【讨论】:

【参考方案2】:

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

解决方法

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

关于调试动态链接的另外两个提示

    检查链接本身

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

    检查您的 iOS 配置

将这两行暂时添加到您的didFinishLaunchingWithOptions 中的AppDelegate.m

[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 ----

【讨论】:

我今天收到了 Firebase 支持团队的回复。他们确认了这个错误并将很快修复它,但无法给我一个时间表。 您可以在此处链接报告的问题以进行跟踪吗?我正在努力解决同样的问题,并想知道那里发生了什么。 我希望我可以 - 但我没有链接。我使用firebase.google.com/support/troubleshooter/report/bugs 的表格报告了它。从他们的电子邮件回复中:“我感谢您在这里进行彻底的分析并分享您的解决方法。这看起来是我们的一个错误,但是,我无法分享修复何时可用的任何时间表。我们将一旦我们确定了问题的根本原因,肯定会解决问题。有关进一步的更新,请留意我们的发行说明 (firebase.google.com/support/releases)。" 对我来说,这似乎是 Firebase 后端的错误,而不是 iOS 实现中的错误。所以我想没有公共问题跟踪器。我提交了另一个非常简单的错误,在 6 月份得到确认,但在生产中仍然没有任何结果......我们应该在发现修复已发布后立即在此处更新我们?【参考方案3】:

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

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

添加dynamicLinkDomain: 'link.mydomain.com'后我就可以正常工作了

P.S Flutter 项目

【讨论】:

在哪里?为什么?

以上是关于Firebase 身份验证链接不起作用 - 缺少尾部斜杠?的主要内容,如果未能解决你的问题,请参考以下文章

firebase电话身份验证在发行版中不起作用[重复]

React Native - Firebase 身份验证持久性不起作用

Flutter Firebase 电话身份验证不起作用

使用 Flutter 的 Firebase 身份验证不起作用

Firebase 身份验证对我不起作用

Firebase google 身份验证在发布模式下不起作用