了解用于身份验证的 Firebase 动态链接中的状态

Understanding states in Firebase Dynamic links for Authentication

很抱歉,我在理解 Firebase Dynamic 时遇到了很多问题 links.

我的用例是:用户想从移动应用程序重置密码(或发送电子邮件验证)。

final ActionCodeSettings codeSettings = ActionCodeSettings(
      url: 'https://links.example.com/auth?email=$email',
      iOSBundleId: Constants.iosBundleID,
      androidPackageName: Constants.androidBundleID,
      androidInstallApp: true,
      dynamicLinkDomain: "links.example.com",
    );

但是这不起作用,所以我猜我在某处做错了。

  1. 在我的 iOS 配置中,我将 Associated Domains 添加为:applinks:links.example.com.
    Info.plist 文件中我添加了:
<key>FirebaseDynamicLinksCustomDomains</key>
    <array>
        <string>https://links.example.com/auth</string>
    </array>

(也尝试过:<string>https://links.example.com</string>

  1. 在我的 Android 配置中,我已将此添加到我的 AndroidManifest.xml :
<intent-filter>
               <action android:name="android.intent.action.VIEW"/>
               <category android:name="android.intent.category.DEFAULT"/>
               <category android:name="android.intent.category.BROWSABLE"/>
               <data android:host="links.example.com" android:scheme="https"/>
           </intent-filter>

有趣的是,在 Android 完成上述步骤后(在智能手机的网站上),如果我启动 continueUrl 它会提示用户是重定向回应用程序还是停留在浏览器上打开 URL.

我当然在 Firebase Dynamic links 控制台中创建了一个子域:links.example.com 作为 URL 前缀。

这是我的问题:

https://example.com/auth?mode=resetPassword&oobCode=T0qn8aj_p7TJBWyE5eUh7_7ZwIqwtJ7Q-i8LDf4QrIsAAAF_u6Bi6Q&apiKey=AIzaSyAzPqhZFKAyfQDeN4DGGjI9VCTEBe_mLc4&continueUrl=https%3A%2F%2Flinks.example.com%3Flink%3Dhttps%3A%2F%2Flinks.example.com%2Fauth%3Femail%253Dtestmail12%40gmail.com%26apn%3Dcom.example.android%26amv%26ibi%3Dcom.example.ios%26ifl%3Dhttps%3A%2F%2Flinks.example.com%2Fauth%3Femail%253Dtestmail12%40gmail.com&lang=fr

非常感谢您对它如何工作的任何解释!

我终于明白这是怎么回事了:

continueUrl 必须是用于在移动应用程序中返回的那个,所以如果您使用:

url: 'https://links.example.com/auth?email=$email',

这意味着您必须在 firebase 控制台中创建一个 dynamic link 前缀 URL : https://links.example.com/auth

您还必须按照问题所述将其添加到您的 iOS Info.plist 文件中。

此外,当您使用自定义域时,您需要按照文档中的说明确保 URL 前缀和域不同,例如:

https://link.example.com/?link=https://example.com/my-resource

而不是:

https://example.com/?link=https://example.com/my-resource

这意味着通过使用https://links.example.com/auth作为URL前缀,您需要使用另一个域来处理link。

就我而言,我是这样构建 url 的:

https://links.example.com/?link=https://redirect.example.com/auth

并添加 https://redirect.example.com/auth 作为 URL 前缀。 这可以防止 example.com 在托管级别和 links.example.com 之间的冲突使 link 域名和 Url 前缀相同。

此外,不要忘记在 Firebase 控制台的 Firebase 身份验证 Sign-In 方法中添加新的动态 links 域作为 whitelisted 域,否则您将获得 domain-denied错误。

希望这会帮助其他人更好地理解它是如何工作的。