首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Express.js/Passport应用程序为每个请求创建新会话,尽管请求头中有会话ID

Express.js/Passport应用程序为每个请求创建新会话,尽管请求头中有会话ID
EN

Stack Overflow用户
提问于 2013-07-26 03:30:53
回答 1查看 956关注 0票数 5

这一点以前没有被注意到,因为对于客户机-服务器通信,不需要通过XHR进行身份验证(到目前为止)。在实现一些集成测试时,我创建了对应用程序实际实例的realy。在第一个请求中对用户进行了身份验证,理论上,用户的唯一标识符和其他相关信息存储在会话中(正如我已经说过的,这对于不需要通过XHR确认其身份的真正客户端来说工作得很好)。由于某些原因,即使使用完全相同的会话ID来触发后续请求,我也无法在后续请求中检索会话,因此无法看到用户已通过身份验证,这将导致无法进行预期行为的测试失败,并且HTTP 401未经授权正在填充终端。

我看到了几个类似于这样的问题,但“相同的会话ID”似乎并不存在于其中。

是否需要手动向所有XHR请求添加Set-Cookie头?太可怕了,一定有更好的办法!

因此,人们喜欢源代码,下面是测试中的一些,触发这些请求:

代码语言:javascript
复制
// Ensure logged in before sending request, to verify that authorized
// users encounter the expected behaviour.
jQuery.post(domain+'/login', {email:'test@express.app', password:'12345678'},
function(data,x,y){
  data.should.equal("true")
  jQuery.ajax({url:domain+'/event', type:"POST",
    name: "TestEvent", location: "TestVille",
    startDate: new Date('2013-09-01'), startTime: '6:45 pm',
    description: "Test Event #1", success: state.success,
    error: state.error, completed: state.completed
  })
})

登录发生时,用户ID被写入会话(`req.logIn()应该这样做,它不会报告任何故障),用户ID的序列化不会报告任何故障,我非常困惑为什么使用相同会话ID的后续请求无法找到序列化的用户ID。

我通常不参与web开发,所以这对一些人来说可能是显而易见的,但我已经找了一整天的答案,根本找不到答案。我希望得到任何提示,并乐意提供尽可能多的代码,以说明问题所在。

以下几点代码可能与此相关:

用户ID的序列化/反序列化(目前是以最简单的方式实现的) --这在初始化护照和passpot.session()之后的中间件初始化过程中是非常早期的。这对于非XHR请求非常有效)

代码语言:javascript
复制
// Serialize user for passport session-store
// Currently only serializing 'user_id'
passport.serializeUser(function(user, done) {
  done(null, user._id)
})

// Deserialize user from session-store to provide
// access to the User instance
passport.deserializeUser(function(id, done) {
  User.findById(id, function(err, user) {
    done(err, user)
  })
})

通过当地战略对用户进行认证:

代码语言:javascript
复制
passport.use(new LocalStrategy({
    usernameField: "email", passwordField: "password",
    passReqToCallback: true, failureFlash: true
  },
  function(req, email, password, done) {
    User.findByEmail(email, function(err, user) {
      if(user) {
        if(err) console.log(err)
        if(user instanceof UserLocal) {
          user.verifyPassword(password, function(err, match) {
            if(err) console.log(err)
            if(!match) {
              return done(err, false,
                "Username or password is incorrect.")
            }
            return done(null, user)
          })
        } else {
        var msg = "Account registered under " + user.providerName()
                + ", please login using " + user.providerName()
        return done(err, false, msg)
      }
    } else {
      return done(err, false, "Username or password is incorrect.")
    }
  })
})

最后,首先写信给会话的请求:

代码语言:javascript
复制
function loginHelper(req, res, next) {
  passport.authenticate('local', {
    failureFlash:true,
    failureRedirect: false,
    successRedirect: false 
  },
  function(err, user, info) {
    req.logIn(user, function(err) {
      if(!err) err = {}
      if(req.xhr) {
        console.log(req.session)
        res.status(200).end(err.message || "true")
      } else {
        if(err.message) req.flash('error', err.message)
        else res.redirect('/')
      }
    })
  })(req, res, next)
}

我知道有一些奇怪的事情,比如发送状态为200,而不管登录状态如何,但我可以确认序列化的用户id是在初始登录XHR请求时写入会话的,并且在后续的XHR请求中没有反序列化。

正如我刚才所说,我在这方面的经验较少,可能会有很大的帮助。如能提供任何帮助,我们将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2016-01-02 14:38:45

你先帮我

代码语言:javascript
复制
app.use(express.static(__dirname + '/public', { maxAge: oneDay }));

和更新函数以不触发数据库。

代码语言:javascript
复制
 passport.serializeUser( (user, done) => {
        var sessionUser = { id: user.dataValues.id, fio: user.dataValues.fio, email: user.dataValues.localemail, role: user.dataValues.role, login: user.dataValues.login,  position: user.dataValues.position }
        done(null, sessionUser)
    })

    passport.deserializeUser( (sessionUser, done) => {
        // The sessionUser object is different from the user mongoose collection
        // it's actually req.session.passport.user and comes from the session collection
        done(null, sessionUser)
    })

https://www.airpair.com/express/posts/expressjs-and-passportjs-sessions-deep-dive

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17872452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档