我有一个使用 HttpOnly cookie 进行身份验证的 NestJs 应用程序。在开发中,一切都完美无缺。我的 NextJs 客户端(http://localhost:4200)使用 Graphql 向我的 NestJs 服务器(http://localhost:3333)发送登录请求,它在响应中设置了 httpOnly cookie,然后客户端成功将 cookie 添加到浏览器存储。
但是,当我将这两个应用程序都部署到 Render.com 时,除了最后一步之外,一切正常。 cookie 在响应中成功接收,但不会添加到浏览器存储中。有趣的是,如果我使用已部署的生产服务器的 GraphQL Playground 发出登录请求,一切正常。因此,很明显,问题似乎是请求来自子域。
我的生产配置:
客户:https://swingapple-web-staging.onrender.com
服务器:https://swingapple-api-staging.onrender.com
Cookie 设置(服务器):
sameSite: process.env.NODE_ENV === 'production' ? 'none' : 'lax',
secure: process.env.NODE_ENV === 'production',
domain: process.env.NODE_ENV === 'production' ? '.onrender.com' : undefined
Nestjs 的 GraphQLModule 设置(服务器):
playground: true,
introspection: true,
autoSchemaFile: true,
sortSchema: true,
context: ({ req, res }) => ({ req, res }),
cors: {
credentials: true,
origin: [process.env.CLIENT_URL, 'http://localhost:4200']
}
相关 Nest main.ts 配置(服务器):
app.set('trust proxy', 1);
graphql-request 设置(客户端):
credentials: 'include'
我已经花了几天的时间试图解决这个问题,所以任何帮助都将不胜感激!
最佳答案
在与 Render.com 支持人员交谈后,他们告诉我 onrender.com
(其子域的域)在公共(public)后缀列表中,这意味着跨站点 cookie 将不起作用。解决方案是为两个 Web 服务添加一个自定义域(显然必须相同,例如 app.my-custom-domain.com 和 api.my-custom-domain.com)。我这样做了,现在一切都按预期工作了!
关于cookies - Render.com : HttpOnly Cookie not being set in browser storage when doing res. Web 服务之间的 cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71889130/