【问题标题】:Why is my express-session not persisting?为什么我的快速会话不持久?
【发布时间】:2022-11-27 14:14:21
【问题描述】:

我是快速会话的新手。它的行为不像我期望的那样,我想知道是否有人可以指出原因。这可能是基本的用户错误。

我正在构建一个应用程序,用于存储 k-9 志愿者搜救队的培训信息。我正在尝试使用 PassportJS 对登录进行身份验证。我通过 Mongo Atlas 存储数据。我处于我只想看到它基本上工作的水平,以便我可以进一步构建它。

这是我设置中间件的方式:

router.use(session({
  secret: process.env.SESSION_SECRET,
  resave: false,
  saveUninitialized: true
}))

(我不确定我是否在滥用 Passport,所以我也会展示我是如何构建它的):

router.use(passport.initialize()) 

router.use(passport.session())    

authUser = async (username, password, done) => {
  
  const returnedUser = await User.findOne({username: username}, (err, user) => {
    if (err) {
      return err
    } else {
      return user
    }
  })
  .clone()


  if (!returnedUser) {
    return done(null, false) 
  } else if (returnedUser.password != password) {
    return done(null, false) 
  } else {
    return done(null, returnedUser)
  }
}

passport.use(new LocalStrategy (authUser))

passport.serializeUser( (userObj, done) => {
  done(null, userObj)
})

passport.deserializeUser((userObj, done) => {
  done (null, userObj )
})

当我登录时,console.log() 会话...

router.post('/signIn', passport.authenticate('local', {
  // failureRedirect: 'http://localhost:3000/users/signIn'
  failureMessage: 'failure'
}), (req, res) => {
  console.log('req.session:', req.session)
  res.send('finished')
})

...我在控制台中得到了我所期望的:

req.session: Session {
  cookie: { path: '/', _expires: null, originalMaxAge: null, httpOnly: true },
  passport: {
    user: {
      _id: new ObjectId("62e5505409d8b098030b70aa"),
      username: 'cap1',
      password: 'America',
      firstName: 'Steve',
      lastName: 'Rogers',
      email: 'cap@notshield.org',
      phoneNumber: 1234567890,
      dateCreated: 2022-07-30T15:37:56.079Z,
      k9s: [Array],
      __v: 0
    }
  }
}

(我知道我需要加密这个密码,但在我试图理解它的时候我暂时让它可见。)

但是,然后当我测试它以查看它是否仍然存在时......

router.post('/', async (req, res) =>  {
  console.log(req.session)
  //check all field on the front end
  let postUser = new User({
    "username": req.body.username,
    // "password": await hasher(req.query.password, 10),
    "password": req.body.password,
    "firstName": req.body.firstName,
    "lastName": req.body.lastName,
    "email": req.body.email,
    "phoneNumber": req.body.phoneNumber,
    "dateCreated": new Date(),
    //query must must be formatted like
    //&k9s[]=spike&k9s[]=lucey
    "k9s": req.query.k9s
  })
  postNew(postUser, res)
})

...会话在 console.log() 中不包含通行证信息:

Session {
  cookie: { path: '/', _expires: null, originalMaxAge: null, httpOnly: true }
}

(我意识到在实践中需要通过登录会话来创建新用户是没有意义的。我只是想使用我知道的两个功能来测试它。)

为什么会话不在 http 请求之间保留 Passport JS 信息?

【问题讨论】:

    标签: node.js mongodb express passport.js express-session


    【解决方案1】:

    这可能与您使用的护照版本有关。我最近在从 0.4.1 迁移到 0.6.0 后遇到了类似的问题,这可能改变了登录/注销时会话的持续方式以解决此漏洞: https://github.com/advisories/GHSA-v923-w3x8-wh69

    如果将 keepSessionInfo: true 选项添加到 authenticatelogout 方法,它的行为将继续像版本 0.4.1。

    对于身份验证:
    passport.authenticate("local", {keepSessionInfo: true})
    对于注销:
    passport.logout({keepSessionInfo: true}, (err) => {})

    请参阅此 GitHub 问题: https://github.com/jaredhanson/passport/issues/949

    【讨论】:

      猜你喜欢
      • 2012-11-05
      • 2016-05-06
      • 2013-09-06
      • 2019-10-13
      • 2018-09-03
      • 1970-01-01
      • 2021-05-09
      • 1970-01-01
      • 2016-04-14
      相关资源
      最近更新 更多