Session 在express.js中为每个请求创建多个会话

Session 在express.js中为每个请求创建多个会话,session,redis,express-session,Session,Redis,Express Session,我在这里描述的问题发生在我本地的开发机器上,在浏览器请求和应用程序之间没有任何代理。 我有几个Node.js微服务,它们共享用于管理会话的相同技术: 最新版本的Express 和用于会话管理 通常的流程是用户在身份验证应用程序中登录,然后被重定向到前端(React应用程序),该应用程序向运行GraphQL服务器的后端微服务执行CORS请求。 此问题与非常相似,即使我的配置略有不同(仅在auth应用程序中使用静态路由,并在会话定义之前使用,false到resave和saveUninitiali

我在这里描述的问题发生在我本地的开发机器上,在浏览器请求和应用程序之间没有任何代理。 我有几个Node.js微服务,它们共享用于管理会话的相同技术:

  • 最新版本的Express
  • 和用于会话管理
通常的流程是用户在身份验证应用程序中登录,然后被重定向到前端(React应用程序),该应用程序向运行GraphQL服务器的后端微服务执行CORS请求。 此问题与非常相似,即使我的配置略有不同(仅在auth应用程序中使用静态路由,并在会话定义之前使用,
false
resave
saveUninitialized
选项)

两个身份验证/后端应用都具有以下配置:

const sessionOptions = {
    store: new RedisStore({
        client: redisClient,
        disableTTL: true,
    }),
    secret: "123",
    resave: false,
    saveUninitialized: false,
    proxy: false,
    rolling: true,
    cookie: {
        domain: config.cookie.domain,
        sameSite: config.cookie.sameSite,
        maxAge: toTime(config.cookie.maxAge).ms(),
        secure: config.cookie.secure,
    },
};
app.use(session(sessionOptions));

// Configure passport middleware
app.use(passport.initialize());
app.use(passport.session());
后端应用程序具有附加的CORS配置:

app.use(cors({
    origin: "frontend_url",
    credentials: true,
    methods: ['GET', 'POST'],
}));
初始Redis状态:

127.0.0.1:6379> KEYS "*"
(empty list or set)
我进入登录页面,创建了一个会话:

127.0.0.1:6379> KEYS "*"
1) "sess:H5VTTBiNSQqu0Fsp2ZfSH2wBZtL4XEZh"
我确实登录了,会话仍然是一个会话,直到我被重定向到我的React应用程序,然后我得到六个新会话:

127.0.0.1:6379> KEYS "*"
1) "sess:NNWse-sp51fVRf6rlnsFpMlZO1gkPgYC"
2) "sess:ofQhH0iBbZOvsJBYMxwHjLL0DKxuFKfS"
3) "sess:XxsTGSoANPE5-fPYbwLmoCgvDho0NTnk"
4) "sess:9wFDQ3_RibJyEXEmJ_8gCxfnak4Uh0yP"
5) "sess:8khC8fgbtO53mJNilMhp88toIcsizxea"
6) "sess:jfQBWogefBr75IgZ5GykSgd5d3t3Mt_D"
7) "sess:H5VTTBiNSQqu0Fsp2ZfSH2wBZtL4XEZh"
无论我点击哪个链接,它们的数量都会增加到16个,以此类推。我无法发现任何发送到后端的请求,该请求没有发送会话cookie,而是发送选项飞行前请求。所以我试着使用,但没有改变。 如果我注销,显然只有匹配我的会话cookie的原始会话从Redis中删除,其余会话(因为我禁用了TTL以拥有“永久”会话)就挂在那里。 很明显,我不希望Redis中充斥着无用的会话,但我找不到真正的问题所在。 有什么建议吗? 谢谢

更新:如果我尝试用定制的东西修改
genid
函数,我注意到一种不同的行为:

  • 对于身份验证服务,如果没有定义
    req.body.username
    ${req.body.username}{uuidv4()}
    ),则返回
    null
  • 对于后端服务,我每次只返回
    null
对身份验证服务的第一个请求引发异常
无效csrf
,因为它可能无法在Redis中找到,因为
genid
现在返回null。第二个请求(假设您使用与以前相同的电子邮件,并且登录成功)将我引导到前端,这次我只看到创建了一个会话。
显然,这不是一个正确的流程,但无论如何,它在Redis中只创建了一个会话,这很奇怪。

几天前我遇到过同样的问题!我已经建立了我的回购协议,并将我的链接共享到了同一个网站!它工作完美!一定要去看看


最后,我发现一些发送到我的身份验证服务的请求没有设置会话cookie,有些路径甚至不应该使用它。 因此,我定义了与会话相关的路径:

const sessionpath=['/path1','/path2',…];
应用程序使用(会话路径、会话(会话选项));
使用(会话路径,passport.initialize());
app.use(sessionpath,passport.session());
使用(sessionpath,csrf());

不确定这是否已完全解决,但根据布局顺序,您可能会在会话处理程序之后使用cors处理程序。当飞行前请求进入会话时,可能正在为每个请求创建会话,因为没有发送会话cookie或凭据。简单的解决方法是将cors处理程序移到会话处理程序的上方。

谢谢,但我看不到与我的用例有什么特别不同的地方,因此我无法理解为什么我仍然会遇到这个问题。请您共享到您的repo的链接,以便我们可以查看您的中间件配置Shi Ritwik,不用担心,最后,我发现一些路由在没有传递cookie的情况下被调用,因此我将它们从会话管理中排除,因为我在那里使用了基于令牌的授权系统。