如何使用Passport.js处理用户注册后的身份认证问题
问题原因
你的注册逻辑仅完成了用户数据入库,没有触发Passport的会话创建流程。Passport只有在调用passport.authenticate(也就是登录接口用的校验逻辑)或者主动调用req.login()方法时,才会执行序列化逻辑,把用户身份写入当前会话,生成对应的登录态Cookie返回给前端。你当前的序列化逻辑是正常的,没有问题。
修复方案
修改/signup接口的代码,在用户创建成功之后,主动调用req.login完成自动登录:
router.post( "/signup", ErrorMiddleware(async (req, res, next) => { if (req.user !== undefined) { res.redirect("/me"); return; } const user = req.body; if (!isAValidInstance(user, userSchema)) { logger("POST /auth/signup", logLevels.warn, "Invalid body"); ResponseError.badRequest(res); return; } user.password = SHA256(user.password); const createdUser = await User.createUser(user); if (createdUser !== null) { // 主动调用passport的login方法创建登录会话 req.login(createdUser.user_id, function(err) { if (err) { return next(err); } // 会话创建完成后再返回成功响应 return ResponseSuccess.success(res, createdUser); }); } else { ResponseError.unauthorized(res); } }) );
补充说明
req.login是Passport暴露给开发者的原生方法,作用和passport.authenticate完成用户校验后的逻辑完全一致,会自动触发serializeUser把用户ID写入session,后续请求就可以正常通过isConnected中间件的校验。- 必须在
req.login的回调里返回响应,不要直接在调用后立刻返回,否则session还未持久化完成,返回的响应不会携带有效的登录态Cookie。
内容的提问来源于stack exchange,提问作者Fares
相关产品推荐
相关产品推荐

