【问题标题】:Cookies are set into different domain (Node.js, Angular)Cookie 被设置到不同的域(Node.js、Angular)
【发布时间】:2020-03-27 04:54:40
【问题描述】:

我正在使用 Angular 和 Node.js (Express) 开发网络应用程序,但我的 cookie 有问题 - 它们被设置到我的后端域而不是我的前端。

当我将POST request 设置为/auth endpoint 时,服务器将返回 HttpOnly cookie - 一个是 JWT,第二个是刷新令牌。当我在 chrome 中检查网络选项卡时,我可以看到服务器发回了这些 cookie,但是当我检查 Application > Storage > Cookies 时,这里什么都没有。

我发现,cookie 是在我的后端域中设置的。 (app-backend.com 而不是 app.com) 它们只是与我的后端域相关联。

奇怪的是,我的应用程序在我的计算机上运行良好,但是当我切换到我的手机时,cookie 不会从那里发送(我使用的是带有 Safari 或 Chrome 的 iPhone)。此外,当我在 localhost 开发服务器上运行我的应用程序时,一切正常。

我尝试将 cookie 配置中的域设置为我的前端域,它根本不起作用。

另外,Chrome 会用这条消息警告我,我不知道这是否与我的问题有关

在“我的域”中设置了与跨站点资源关联的 cookie,但未设置 SameSite 属性。未来版本的 Chrome 将仅通过设置为 SameSite=NoneSecure 的跨站点请求传递 cookie。您可以在开发人员工具中的 Application>Storage>Cookies 下查看 cookie,并在 https://www.chromestatus.com/feature/5088147346030592https://www.chromestatus.com/feature/5633521622188032 查看更多详细信息。

这是我在 github 上的代码:

前端:https://github.com/TenPetr/dashboard

后台:https://github.com/TenPetr/dashboard_backend

感谢您的建议。

【问题讨论】:

  • 您不能为任意域设置cookies。如果您的 POST 请求发送到 app-backend.com,那么服务器只能在响应中为该请求设置一个 cookie - 而不是为 app.com
  • 啊……明白了。你知道这在计算机上是如何工作的吗?或者您有什么想法,如何在 app.com 域上设置这些 cookie?
  • 顺便说一句。我在前端和后端都使用 Heroku

标签: javascript node.js express cookies


【解决方案1】:

您在production.json 中设置了SameSite=None; Secure 属性,这是正确的。但是,根据您的 iOS / Safari 版本,您可能会点击 an incompatibility issue,其中 cookie 被错误地视为 SameSite=Strict

在您的开发设置中,您既是:不设置 SameSite=None; Secure,并且可能使用的 URL 无论如何都算作同一个站点,例如在 localhost 上提供服务可能会导致一些奇怪的 cookie 行为。

我会尝试在没有 SameSite=None 属性的情况下测试您的生产配置。如果这随后开始在 Safari 上运行,那么您遇到了该错误。您可以通过设置两个版本的 cookie 或添加用户代理嗅探来缓解这种情况。更多详情https://web.dev/samesite-cookie-recipes

或者,如果您在后端服务器不是用户实际访问的站点时尝试从后端服务器设置 cookie,您可能会点击 Safari cookie policy issues

【讨论】:

  • 您好,感谢您的回答。我认为我正在打最后一个,因为正如我所说,一切都可以在 Android 和 PC 上运行,但只能在 iPhone 上运行,我遇到了这些麻烦。奇怪的部分是它在一瞬间开始工作,但只在 Safari 上工作 - Chrome 没有工作。当我的前端和后端位于不同的域时,您是否有任何建议、链接或如何正确设置这些 cookie? (但仍然都在heroku上)。我没有找到任何东西,非常感谢!
  • 基本上,如果我理解得很好.. 我不能将 cookie 从 backend.app-heroku.com 设置到 frontend.app-heroku.com,对吧?
  • 可能会寻找使前端和后端之间的请求不跨站点的方法,例如在a.example.comb.example.com 上托管。或者可能托管来自后端项目的前端代码?
  • 我会看看是否有办法在一个域上的 Heroku 上托管多个应用程序。然后,它应该工作......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-21
  • 2023-03-25
  • 2011-01-08
  • 2020-03-04
  • 2021-08-15
  • 2021-07-27
  • 2015-02-07
相关资源
最近更新 更多