首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >密钥罩node.js适配器不会在注销时使connect.sid会话cookie无效

密钥罩node.js适配器不会在注销时使connect.sid会话cookie无效
EN

Stack Overflow用户
提问于 2020-02-21 02:34:41
回答 1查看 771关注 0票数 1

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

代码语言:javascript
复制
var session = require('express-session');
var Keycloak = require('keycloak-connect');

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

然而,在用户登录/注销流程之后,源自express-sessionconnect.sid cookie仍然存储在浏览器内部。如果之后另一个用户通过相同的浏览器登录,则会导致意外问题。

如何正确清除connect.sid快速会话cookie?

通过将response.clearCookie('connect.sid', { path: '/' });添加到unstore函数来覆盖adapter's session store code是有帮助的。然而,它似乎太复杂了:

代码语言:javascript
复制
    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;
        }
    };

某些密钥罩适配器或快速会话配置是否能更好地实现此目标?

EN

回答 1

Stack Overflow用户

发布于 2020-05-24 20:34:52

你的想法是正确的,我不确定重写Keycloak的unstore方法是最好的方法(如果你升级Keycloak,或者如果你想使用unstoreGrant只删除授权,但保留会话的其余部分,可能会把事情搞砸)。

一种更好的方法是创建一个在注销路由上触发的新中间件:

代码语言:javascript
复制
app.use('/logout', (req, res, next) => {
  req.session.destroy();
  res.clearCookie('connect.sid', { path: '/' });
  res.redirect(keycloak.logoutUrl()); // optional
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60326521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档