Render.com:在 Web 服务之间执行 res.cookie 时,浏览器存储中未设置 HttpOnly Cookie

Wil*_*ard 3 cookies httponly cross-domain nestjs samesite

我有一个 NestJs 应用程序,它使用 HttpOnly cookie 进行身份验证。在开发过程中一切都很完美。我的 NextJs 客户端 (http://localhost:4200) 使用 Graphql 向我的 NestJs 服务器 (http://localhost:3333) 发送登录请求,该服务器在响应中设置 httpOnly cookie,然后客户端成功将 cookie 添加到浏览器存储。

但是,当我将这两个应用程序部署到 Render.com 时,除了最后一步之外,一切都正常。响应中已成功接收 cookie,但未将其添加到浏览器存储中。有趣的是,如果我使用已部署生产服务器的 GraphQL 游乐场来发出登录请求,则一切正常。因此,显然,问题似乎是请求来自子域。

我的生产配置:

客户端: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
Run Code Online (Sandbox Code Playgroud)

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']
}
Run Code Online (Sandbox Code Playgroud)

相关 Nest main.ts 配置(服务器):

app.set('trust proxy', 1);
Run Code Online (Sandbox Code Playgroud)

graphql-请求设置(客户端):

credentials: 'include'
Run Code Online (Sandbox Code Playgroud)

我花了几天时间试图解决这个问题,所以任何帮助将非常感激!

Wil*_*ard 12

与 Render.com 支持人员交谈后,他们告诉我onrender.com(其子域的域)位于公共后缀列表中,这意味着跨站点 cookie 不起作用。解决方案是为两个 Web 服务添加自定义域(显然必须相同,例如 app.my-custom-domain.com 和 api.my-custom-domain.com)。我这样做了,现在一切都按预期进行了!

  • 不用担心梨,很乐意提供帮助! (2认同)