Passport 似乎忘记了用户会话
Posted
技术标签:
【中文标题】Passport 似乎忘记了用户会话【英文标题】:Passport seems to forget the user session 【发布时间】:2015-10-28 05:47:39 【问题描述】:Google 了很长时间,到目前为止还没有真正找到任何有效的方法,所以我想在这里问一下。
我正在尝试让会话与 Passport 一起使用。我已经完成了注册和登录功能,这似乎可以正常工作。
主要问题是 req.isAuthenticated 总是返回 false。 我已经尝试了通常的方法:
确保 app.use(passport.session()) 出现在 express-session 配置之后:
...
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded( extended: false ));
app.use(cookieParser());
app.use(session(
secret: 'somethingsomethingdarkside',
cookie: maxAge: 1209600000 ,
saveUninitialized: false,
resave: false,
// using store session on MongoDB using express-session + connect
store: new MongoStore(
url: configDB.url,
collection: 'sessions'
)
));
app.use(passport.initialize());
app.use(passport.session()); // persistent login sessions
...
我已经进入 Passports request.js 文件,并进行了一些调试,我可以看到
this[property/*user*/] = user;
设置我想要的值,我认为它应该。
现在,每当我打电话时
if (req.isAuthenticated())
结果
this[property/*user*/] == undefined
返回错误。我还输入了一条日志消息,告诉我模块何时初始化,并且只在服务器启动时执行一次。
据我所知,user.deserializeUser 也从未被调用过。
有点不知所措,谁能帮帮我?
【问题讨论】:
你检查req.user
的值了吗?
另外你是怎么定义MongoStore
的?
MongoStore 很好。我可以看到它每次登录时都会添加一个新会话(以及每次我注销时,不知道为什么。)。 req.user 显然是未定义的,起初这是有充分理由的(因为我像白痴一样使用 sessionStorage,没有意识到它是键值存储)。但现在,它来自 req.body.user。如何将其移至 req.user ?我以与登录和注册相同的方式添加它,但我想有一些 Passport 中间件可以减少一些参数。
【参考方案1】:
我在这里有两三种愚蠢,但最终,经过数小时的深夜编码(可能是问题的主要根源),我设法解决了它。
@haywire 将我指向req.user
,我看到它是空白的,然后我确保正确发送。
然后它就不起作用了,因为我曾尝试使用路由中间件功能,该功能应该在我定义之前检查用户是否已登录。
咖啡是一种毒品。
【讨论】:
以上是关于Passport 似乎忘记了用户会话的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 5.4建站06--API 认证系统 Passport
passport.js req.user 正在返回:'Promise false ' - 如何获取当前会话的用户名?
会话结束后从用户浏览器中删除 cookie。我使用 Passport-twitter 对用户进行身份验证。