我正在实施一种调用我们内部身份验证服务的护照策略。内部身份验证服务生成会话 ID,因此我需要确保连接会话使用该 ID 而不是默认生成的 ID。
有没有办法做到这一点?是否可以提供我自己的钩子函数来连接以生成会话 ID?我无法想象它像设置 session.id 或类似的东西那么简单,因为我无法控制 connect 何时或如何实际创建会话。
有没有人解决过这个问题?
Connect 的会话中间件的当前实现无法做到这一点,但您可以分叉会话中间件并更改会话 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);
}