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

时间:2020-04-23 17:44:03

标签: ios firebase flutter firebase-authentication firebase-dynamic-links

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

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

  2. 用户单击电子邮件中的链接,然后带回到应用程序。 -有效

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

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上复制该链接或长按该链接以查看预览,则斜杠只会在正确的位置被静默添加!您可以将链接粘贴到notes应用程序,单击它,然后它就可以使用!

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

Screenshot from email source code

请求链接时,我呼叫了FirebaseAuth.instance.sendSignInWithEmailLink,并设置了以下参数:

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

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

有人知道如何...

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

  • 让Firebase Dynamic Link的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 /_/*",
        "/*"
      ]
    }]
  }
}

3 个答案:

答案 0 :(得分:3)

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

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

您可以跟踪它here

答案 1 :(得分:1)

在调试了Firebase Dynamic Links的iOS实现之后,事实证明丢失的斜杠是明确的required in code(尽管我不确定为什么)。它在电子邮件链接中的缺失似乎是一个错误,应该在Firebase后端中进行修复。我对此提交了一个错误报告。 Firebase控制台没有选项来配置要用于自动生成的登录链接的动态链接域(而不是从已配置域的列表中首先获取,但是以某种方式没有路径),因此我希望将来可以对其进行配置。

解决方法

我只是更改了code(在我的Flutter项目中它位于Pods/FirebaseDynamicLinks/FIRDynamicLinks.m中),并删除了斜杠的校验。但是我必须在更新依赖项时重复一遍,而且我不知道为什么检查显式存在,否则可能导致其他问题。

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

  1. 检查链接本身

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

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

答案 2 :(得分:0)

不要忘记添加dynamicLinkDomain: 'link.mydomain.com',

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

添加dynamicLinkDomain: 'link.mydomain.com'

后,它开始工作

P.S Flutter项目