【问题标题】:Logging out with Firebase and Node.JS使用 Firebase 和 Node.JS 注销
【发布时间】:2015-07-22 03:15:09
【问题描述】:

我想为需要注销但未在前端启用 JavaScript 的用户提供 Node.JS Express 路由包装器。 DB 是我对 Firebase 的引用:

router.get('/logout', function(req, res) {
    DB.unauth();
    res.redirect(302, '/');
});

当我尝试以这种方式登录后退出时,我收到以下错误:

错误:发送后无法设置标头。

documentation for Firebase.unauth() 很轻,但是在路由中调用它(有或没有res.redirect)会导致错误。有人对此问题有建议或解决方法吗?

【问题讨论】:

  • DB 在这里纯粹是对 Firebase 的引用吗?为了应对下面的 cmets,ref.unauth() 不会在 Node 中设置响应标头,除非您已经包装了该方法。
  • 目前还不清楚是否正在为进入您应用的每个用户请求创建新的 Firebase 客户端连接。共享连接会产生安全隐患,更不用说可能存在多个最终用户对同一通道进行身份验证和取消身份验证的竞争条件。
  • 是的:var DB = new Firebase('https://MY_FIREBASE.firebaseio.com'); 是我的 apis.js 文件顶部的声明。它不仅用于注销,还用于登录、注册等。这不应该受到种族/安全问题的影响吗?有没有更好的方法在 Node 中做到这一点?
  • 我很乐意提供帮助 - 请通过 firebase.com 的 rob 与我联系,我们可以具体讨论您想要做什么以及如何最好地做到这一点。 =)

标签: node.js firebase logout firebase-authentication


【解决方案1】:

所以我遇到了同样的问题。对我来说,我使用的是异步 authDataCallback 函数。 显然 onAuth 设置您的标头,因此当您尝试转到 /logout 时,您的标头已设置并且重定向将失败。所以我所做的是切换 authDataCallback 我检查了登录状态:

var authData = ref.getAuth();

if (authData) {
console.log("User " + authData.uid + " is logged in with " + + authData.provider);
} else {
console.log("User is logged out");
}

然后我的注销路线完美无缺。

app.get('/logout', function(req , res){
   ref.unauth();
   res.redirect('/');
});

【讨论】:

    【解决方案2】:

    看起来重定向时会抛出该错误 - 一旦发送正文,您就无法标头。也许试试:

    response.writeHead(302, { Location: '/' });
    response.end();
    

    如果这不起作用,我会把钱花在 .unauth() 实际上是在设置标题上,如果是这样,你可能需要使用 ol' <noscript> 标签。

    尽管如此:您正在构建一个使用 JavaScript 与后端 Firebase 集成的应用。为什么要构建一个(可能)严重依赖 JavaScript 的现代网络应用程序,仅在用户不支持时支持注销用户?他们甚至可以首先登录吗?

    【讨论】:

    • DB.unauth() 似乎确实在设置标题,因为正如我在原帖中提到的,无论我是否使用重定向,都会发生错误。至于应用程序架构,事物的用户管理方面将依赖 JS,但浏览应用程序(经过身份验证和非经过身份验证的用户)的文件和事物将不需要 JavaScript 来最大限度地提高可用性。虽然你提出了一个极好的点!如果用户管理需要 JavaScript,我是否需要担心非 JS 用户尝试登录?我会咀嚼这个!谢谢你的回复,莱姆斯!
    • 好的 - 另外,请记住 服务器端 JavaScript 与客户端完全不同。 DB.unauth() 正在执行服务器通常会执行的会话失效,并且响应通过 HTTP 传输。在这方面,即使禁用了 JavaScript,我怀疑客户端仍然会被注销。
    • 我实际上是一个前端向导,所以我知道其中的区别:)。只是为了好玩而玩弄 Node.JS 和 Firebase。 Firebase API 应该是同构的,但在这种边缘情况下,我怀疑存在错误,因为它主要用于前端,而我在两者上都使用它。该文档没有提及unauth() 是否是异步的或者它是否有回调(它有)。我真的希望创建一个注销路线非常简单,它是消除用户会话的一站式商店; JavaScript 是打开还是关闭。
    • 啊,好东西。嗯...你可以禁用 .js 看看会发生什么!
    猜你喜欢
    • 1970-01-01
    • 2020-08-30
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    • 2018-10-23
    • 2018-11-30
    • 2019-01-27
    • 1970-01-01
    相关资源
    最近更新 更多