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