Node.js 钥匙扣-nodejs-连接 适配器(4.3版本)用于应用网关中,以保护微服务的端点。文件:
var session = require('express-session');
var Keycloak = require('keycloak-connect');
var memoryStore = new session.MemoryStore();
var keycloak = new Keycloak({ store: memoryStore });
但是,在用户登录后会出现注销流。connect.sid
饼干 源于 快捷键 仍存储在浏览器内。如果之后有其他用户通过同一浏览器登录,会造成意想不到的问题。
如何清除 connect.sid
正确地表达会话cookie?
覆盖 适配器的会话存储代码 加上 response.clearCookie('connect.sid', { path: '/' });
到 unstore
功能有帮助。但是,这似乎太复杂了。
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;
}
};
是否可以通过一些keycloak适配器或者express-session配置来达到更好的目的?
你的想法是正确的,我不确定覆盖Keycloak的 unstore
方法是最好的方法(如果你升级了Keycloak,或者你想使用 unstoreGrant
来删除授予,但保留会话的其余部分)。)
一个更好的方法是创建一个新的中间件,在你的注销路径上触发。
app.use('/logout', (req, res, next) => {
req.session.destroy();
res.clearCookie('connect.sid', { path: '/' });
res.redirect(keycloak.logoutUrl()); // optional
});