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 未定义

passport.js req.user 正在返回:'Promise false ' - 如何获取当前会话的用户名?

会话结束后从用户浏览器中删除 cookie。我使用 Passport-twitter 对用户进行身份验证。

使用 websockets 和 Nest.js 的 Passport 会话身份验证未进行身份验证

将服务器移动到 CORS 位置时,Passport/Express 会话身份验证中断