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

时间:2020-02-20 18:34:41

标签: node.js keycloak express-session keycloak-nodejs-connect keycloak-connect

Node.js keycloak-nodejs-connect适配器(版本4.3)在应用程序网关中用于根据docs保护微服务的端点:

var session = require('express-session');
var Keycloak = require('keycloak-connect');

var memoryStore = new session.MemoryStore();
var keycloak = new Keycloak({ store: memoryStore });

但是,在用户登录/注销流程之后,源自cookieconnect.sid express-session仍存储在浏览器中。如果其他用户随后通过相同的浏览器登录,则会导致意外的问题。

如何正确清除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;
        }
    };

某些keycloak适配器或express-session配置是否更好地实现了目标?

1 个答案:

答案 0 :(得分:0)

您的想法是正确的,但是我不确定重写Keycloak的unstore方法是最好的方法(如果升级Keycloak或要使用{{1} }删除授权,但保留会话的其余部分。

更好的方法是创建一个新的中间件,该中间件会在您的登出路径上触发:

unstoreGrant