Адаптер Keycloak node.js не делает недействительным файл cookie сеанса connect.sid при выходе из системы

Адаптер 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 });

Однако после входа / выхода пользователя из потока, 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 или конфигурация экспресс-сеанса лучше достичь цели?

1 ответ

Ваше мнение правильное, я не уверен, что переопределяю Keycloak unstore метод - лучший способ сделать это (может испортить ситуацию, если вы обновите Keycloak или если вы захотите использовать unstoreGrant чтобы удалить только грант, но оставить остальную часть сеанса).

Лучшим подходом было бы создание нового промежуточного программного обеспечения, которое запускается на вашем пути выхода:

app.use('/logout', (req, res, next) => {
  req.session.destroy();
  res.clearCookie('connect.sid', { path: '/' });
  res.redirect(keycloak.logoutUrl()); // optional
});
Другие вопросы по тегам