根据docs,在应用程序网关中使用Node.js keycloak-nodejs-connect适配器(版本4.3)来保护微服务的端点
var session = require('express-session');
var Keycloak = require('keycloak-connect');
var memoryStore = new session.MemoryStore();
var keycloak = new Keycloak({ store: memoryStore });然而,在用户登录/注销流程之后,源自express-session的connect.sid cookie仍然存储在浏览器内部。如果之后另一个用户通过相同的浏览器登录,则会导致意外问题。
如何正确清除connect.sid快速会话cookie?
通过将response.clearCookie('connect.sid', { path: '/' });添加到unstore函数来覆盖adapter's session store code是有帮助的。然而,它似乎太复杂了:
var SessionStore = require('keycloak-connect/stores/session-store');
let store = (grant) => {
return (request, response) => {
request.session[SessionStore.TOKEN_KEY] = grant.__raw;
};
};
let unstore = (request, response) => {
delete request.session[SessionStore.TOKEN_KEY];
response.clearCookie('connect.sid', { path: '/' });
};
SessionStore.prototype.wrap = (grant) => {
if (grant) {
grant.store = store(grant);
grant.unstore = unstore;
}
};某些密钥罩适配器或快速会话配置是否能更好地实现此目标?
发布于 2020-05-24 20:34:52
你的想法是正确的,我不确定重写Keycloak的unstore方法是最好的方法(如果你升级Keycloak,或者如果你想使用unstoreGrant只删除授权,但保留会话的其余部分,可能会把事情搞砸)。
一种更好的方法是创建一个在注销路由上触发的新中间件:
app.use('/logout', (req, res, next) => {
req.session.destroy();
res.clearCookie('connect.sid', { path: '/' });
res.redirect(keycloak.logoutUrl()); // optional
});https://stackoverflow.com/questions/60326521
复制相似问题