破坏会话后,Express Session Cookie (connect.sid) 未从浏览器中删除
Express Session Cookie (connect.sid) not being deleted from browser after destroying session
我有一个 Vue.js SPA 和一个用 Express.js 构建的 Node.js API。我正在使用 express-session (^1.11.3) 来管理会话,并使用 express-sequelize-session (0.4.0) 通过 Sequelize 在 Postgres DB 上保留会话,因为我需要一个会话才能使用 passport-azure -采用 oidc 策略的广告。
一段时间后,我在使用 Microsoft 帐户登录时遇到了一些问题,得出的结论是,这是因为会话 cookie (connect.sid) 从未从浏览器中清除。
我配置了一些错误并进行了一些更改,但即使进行了所有更改,它仍然无法正常工作。
我的 Express 应用程序的会话配置如下:
import session from 'express-session';
import expressSequelizeSession from 'express-sequelize-session';
const Store = expressSequelizeSession(session.Store);
app.use(session({
cookie: {
path: '/',
httpOnly: true,
secure: env !== 'development', // On environments that have SSL enable this should be set to true.
maxAge: null,
sameSite: false, // Needs to be false otherwise Microsoft auth doesn't work.
},
secret: config.secrets.session,
saveUninitialized: false,
resave: false,
unset: 'destroy',
store: new Store(sqldb.sequelize),
}));
在 FE 上,我将 Vue.js 与 Axios 一起使用并将 withCredentials 设置为 true,以便在 HTTP 请求中传递 cookie。
// Base configuration.
import Axios from 'axios';
Axios.defaults.baseURL = config.apiURL;
Axios.defaults.headers.common.Accept = 'application/json';
Vue.$http = Axios;
// When making request.
Vue.$http[action](url, payload, { withCredentials: true }).then(() => // Handle request);
从图中可以看出,cookie 是在注销请求时发送的。
注销时,我正在访问此端点并破坏会话 as is explained on the documentation。
router.post('/logout', (req, res) => {
try {
req.session.destroy(() => {
return responses.responseWithResultAsync(res); // Helper method that logs and returns status code 200.
});
return responses.handleErrorAsync(res); // Helper method that logs and returns status code 500.
} catch (error) {
return responses.handleErrorAsync(res, error); // Helper method that logs and returns status code 500.
}
});
有趣的是,数据库上的会话已删除,因此我知道 cookie 已根据具有正确会话 ID 的请求正确发送,但由于某种原因并未在浏览器上删除它。注销后我还有这个:
有谁知道我做错了什么?我发现在数据库上成功删除了会话但没有根据请求删除会话很奇怪。
由于@RolandStarke 提到了 express-session 库 doesn't have the built in functionality to remove the cookie from the browser,所以我只是通过以下方式手动完成:
router.post('/logout', (req, res) => {
try {
if (req.session && req.session.cookie) {
res.cookie('connect.sid', null, {
expires: new Date('Thu, 01 Jan 1970 00:00:00 UTC'),
httpOnly: true,
});
req.session.destroy((error) => {
if (error) {
return responses.handleErrorAsync(res, error);
}
return responses.responseWithResultAsync(res);
});
}
return responses.responseWithResultAsync(res);
} catch (error) {
return responses.handleErrorAsync(res, error);
}
});
我有一个 Vue.js SPA 和一个用 Express.js 构建的 Node.js API。我正在使用 express-session (^1.11.3) 来管理会话,并使用 express-sequelize-session (0.4.0) 通过 Sequelize 在 Postgres DB 上保留会话,因为我需要一个会话才能使用 passport-azure -采用 oidc 策略的广告。
一段时间后,我在使用 Microsoft 帐户登录时遇到了一些问题,得出的结论是,这是因为会话 cookie (connect.sid) 从未从浏览器中清除。
我配置了一些错误并进行了一些更改,但即使进行了所有更改,它仍然无法正常工作。
我的 Express 应用程序的会话配置如下:
import session from 'express-session';
import expressSequelizeSession from 'express-sequelize-session';
const Store = expressSequelizeSession(session.Store);
app.use(session({
cookie: {
path: '/',
httpOnly: true,
secure: env !== 'development', // On environments that have SSL enable this should be set to true.
maxAge: null,
sameSite: false, // Needs to be false otherwise Microsoft auth doesn't work.
},
secret: config.secrets.session,
saveUninitialized: false,
resave: false,
unset: 'destroy',
store: new Store(sqldb.sequelize),
}));
在 FE 上,我将 Vue.js 与 Axios 一起使用并将 withCredentials 设置为 true,以便在 HTTP 请求中传递 cookie。
// Base configuration.
import Axios from 'axios';
Axios.defaults.baseURL = config.apiURL;
Axios.defaults.headers.common.Accept = 'application/json';
Vue.$http = Axios;
// When making request.
Vue.$http[action](url, payload, { withCredentials: true }).then(() => // Handle request);
从图中可以看出,cookie 是在注销请求时发送的。
注销时,我正在访问此端点并破坏会话 as is explained on the documentation。
router.post('/logout', (req, res) => {
try {
req.session.destroy(() => {
return responses.responseWithResultAsync(res); // Helper method that logs and returns status code 200.
});
return responses.handleErrorAsync(res); // Helper method that logs and returns status code 500.
} catch (error) {
return responses.handleErrorAsync(res, error); // Helper method that logs and returns status code 500.
}
});
有趣的是,数据库上的会话已删除,因此我知道 cookie 已根据具有正确会话 ID 的请求正确发送,但由于某种原因并未在浏览器上删除它。注销后我还有这个:
有谁知道我做错了什么?我发现在数据库上成功删除了会话但没有根据请求删除会话很奇怪。
由于@RolandStarke 提到了 express-session 库 doesn't have the built in functionality to remove the cookie from the browser,所以我只是通过以下方式手动完成:
router.post('/logout', (req, res) => {
try {
if (req.session && req.session.cookie) {
res.cookie('connect.sid', null, {
expires: new Date('Thu, 01 Jan 1970 00:00:00 UTC'),
httpOnly: true,
});
req.session.destroy((error) => {
if (error) {
return responses.handleErrorAsync(res, error);
}
return responses.responseWithResultAsync(res);
});
}
return responses.responseWithResultAsync(res);
} catch (error) {
return responses.handleErrorAsync(res, error);
}
});