2015-07-22 138 views
0

我希望为需要注销并且前端没有启用JavaScript的用户提供Node.JS Express路由包装。 DB是我参考我的火力地堡:使用Firebase和Node.JS注册

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

当我尝试注销这种方式已经登录了,我得到以下错误:

Error: Can't set headers after they are sent.

documentation for Firebase.unauth()很轻,但称这是在路线(有或没有res.redirect)会导致错误。有没有人有这个问题的建议或解决方法?

+0

“DB”是否是对Firebase的纯引用?为了对抗下面的注释,'ref.unauth()'不会在Node中设置响应头,除非你已经包装了这个方法。 –

+0

目前还不清楚是否为每个进入您的应用的用户请求创建了新的Firebase客户端连接。共享连接会产生安全隐患,更不用说可能的竞争条件,即多个终端用户对相同频道进行身份验证和解除身份验证。 –

+0

是:'var DB = new Firebase('https://MY_FIREBASE.firebaseio.com');'是在我的apis.js文件顶部的声明。它不仅用于注销,还用于登录,注册等。这应该不会受到种族/安全问题的影响吗?有没有更好的方式在Node中做到这一点? –

回答

0

看起来像是在重定向上抛出的错误 - 一旦发送正文,您就无法收到标题。也许尝试:

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

如果不工作,我把对.unauth()钱实际上是设置标题,如果是,你可能需要使用OL” <noscript>标签。

所有这一切都是这样说的:您正在构建一个应用程序,该应用程序使用JavaScript与后端的Firebase进行集成。为什么要构建一个现代的网络应用程序(大概)严重依赖JavaScript来支持在用户不支持时注销用户?他们甚至可以登录吗?

+0

'DB.unauth()'确实是设置头文件,因为正如我在原始文章中提到的那样,无论是否使用重定向,都会发生错误。 至于应用程序架构,事物的用户管理方面将依赖JS,但浏览应用程序(包括auth'd和non-auth'd用户)的文件和事情不需要JavaScript来最大限度地提高可用性。虽然你提出了一个很好的观点!如果用户管理需要JavaScript,我是否需要担心试图登录的非JS用户?我会咀嚼这个! 感谢您的回复,remus! –

+0

好吧 - 请记住,_server-side_ JavaScript与客户端完全不同。 'DB.unauth()'执行服务器通常执行的会话失效,并且响应通过HTTP传输。在这方面,即使JavaScript被禁用,我怀疑客户端仍会被注销。 – brandonscript

+0

我其实是相当前端的向导,所以我意识到不同之处:)。只是玩弄Node.JS和Firebase的乐趣。 Firebase API应该是同构的,但它是这样的边缘案例,我怀疑它存在缺陷,因为它主要用于前端,而我却在两者上使用它。文档没有提及“unauth()”是否是异步的,或者是否有回调(它确实)。我真的希望创建一个注销路由非常简单,该路由是消除用户会话的一站式服务;无论JavaScript是打开还是关闭。 –

1

所以我遇到了同样的问题。对我来说,这是我使用异步authDataCallback函数。 显然onAuth设置您的标题,所以当您尝试去/注销您的标题设置和重定向将失败。所以我所做的是我切换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('/'); 
});