Keycloak node.js适配器在注销时不会使connect.sid会话cookie无效。

问题描述 投票:0回答:1

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配置来达到更好的目的?

node.js keycloak express-session keycloak-nodejs-connect keycloak-connect
1个回答
0
投票

你的想法是正确的,我不确定覆盖Keycloak的 unstore 方法是最好的方法(如果你升级了Keycloak,或者你想使用 unstoreGrant 来删除授予,但保留会话的其余部分)。)

一个更好的方法是创建一个新的中间件,在你的注销路径上触发。

app.use('/logout', (req, res, next) => {
  req.session.destroy();
  res.clearCookie('connect.sid', { path: '/' });
  res.redirect(keycloak.logoutUrl()); // optional
});
© www.soinside.com 2019 - 2024. All rights reserved.