Firebase authWithOAuthRedirect() 问题

Posted

技术标签:

【中文标题】Firebase authWithOAuthRedirect() 问题【英文标题】:Firebase authWithOAuthRedirect() woes 【发布时间】:2014-12-10 23:19:06 【问题描述】:

我正在尝试更新我的 angularjs 应用以支持 Firebase 1.1(我坚持使用 Firebase 1.0.x)。 它弃用了 firebasesimplelogin,包括 Firebase 核心内的身份验证。

我已经能够使用

成功实现身份验证
authWithOAuthPopup("<provider>", function(error, authData)  ... );

它接受一个回调,在authData中传递认证数据。

相反,我无法理解如何使用

authWithOAuthRedirect("<provider>", function(error)  ... );

Firebase Authentication docs page 非常简洁... :-(。就是这么说的:

或者 [而不是 authWithOAuthPopup],您可以提示用户使用完整的浏览器重定向登录,当您返回原始页面时,Firebase 会自动恢复会话

当 Firebase - 重定向后 - 返回到我的页面时,我如何获取 authData?

【问题讨论】:

ref.onAuth(function(authData) ... 适合你吗? firebase.com/docs/web/guide/… 是的!谢谢,这是正确的解决方案(如果您想将其发布为答案...)。不幸的是,我还有一些额外的问题(与我缺乏对角度逻辑的理解有关......)。如果您愿意,我会详细说明它作为我的问题的更新......但是,它与 auth 和/或 Firebase 完全无关...... 如果不相关,我会发布一个新问题。 是的,我确实发布了一个新问题(此处:***.com/questions/26406593/…)。 【参考方案1】:

可以通过直接在 ref 上注册一个监听器来获得 authData(所以在调用 authWithOAuthRedirect 之前)。

ref.onAuth(function(authData)  
    ... 
 
ref.authWithOAuthRedirect("google", function(error)  ... );

见https://www.firebase.com/docs/web/guide/user-auth.html#section-monitoring-authentication

【讨论】:

我正在使用 AngularFire 来有效地做同样的事情($ref.$onAuth,$ref.$authWithOauthRedirect). *after* the redirect completes, the $onAuth` 回调未被调用,我必须刷新页面才能登录。另一个答案提供了手动重新加载页面的解决方案,但我想避免这样做。还有其他想法吗? ^ 对我来说同样的问题!你找到解决办法了吗?【参考方案2】:

我想我遇到了和你一样的问题。我正在尝试进行 Facebook 身份验证。

首先,我想澄清一下我的问题的重现步骤。

    我的应用已加载到客户端。 用户点击 Facebook 登录。 ref.authWithOAuthRedirect('facebook', ...) 被调用。 客户端重定向到 Facebook,Facebook 将客户端重定向回 Firebase 应用 尽管通过 Facebook 成功进行了身份验证,但传递给 onAuth() 的回调被调用(仅一次)且 authData === null。

传递给 onAuth() 的回调不会使用正确的 authData 再次调用。

但是,重新加载应用程序会导致使用正确的 authData 调用传递给 onAuth 的回调。我不知道造成这种情况的原因,但我怀疑比赛条件。

这是我的解决方法。

在调用 ref.authWithOAuthRedirect('facebook', ...) 之前,请在 sessionStorage 中为自己设置一个标志。

sessionStorage.reload = true;
ref.authWithOAuthRedirect('facebook', ...)

当客户端从 Facebook 重定向回您的应用时,您应该能够检查此标志并在必要时重新加载页面。

if (sessionStorage.reload) 
    delete sessionStorage.reload;
    setTimeout(function() 
        location.reload();
    , 1000)

setTimeout(function() ... , 1000) 有助于对抗假定的竞争条件。我发现 500 毫秒不足以解决竞争条件。

还有一个小问题:如果您过早地重新加载页面,那么无论您重新加载页面多少次,authData 都将保持为空。

【讨论】:

谢谢,这解决了我使用 Google 身份验证的重定向问题。我怀疑 getAuth() 在重定向响应中不是同步/阻塞的。 我也在研究这个问题。 @Nikita 你有没有找到原因或比重新加载更好的解决方案?在进行 $authWithOAuthRedirect 调用之前,我也在使用 ref.$onAuth,但我得到了相同的结果。在我的情况下,我只是在第一次尝试没有设置 authData 之后调用 $authWithOAuthRedirect 作为第二次尝试。

以上是关于Firebase authWithOAuthRedirect() 问题的主要内容,如果未能解决你的问题,请参考以下文章

无法解决:com.google.firebase:firebase-ml-vision:24.1.3;无法解决:com.google.firebase:firebase-core:20.0.2

没有创建 Firebase 应用“[DEFAULT]” - 在 Flutter 和 Firebase 中调用 Firebase.initializeApp()

如何修复 Firebase 9.0 导入错误? “尝试导入错误:‘firebase/app’不包含默认导出(导入为‘firebase’)。”

Firebase 持久化,清除 Firebase 缓存

Firebase 存储不会下载并添加到 firebase 数据库

将 Firebase 身份验证与 Firebase 数据库连接