You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 11:06:02