Session 如何覆盖node.js express会话的会话ID(使用passport)

Session 如何覆盖node.js express会话的会话ID(使用passport),session,node.js,express,connect,Session,Node.js,Express,Connect,我正在实施一个passport策略,调用我们的内部身份验证服务。内部身份验证服务生成会话ID,因此我需要确保连接会话使用该ID而不是默认生成的ID 有办法做到这一点吗?是否可以提供我自己的钩子函数来连接以生成会话id?我无法想象它会像设置session.id这样简单,因为我无法控制connect实际创建会话的时间或方式 有人解决了这个问题吗?这不能用当前的Connect会话中间件实现,但您可以使用会话中间件并更改会话id的生成方式,即此行: “fork”指的是复制上面的文件,更改session

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

有办法做到这一点吗?是否可以提供我自己的钩子函数来连接以生成会话id?我无法想象它会像设置session.id这样简单,因为我无法控制connect实际创建会话的时间或方式


有人解决了这个问题吗?

这不能用当前的Connect会话中间件实现,但您可以使用会话中间件并更改会话id的生成方式,即此行:

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

更新:

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


非常感谢。除了分叉文件,下面的工作也可以吗?我想你忘了粘贴一些东西了?下面是什么?抱歉-输入密钥提交。非常感谢。不过,我不清楚如果我将该文件分叉并更改了该行,如何获得自定义ID。只有在使用登录凭据调用auth服务之后,我才会有自定义ID,我相信这会在创建会话之后发生。你能详细说明一下这个解决方案是如何工作的吗?我的想法是在passport策略中替换req.session.save,它从闭包中提供会话id。i、 e.req.session.save=function(fn){this.req.sessionStore.set(authServiceId,this,fn | | function(){});返回this;}该方法的另一半是将req.sessionID设置为自定义会话Id,因此创建的cookie的值与会话存储保存它的值相同。这两个覆盖步骤仅在登录调用期间发生-之后浏览器将提交覆盖的会话ID,该ID将存在于会话存储中。然而,我不知道connect的内部工作原理——你认为这种方法,尽管是一种黑客手段,会起作用吗?我在我的答案上发布了一个更新,介绍了我将如何做到这一点,希望能有所帮助(实际上还没有尝试过)
// 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);
}