redis 为express.js中的每个请求创建多个会话

ldioqlga  于 2023-01-29  发布在  Redis
关注(0)|答案(4)|浏览(362)

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

通常的流程是用户在身份验证应用程序中登录,然后被重定向到前端(React应用程序),该应用程序向运行GraphQL服务器的后端微服务执行CORS请求。此问题与the one described here非常相似,即使我的配置稍有不同(静态路由仅在身份验证应用程序中使用,并在会话定义和false之前使用到resavesaveUninitialized选项)。
两个身份验证/后端应用程序都具有此配置:

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,而是发送OPTION预检请求。所以我尝试使用my own configuration instead than CORS module,但没有任何变化。如果我退出,显然只有与我的会话cookie匹配的原始会话会从Redis中删除。剩下的(因为我已经禁用了TTL来拥有“永久”会话)就挂在那里了。同样明显的是,我不希望Redis充满无用的会话,但我找不到真实的的问题是什么。有什么建议吗?谢谢。

UPDATE:我注意到如果我尝试使用自定义的内容修改genid函数,会出现不同的行为:

  • 对于身份验证服务,如果没有定义req.body.username${req.body.username}_${uuidv4()}),则返回null
  • 对于后端服务,我每次只返回null

对auth服务的第一个请求引发了异常invalid csrf,因为genid现在返回null,可能在Redis中找不到它。(假设你使用的邮箱和之前一样,并且登录成功),把我带到前台,这次我只能看到一个会话正在创建,显然这不是一个正确的流程,但奇怪的是它在Redis中只创建了一个会话。

guicsvcw

guicsvcw1#

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

iqjalb3h

iqjalb3h2#

几天前我遇到了同样的问题!我已经设置了我的回购协议并分享了我的链接!它工作得很完美!一定要看看。
https://github.com/ritwbanerjee/angular-node-seed

wpx232ag

wpx232ag3#

最后,我发现一些发送到我的auth服务的请求没有设置会话cookie,对于一些路径,它甚至不应该被使用。

const sessionPaths = ['/path1', '/path2', ...];
app.use(sessionPaths, session(sessionOptions));
app.use(sessionPaths, passport.initialize());
app.use(sessionPaths, passport.session());
app.use(sessionPaths, csrf());
2admgd59

2admgd594#

saveUninitialized设置为false对我起作用了!

var app = express()

app.use(session({
  secret: 'keyboard cat',
  resave: false,
  saveUninitialized: false,
  ...
}));

express-session middleware

相关问题