【问题标题】:Javascript Cross Domain Cookie Websocket not being sent未发送 Javascript 跨域 Cookie Websocket
【发布时间】:2020-12-20 20:36:57
【问题描述】:

我正在通过document.cookie = 'foo=bar;secure;path=/;' 设置一个cookie,并且我正在连接到一个WebSocket。我尝试了 samesite=None 和许多其他变体,但都没有成功,所以我有点卡住了。我想使用这个 cookie 进行身份验证(它实际上是一个 jwt 和一个特定的 api 密钥成对)。

流程是:

  • 打开前端应用
  • 登录,取回 jwt
  • 将 JWT 和特殊 API 密钥存储在令牌中
  • 发出 websocket 请求
  • 如果使用 cookie 制作 - 一切正常

当前端应用程序和后端应用程序都在本地主机上时,这在本地工作。

在部署两个应用程序时,前端应用程序不会神奇地发送 cookie。它们都托管在 heroku 上,并分别指向子域 x.mysite.com 和 y.mysite.com。

是否有我需要注意的特定浏览器行为?

提前致谢。

【问题讨论】:

  • 如果你还没有启用跨站请求,你需要在 Django 中启用pypi.org/project/django-cors-headers
  • 我之前已经启用它并使用星号作为规则,但没有运气:(@Ken4scholars
  • @BorkoKovacev 我不相信星号有效。我认为您实际上需要列出 x.mysite.com 和 y.mysite.com

标签: google-chrome firefox cookies svelte django-channels


【解决方案1】:

由于CSRF attacks,浏览器不允许从一个域访问 cookie 到另一个域上的应用程序。默认情况下,即使是同一域的子域也是不允许的。要启用跨域共享的 cookie,您必须按照this answer 中的说明指定它。 这意味着如果您希望 mysite.com、x.mysite.com、y.mysite.com 访问相同的 cookie,则必须以这种方式设置 cookie:

Set-Cookie: name=value; domain=mysite.com

在 Django 中,您可以使用 SESSION_COOKIE_DOMAIN 设置来实现此目的。所以在你的设置文件中,你可以有:

SESSION_COOKIE_DOMAIN = os.environ.get('SESSION_COOKIE_DOMAIN', 'mysite.com')

【讨论】:

  • 谢谢 - 就是这样!
  • 太棒了。如果答案令人满意,别忘了奖励赏金
猜你喜欢
  • 1970-01-01
  • 2012-08-29
  • 2021-03-05
  • 2013-01-05
  • 1970-01-01
  • 1970-01-01
  • 2012-06-09
  • 2019-02-11
  • 1970-01-01
相关资源
最近更新 更多