如何使用 cookie-session 和 passport.js 在注册时启动会话?

Posted

技术标签:

【中文标题】如何使用 cookie-session 和 passport.js 在注册时启动会话?【英文标题】:How to initiate session on signup with cookie-session and passport.js? 【发布时间】:2020-11-03 20:49:33 【问题描述】:

我有一个/register 路由器用于注册用户。为了简单起见,我现在使用cookie-session(类似)而不是express-session

我被困在我需要在注册时对用户进行身份验证的部分。我对req.sessions.save()req.login() 的功能感到困惑。我知道req.login() 是由passport.js 提供的,但我不明白哪个提供req.session 对象。

我是 passport.js 的新手,并且已广泛阅读大量文章、视频和 *** 问题来积累我的知识。老实说,到目前为止,护照文件一直很痛苦。我仍然对注册时的会话启动应该如何工作感到困惑。许多文章跳过了注册部分。因此,我请求帮助。

router.post('/register', (req, res, next) => 
    console.log(req.body)
    User.findOne(email: req.body.email).then((currentUser) => 
        if(currentUser) // already exists
            res.render('login')
         else  // if not, create user in our db
            new User(
                email: req.body.email
            ).save().then((newUser) => 
                passport.authenticate('local')(req, res, () => 
                    
//>>>>              //**This is where I don't know what to do**
                    
                    req.session.save((err) => 
                        if (err) 
                            return next(err)
                        
                        res.redirect('http://localhost:3000')
                    )
                )
            );
        
    );
)

【问题讨论】:

【参考方案1】:

const express = require("express");
const router = express.Router();
const passport = require("passport");

router.post("/register", (req, res, next) => 
  User.findOne( email: req.body.email ).then((currentUser) => 
    if (currentUser)  // already exists
      res.render('login')
     else  // if not, create user in our db
      new User(
        email: req.body.email
      ).save();
    
  );

  passport.authenticate("local", function (err, user, info) 
    if (err) 
      return res.status(400).json( errors: err );
    
    if (!user) 
      return res.status(400).json(errors:"No user found.");
      

      // or save User : new User(email: req.body.email).save();
    

    req.login(user, function (err) 
      if (err) 
        return res.status(400).json( errors: err );
      

      req.session.save((err) => 
        if (err) 
          return next(err)
        
        res.redirect('http://localhost:3000')
      );      
      return res.status(400).json( success: `logged in $user.id` );
    );
  )(req, res, next);
);

module.exports = router;

【讨论】:

passport.authenticate() 也调用了req.login(),所以它是多余的,我认为调用它两次是不对的。【参考方案2】:
passport.authenticate('local')(request, response, () => 
  req.session.save((err) => 
    if (err) 
      return next(err)
    
    res.redirect('http://localhost:3000')
  )

【讨论】:

虽然这个答案试图解决这个问题,但如果它有一个关于它如何解决问题的描述,那么它会更有用,以便 OP 和其他人可以从中学习。 这不是我在问题中发布的代码吗?我认为这是重定向链接,但在您最初注册时显示unauthorized

以上是关于如何使用 cookie-session 和 passport.js 在注册时启动会话?的主要内容,如果未能解决你的问题,请参考以下文章

Cookie-Session机制

为啥除了 passport.js 还要使用 cookie-session?

Django框架的使用教程--Cookie-Session[五]

cookie-session

Node.js | 详解 Cookie-Session登录验证 的工作原理

通过 iam:pas-s-role 创建 iam 用户和 aws 机密