Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么chrome在错误的子域上设置cookie?_Python_Google Chrome_Nginx_Cookies_Flask - Fatal编程技术网

Python 为什么chrome在错误的子域上设置cookie?

Python 为什么chrome在错误的子域上设置cookie?,python,google-chrome,nginx,cookies,flask,Python,Google Chrome,Nginx,Cookies,Flask,我有以下子域: api.example.com app1.example.com app2.example.com 我使用nginx作为web服务器来服务所有这些api.example.com是我正在开发的python flask应用程序app1.example.com和app2.example.com是静态js内容,不是我开发的 Nginx配置为允许跨源资源共享: if ($request_method = 'OPTIONS') { add_header 'A

我有以下子域:

api.example.com
app1.example.com
app2.example.com
我使用nginx作为web服务器来服务所有这些
api.example.com
是我正在开发的python flask应用程序
app1.example.com
app2.example.com
是静态js内容,不是我开发的

Nginx配置为允许跨源资源共享:

    if ($request_method = 'OPTIONS') {
            add_header 'Access-Control-Allow-Origin' $http_origin always;
            add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
            add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization' always;
            add_header 'Access-Control-Allow-Credentials' 'true' always;
            add_header 'Access-Control-Max-Age' 1728000 always;
            add_header 'Content-Type' 'text/plain; charset=utf-8' always;
            add_header 'Content-Length' 0 always;
            return 204;
    }
    if ($request_method = 'POST') {
            add_header 'Access-Control-Allow-Origin' $http_origin always;
            add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
            add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization' always;
            add_header 'Access-Control-Allow-Credentials' 'true' always;
            add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range' always;
    }
    if ($request_method = 'GET') {
            add_header 'Access-Control-Allow-Origin' $http_origin always;
            add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
            add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization' always;
            add_header 'Access-Control-Allow-Credentials' 'true' always;
            add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range' always;
    }
位置
块上着陆,该块将控制权传递给uwsgi套接字。为
api1
api2
粘贴的副本也是如此

app1
app2
正在向
api
发出请求,
api
在响应其中一些请求时设置cookie

Cookie的设置如下:

response.set_cookie(
        key='some_cookie_name',
        value=some_token,
        max_age=current_app.config["JWT_EXP"],
        secure=True,
        httponly=True)
路径
默认设置为
“/”

属性在响应中不存在,
samesite
属性也不存在,
以上都是根据

如果我错了,请纠正我,但根据我的理解,当
app1
请求
api
资源(设置cookie)时,此cookie绑定到
app1.example.com
,并且不应出现在
app2.example.com
上(反之亦然)

我在铬上观察到的行为是不同的

app1
request上设置cookie,然后在
app2
request上设置cookie(同名),将覆盖
app1
上的cookie
app2
子域没有cookie(使用chrome开发者工具检查)

现在,当我更改第二个子域(
app2
)的cookie名称时,
app2
上仍然不会出现cookie,但是,具有不同名称的第二个cookie现在在
app1
子域上可见

看起来无论我做什么,所有cookie都设置在
app1
子域上。检查
example.com
时也会出现这些cookie

此外,当
app2.example.com
api
发出请求时,它会发回
app1
上可见的所有cookie

这种行为正确吗?这是因为服务器端启用了CORS吗?如何区分
app1
app2
之间的cookie


编辑:添加了cors配置代码

设置cookie头中的cookie域需要与请求它的主机匹配。CORS和cookie头都是必需的。如果未在设置的Cookie上设置域,浏览器将采用请求主机的FQDN。如果确实设置了域,则可以使用domain=example.com或类似工具在同一域上的站点之间共享cookie

在FQDN主机和主机所在的域上设置相同的cookie名称是可能的,尽管这会让人感到困惑。一个将被发送到该域中的其他主机,两个都将被发送到对同一FQDN的后续调用


我希望您希望cookie位于域上,而不是FQDN上。您应该能够重写apt、app1和app2返回的Set Cookie头,以便它们位于域上。如果可能的话,最好在应用程序本身上修复cookies。

你能给我看看你的CORS实现吗?在我看来,您已经遇到了CORS问题。我已经在问题中添加了nginx CORS配置。您可以向我展示以下响应标题:
curl-X OPTIONS'api.example.com'-H“Origin:app1.example.com”-H“访问控制请求方法:GET”-Iv-o/dev/null
,看起来您的CORS实现很好。下面是一个输出。Ofc我已请求适当的资源作为适当的来源,在发布时将其更改为
app1
:在中,我的建议您的应用程序中有一些错误,因为您的CORS实现是正确的(但不安全)。您收到了上述请求的有效标题。唉,如果我可以发表评论而不是回答,我会的。但一个人在获得评论权之前有权回答。