如何在 signup/register 中使用 passport.js 和快速服务器保存用户数据

How to save user data in signup/register using passport.js with express server

我正在努力在我的 react/node/express/sequelize 应用程序中实现 passport.js。

我目前有中间件用于登录用户,并检查用户是否已通过身份验证。但是,当新用户注册或注册时,他们的用户数据不会保存到服务器会话中(即使它是在数据库中创建的)。这意味着用户注册后,他们必须转到登录页面,输入他们的凭据并点击登录,然后才能保存他们的会话。

我的登录功能很简单:

    router.post('/login', passport.authenticate('local'), (req, res) => {
        //console.log(req);
        console.log("Is authenticated: " + req.isAuthenticated());
        res.json(req.user);
      });

它使用 passport.authenticate 本地策略,我将其定义为:

passport.use(new LocalStrategy(
  {
    usernameField: 'email',
  },

  ((email, password, done) => {
    User.findOne({
      where: {
        email,
      },
    }).then((dbUser) => {
      if (!dbUser) {
        return done(null, false, {
          message: 'Incorrect email.',
        });
      }
      if (!dbUser.validPassword(password)) {
        return done(null, false, {
          message: 'Incorrect password.',
        });
      }
      return done(null, dbUser);
    });
  }),
));

我从护照文档和查看其他问题得知 passport.authenticate 本地策略自动调用 req.login() 函数,该函数序列化我的用户信息并将其保存在服务器会话中.

我的主要问题是我不确定如何在我的注册函数中实现它。

    router.post('/signup', (req, res) => {
        const user = {
            first_name: req.body.first_name,
            last_name: req.body.last_name,
            email: req.body.email,
            password: req.body.password,
        };

        User.findOrCreate({where: {email: user.email}, defaults: user})
        .then(data => {
            res.send(data);
        })
        .catch(err => {
            res.status(500).send({
            message:
                err.message || "Some error occurred while creating the User."
            });
        });
    });

我试过在 findOrCreate 之后调用 req.login(),但出现错误:

(node:42313) UnhandledPromiseRejectionWarning: Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client

如果我使用我的本地策略,我会收到未经授权的响应(因为我用于授权的凭据尚未在数据库中)。

我想我需要为登录制定一个自定义策略,但我不清楚这是否是正确的方法,或者我将如何指定它。

我通过在 res.send 之前添加 req.login 来修复此问题:

router.post('/signup', (req, res) => {
        const user = {
            first_name: req.body.first_name,
            last_name: req.body.last_name,
            email: req.body.email,
            password: req.body.password,
        };

        User.findOrCreate({where: {email: user.email}, defaults: user})
        .then(data => {
         

            req.login(data[0], function(err) {
                if (err) {
                    console.log("login function erroring out with: " + err)
                }
            });

            res.send(data);

            
        })
        .catch(err => {
            res.status(500).send({
            message:
                err.message || "Some error occurred while creating the User."
            });
        });
    });