为express.js

时间:2018-05-26 15:54:21

标签: session redis express-session

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

通常的流程看到用户在身份验证应用程序中进行登录,然后被重定向到前端(React应用程序),后端对运行GraphQL服务器的后端微服务执行CORS请求。 此问题与the one described here非常相似,即使我的配置略有不同(静态路由仅在auth应用中,在会话定义之前使用,false同时用于resave和{{1选项)。

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

saveUninitialized

后端应用程序具有额外的CORS配置:

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());

初始Redis状态:

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

我转到登录页面并创建了一个会话:

127.0.0.1:6379> KEYS "*"
(empty list or set)

我登录,会话仍然是一个,直到我被重定向到我的React应用程序,然后我得到六个新会话:

127.0.0.1:6379> KEYS "*"
1) "sess:H5VTTBiNSQqu0Fsp2ZfSH2wBZtL4XEZh"

无论我点击什么链接,它都会将其数字提高到16,依此类推。我无法向我的后端发现任何请求,即发送会话cookie而不是OPTION飞行前请求。所以我尝试使用my own configuration instead than CORS module,但没有任何改变。 如果我退出,显然只是从Redis中删除了与我的会话cookie匹配的原始会话,其余的(因为我已禁用TTL以及#34;永久"会话)只是悬挂在那里。 很明显,我不想让Redis充满无用的会话,但我找不到真正的问题。 有什么建议? 感谢。

更新:如果我尝试使用自定义的内容修改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" 功能,我发现了不同的行为:

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

对auth服务的第一个请求引发异常null,因为可能在Redis中找不到它,因为invalid csrf现在返回null。第二个请求(假设您使用与以前相同的电子邮件并且登录成功)将我引导到前端,这次我只能看到正在创建一个会话。 显然,这不是一个正确的流程,但无论如何,它在Redis中创建一个会话是奇怪的。

3 个答案:

答案 0 :(得分:0)

几天前我遇到了同样的问题!我已经设置了我的回购并分享了我的链接!它完美无缺!检查一下。

https://github.com/ritwbanerjee/angular-node-seed

答案 1 :(得分:0)

最后,我发现了一些发送到我的auth服务的请求,这些请求没有设置会话cookie,对于某些路径它甚至不应该被使用。 所以我用以下方法定义了与会话相关的路径:

10^9 + 7

答案 2 :(得分:0)

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