请求cookie未按预期返回Express会话数据

时间:2016-11-15 13:25:12

标签: node.js redis session-cookies express-session

我正在尝试构建一个基本的登录功能并测试它是否会创建一个我以后可以使用的会话。我使用express-session和redis来持久化会话数据。这是我的设置:

app.use(bodyParser.json())
app.use(bodyParser.urlencoded({extended: true}))
app.use(express.static(path.join(__dirname, 'client/build')))

app.use(cookieParser(process.env.COOKIE_SECRET))
app.use(session({
  store: new redisStore({
    host: '127.0.0.1',
    port: 6379
  }),
  secret: process.env.SESSION_SECRET,
  cookie: {maxAge: 1800},
  name: 'appName',
  resave: false,
  saveUninitialized: false
}))

app.use('/', routes)

然后是我的登录路线:

router.post('/api/login', (req, res) => {
  req.session.userId = req.body.id
  req.session.email = req.body.email

  //do I need to send out a cookie with the session created here?
  res.set({'Set-Cookie': 'appSession=' + req.session.id})
  res.status(200).send({
    "message": `User ${req.body.id} logged in with cookie ${req.session.id}`
  })
})

然后我的理解是,我应该能够阅读并添加到此会话中以查找我发送cookie的任何请求。以下是我测试的API:

router.post('/api/test' (req, res) => {
  if(req.session && req.session.userId) {
    res.status(200).send({"message": `User ID ${req.session.userId} is  authenticated`})
     } else {
       res.status(401).send({"message": `User ID ${req.session.id} is not authenticated`})
   }
})

我正在使用带有标头Cookie: appName=${sessionID}的邮递员使用api/login路由中创建的会话ID向此API发送请求。这总是会创建一个新的sessionId并返回401。

我的理解是否正确?如果是这样,我该如何创建这种预期的行为?

1 个答案:

答案 0 :(得分:1)

我现在得到了一个答案 - 有一些我认为从互联网上的其他来源都不清楚的。

首先,如果您在使用express-session

运行服务器时遇到DEBUG=express-session node server.js问题,则调试问题非常有用

当我这样做时,我意识到express-session没有找到创建的会话。这是因为我在几秒钟而不是毫秒内设置了maxAge属性,因此它立即到期。白痴。

还有一个问题。尝试重试会话时,我得到了以下调试输出:

  express-session cookie unsigned +1ms
  express-session no SID sent, generating session +1ms

这是cookie解析器找不到我的SessionId,因为cookie解析器需要使用与express-session相同的密钥。再次,回想起来非常明显。

希望这可以帮助那些得到同样错误的人。