Flutter web 无密码登录不会触发身份验证状态更改

Posted

技术标签:

【中文标题】Flutter web 无密码登录不会触发身份验证状态更改【英文标题】:Flutter web passwordless login does not trigger auth state change 【发布时间】:2020-06-11 16:27:07 【问题描述】:

我正在尝试在 Flutter Web 应用程序中实现无密码登录。我使用了StreamBuilder 小部件来监控身份验证状态。

          child: StreamBuilder<FirebaseUser>(
            stream: FirebaseAuth.instance.onAuthStateChanged,
            builder: (context, snapshot) 
              print("AuthStateChanged");
              print(snapshot.connectionState);
              if (snapshot.connectionState == ConnectionState.active) 
                print("Connection Active");
                FirebaseUser user = snapshot.data;
                if (user == null) 
                  return LoginPage();
                
                return LoggedIn();
               else 
                print("Connection Inactive"); //Connection Inactive, show error dialog
                return Text("***");
              
            ,
          ),

我在 firebase 中创建了一个动态链接 https://mypwakk.page.link/6SuK,它指向一个要求用户返回应用的 html

<!DOCTYPE html>
<html>
  <head>
    <title>Sign in via email</title>
  </head>
  <body>
      <h1>You now have signed in.</h1>
      <p>Go back to the same device you opened the app from and continue using the app as an authenticated user.</p>
  </body>
</html>

然后使用FirebaseAuth.instance.signInWithEmailAndLink()发送登录链接

收到电子邮件中的链接后,我单击它,它确实将我带到了 html 页面。此时我预计身份验证状态将在我的 StreamBuilder 中更改,并且处理程序打印调试消息。但我没有看到控制台上打印任何内容。

我错过了什么吗?任何帮助将不胜感激。

【问题讨论】:

如果用户登录到应用程序的不同实例,则只有 实例会登录。为确保您的 onAuthStateChanged 触发,请确保链接在包含FirebaseAuth.instance.onAuthStateChanged 侦听器的应用实例中打开。 嗨@FrankvanPuffelen,它是同一个实例。发送电子邮件并单击链接时,它在 chrome 中打开。 嗯...我希望onAuthStateChanged 在这种情况下会触发,但必须承认我从未尝试过使用 Flutter Web。如果您强制检查currentUser,是否真的在那里获得了身份验证状态?如果是这样,那至少只是听者的问题。 添加了一个带有onPressed: () async FirebaseUser user = await FirebaseAuth.instance.currentUser(); print(user.toString()); 的按钮,得到null。所以这不是监听器的问题。 【参考方案1】:

在对动态链接进行了一些实验后,我已经解决了这个问题。

我做错的是,

创建了一个 html 页面来处理链接点击。 创建了一个动态链接域。 创建了一个指向 html 页面 url 的动态链接。 在我发送电子邮件链接时将动态链接作为url 参数提供给actionCodeSettings

我应该做的,

创建一个 html 页面来处理链接点击。添加 java-script 处理程序以执行单击验证和登录过程。 创建动态链接域。 在我发送邮件链接时将html页面url作为url参数和动态链接域作为dynamicLinkDomain参数提供给actionCodeSettings

检查,https://firebase.google.com/docs/auth/web/email-link-auth#completing_sign-in_in_a_web_page。该文档确实指定了该过程,但来自颤动土地,将其翻译为颤动网络目标对我来说有点模糊。希望将来会有一些清晰的 Flutter Web 目标示例代码可用。

【讨论】:

以上是关于Flutter web 无密码登录不会触发身份验证状态更改的主要内容,如果未能解决你的问题,请参考以下文章

Web API 身份验证(无 asp.net 身份)

如果用户已经无密码登录,firebase 可以设置密码身份验证吗?

FIDO标准 无密码身份认证登录

通过电子邮件/密码进行身份验证的颤振问题

Flutter Firebase 身份验证和/或登录不成功

我是 Flutter Web 的新手,如何使用 Firebase 电话身份验证对用户进行身份验证,有没有办法让用户保持登录状态?