我正在使用NodeJS + express + express-session来持久化应用程序中任何位置的用户ID。
在第一个路线上,我的会话已定义
userProfileRoutes.route('/authentication').post((req, res) => {
req.session.userID = 10; //example
console.log(req.session)
}
console.log
的结果是:
Session {
cookie:
{ path: '/',
_expires: null,
originalMaxAge: null,
httpOnly: true,
secure: true },
userID: 10 } // this is the right value
但是,从另一条路线看,我看不到该值:
userProfileRoutes.route('/edit').get(function (req, res) {
console.log('After the nav edit route');
console.log(req.session);
}
这将打印
Session {
cookie:
{ path: '/',
_expires: null,
originalMaxAge: null,
httpOnly: true,
secure: true }
} // ID VARIABLE DISAPEARS HERE
我正在使用以下参数配置express-session
:
app.use(session({
secret: 'secret',
proxy: true,
resave: false,
saveUninitialized: true,
withCredentials: true,
cookie: { secure: true },
store: new MongoStore({ mongooseConnection: db })
}));
为什么我的userID不能在请求之间和所有路由上都保持不变?
答案 0 :(得分:1)
您正在设置cookie: {secure: true}
,但尝试使用HTTP访问服务器。
来自express-session documentation:
cookie.secure
将其设置为true时请注意,因为如果浏览器没有HTTPS连接,则兼容的客户端将来不会将cookie发送回服务器。
请注意,安全:真是推荐的选项。但是,它需要启用HTTPS的网站,即,对于安全Cookie来说,必须使用HTTPS。如果设置了安全性,并且您通过HTTP访问网站,则将不会设置Cookie。
请确保您正在使用HTTPS(始终在生产中!)或将cookie.secure
设置为false(也许,并且仅用于开发!)
安全标志是可以在HTTP响应中向用户发送新cookie时由应用程序服务器设置的选项。安全标记的目的是防止由于以明文形式传输cookie而导致未经授权的各方查看cookie。
要实现此目标,支持安全标记的浏览器将仅在请求进入HTTPS页面时发送带有安全标记的cookie 。换句话说,浏览器将不会通过未加密的HTTP请求发送带有安全标志的cookie。 通过设置安全标志,浏览器将阻止cookie通过未加密的通道传输。
来自https://www.owasp.org/index.php/SecureFlag
按照惯例,express-session
使用cookie存储会话ID ,并使用服务器端存储(在您的情况下为mongoDB)存储会话数据。如果浏览器因为找不到有效的cookie而没有发送您的会话ID,则服务器将假定没有会话,并在每次请求时将用户ID保存在新的会话中。
进入/authentication
后,它将把ID保存在新的会话中。当您尝试读取其他请求时,会话ID已更改,并且userID
中没有值。