Node.js项目Passport身份认证异常:跨浏览器/无痕窗口显示已登录状态
问题原因
你代码中使用的logedIn是全局作用域变量,Node.js服务运行期间所有用户请求都会共享这个变量的值:
- 只要有任意一个用户完成登录,触发
logedIn = true赋值,这个全局变量就会一直保持为true - 后续其他未登录用户的请求触发路由时,你只判断了登录成功时给变量设true,没有处理未登录时把变量重置为false的逻辑,所以所有请求渲染页面时都会传递
logedIn: true给模板,自然会在所有浏览器、无痕窗口都显示登录态导航栏。
修复方案
把logedIn改为路由内部的局部变量,每个请求单独计算当前用户的登录状态,不要使用全局变量存储单用户的会话属性:
app.get('/',function(req,res) { // 每个请求单独计算当前用户的登录状态,不共享 const logedIn = req.isAuthenticated(); Post.find(function(err,posts) { if(err){ console.log(err); } else { res.render('home',{posts:posts,logedIn:logedIn}) } }) })
补充说明
不要在Node.js服务的全局作用域存储和单个用户会话相关的状态,这类状态都可以从当前请求对象req的会话属性中直接获取,全局变量会被所有访问服务的用户共享,很容易引发这类权限泄漏、状态串扰的问题。
内容的提问来源于stack exchange,提问作者Nima Gh
相关产品推荐
相关产品推荐

