【问题标题】:How can I override the session ID for a node.js express session (using passport)如何覆盖 node.js 快速会话的会话 ID(使用护照)
【发布时间】:2012-05-28 23:10:43
【问题描述】:

我正在实施一种调用我们内部身份验证服务的护照策略。内部身份验证服务会生成会话 ID,因此我需要确保连接会话使用该 ID 而不是默认生成的 ID。

有没有办法做到这一点?是否可以提供我自己的钩子函数来连接以生成会话 ID?我无法想象它像设置 session.id 或类似的东西那么简单,因为我无法控制 connect 何时或如何实际创建会话。

有人解决了这个问题吗?

【问题讨论】:

    标签: session node.js express connect


    【解决方案1】:

    Connect 的 session 中间件的当前实现无法做到这一点,但您可以分叉 session 中间件并更改 session id 的生成方式,即这一行:

    https://github.com/senchalabs/connect/blob/master/lib/middleware/session.js#L202

    “fork”是指复制上面的文件,更改 sessionID 的分配,并在配置会话中间件时使用新文件。

    更新:

    这是我将如何使用自定义 ID 重新生成会话(注意 - 这只是一个想法,我还没有测试过):

    // this is the function you'll be calling in your routes or whatever
    req.regenerateSession = function(newSid) {
      // keep old session data
      var oldSessionData = req.session;
    
      // destroy current session and make a new one with your custom id
      store.destroy(req.sessionID, function() {
        store.generate(req, newSid);
    
        // copy back the session data
        // since you don't want to lose it probably
        req.session = oldSessionData;
      });
    }
    
    // replace the session store generate function to accept a custom sessionID
    // https://github.com/senchalabs/connect/blob/master/lib/middleware/session.js#L201
    store.generate = function(req, customID) {
      req.sessionID = customID || utils.uid(24);
      req.session = new Session(req);
      req.session.cookie = new Cookie(req, cookie);
    }
    

    【讨论】:

    • 谢谢。除了分叉文件,以下内容也可以吗?
    • 我想你忘了粘贴一些东西.. ?跟随什么?
    • 抱歉 - 输入密钥提交。谢谢你。不过,如果我分叉该文件并更改该行,我不清楚如何获得自定义 ID。在使用登录凭据调用身份验证服务后,我只会拥有自定义 ID,并且我相信会在创建会话之后发生。您能否详细说明该解决方案将如何工作?我的想法是替换护照策略中的 req.session.save ,它提供关闭时的会话 ID。即 req.session.save = function(fn){ this.req.sessionStore.set(authServiceId, this, fn || function(){});返回这个; }
    • 该技巧的另一半是将 req.sessionID 设置为自定义会话 ID,因此创建的 cookie 的值与会话存储保存它的值相同。这两个覆盖步骤只会在登录调用期间发生 - 之后浏览器将提交覆盖的会话 ID,该 ID 将存在于会话存储中。但是,我不知道 connect 的内部工作原理 - 您认为这种方法(尽管是一种 hack)可行吗?
    • 我发布了关于我将如何做的答案的更新,希望对您有所帮助(实际上还没有尝试过)
    猜你喜欢
    • 1970-01-01
    • 2016-10-27
    • 2019-07-09
    • 2018-05-11
    • 2012-09-27
    • 2014-06-04
    • 2020-05-07
    • 1970-01-01
    • 2023-01-21
    相关资源
    最近更新 更多