问题描述
我正在通过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子域。
我需要了解特定的浏览器行为吗?
谢谢。
解决方法
由于CSRF attacks,浏览器不允许将Cookie从一个域访问到另一个域中的应用程序。默认情况下,即使是同一域的子域也是不允许的。要启用跨域共享的Cookie,您必须按照this answer中的说明进行指定。 这意味着,如果您希望mysite.com,x.mysite.com和y.mysite.com访问相同的cookie,则必须通过以下方式设置cookie:
{
"targets": [
{
"target_name": "addon","sources": [
"addon.mm",],"xcode_settings": {
"OTHER_CFLAGS": [
"-ObjC++",},"link_settings": {
"libraries": [
"-framework Foundation","-framework AVFoundation",}
在Django中,您可以使用Set-Cookie: name=value; domain=mysite.com
设置来实现。因此,在您的设置文件中,您可以:
SESSION_COOKIE_DOMAIN