cookies - Render.com : HttpOnly Cookie not being set in browser storage when doing res. Web 服务之间的 cookie

标签 cookies nestjs cross-domain samesite httponly

我有一个使用 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/

相关文章:

node.js - 在passport js反序列化中,将 session 数据存储在浏览器cookie中

nestjs - nestjs 是如何获取请求中的 cookie 的?

javascript - 检测哪个 iframe 发送邮件

javascript - 为什么没有更多的 oEmbed 提供商在其端点上启用跨域资源共享?

java - 从 Java servlet 获取 SAPUI5 中的 session 数据

java - Android 使用 cookie 保持登录状态以获取 json 数据

javascript - 使用 Node.js 代理 POST 并修改 header

node.js - 引导微服务时获取 ConfigService 的正确方法

node.js - 队列和api的嵌套公牛独立进程

javascript - 跨域 XMLHttpRequest,Access-Control-Allow-Origin header 和 $_SERVER ['HTTP_ORIGIN' ]