我正在尝试构建一个基本的登录功能,并测试它是否创建了一个我以后可以使用的会话。我使用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`})
}
})
我使用Postman向此接口发送请求,邮件头为Cookie: appName=${sessionID}
,使用在api/login
路由中创建的sessionID。这将始终创建一个新的sessionId并返回401。
我的理解正确吗?如果是这样,我该如何创建这种预期的行为?
发布于 2016-11-15 16:23:01
我现在有了一个答案--有几个我认为在互联网上的其他来源不清楚的比特。
首先,如果您在使用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
相同的键。再说一次,回想起来是很明显的。
希望这能帮助那些遇到同样错误的人。
https://stackoverflow.com/questions/40610968
复制