Flask-Session cookie 适用于其他浏览器的 ip 地址和域,但对于 chrome 它仅适用于 ip 地址
Flask-Session cookie works on other browsers for ip address & domain, but for chrome it only works on ip address
我发现了一个有同样问题的问题,除了它已经 7 年了,他们有相反的问题,其中 chrome 适用于他们的域,但不适用于 IP。我需要这个应用程序在域上工作,而不是 ip,这很不幸。
如果我有一些像这样的基本代码:
烧瓶:
app = Flask(__name__)
from dotenv import load_dotenv
load_dotenv()
SECRET_KEY = os.getenv('FLASK_APP_SECRET_KEY')
SESSION_TYPE = 'filesystem'
app.config.from_object(__name__)
Session(app)
CORS(app)
@app.route('/give', methods = ['GET'])
@cross_origin(supports_credentials=True)
def user_make(id):
session['Hi'] = 'There'
return 'ye'
@app.route('/take', methods = ['GET'])
@cross_origin(supports_credentials=True)
def user_load(id):
return session['Hi']
反应:
let data = new FormData()
return axios
.get('12.34.56.78' + '/give', data, {
headers: {
"Content-Type": "multipart/form-data",
},
}).then(
return axios
.take('12.34.56.78' + '/take', data, {
headers: {
"Content-Type": "multipart/form-data",
},
}))
在 ip='12.34.56.78' 和域 'example.com' 的服务器上:
在 safari 上使用域或 ip 时,输出为
'there'
两者都
然而,在 chrome,
对于 ip,输出是
'there'
然而,对于域,输出是
Key Error
编辑:
更多信息:
这是在 AWS ec2 ubuntu 服务器上,前端端口 80 和后端端口 5000 上的 运行。我使用 AWS Route 53 将 IP 地址连接到域名...以防万一。访问前端可以到ip或者domain,访问后端必须到ip:5000
需要更多信息吗?
这个可以修复吗?
谢谢!
我认为问题在于 google chrome 如何管理 cookie。这是“SameSite”属性。早在 2020 年 7 月 14 日,Google 开始逐步推出一项新的浏览器政策,并进行了一些重大更改。如果未指定 SameSite=Lax,则默认将 cookie 视为 SameSite=Lax 属性。另一个弃用并删除了使用 SameSite=None 属性的 cookie,该属性不包含 Secure 属性。这意味着任何请求 SameSite=None 但未标记为安全的 cookie 现在将被拒绝。这意味着前端无法联系后端并且站点无法正常工作。要修复它,您只需要确保在创建 _SESSION_ID cookie 时它包含 SameSite=None 和 安全 属性。
P.S.1:基于article of Caleb。后端是 Rails 上的 Ruby,但我认为这不是问题。
P.S.2:在更改任何内容之前,请尝试其他基于 chrome 的浏览器,例如 Vivaldi、Comodo 甚至是新的Microsoft Edge.
我发现了一个有同样问题的问题,除了它已经 7 年了,他们有相反的问题,其中 chrome 适用于他们的域,但不适用于 IP。我需要这个应用程序在域上工作,而不是 ip,这很不幸。 如果我有一些像这样的基本代码: 烧瓶:
app = Flask(__name__)
from dotenv import load_dotenv
load_dotenv()
SECRET_KEY = os.getenv('FLASK_APP_SECRET_KEY')
SESSION_TYPE = 'filesystem'
app.config.from_object(__name__)
Session(app)
CORS(app)
@app.route('/give', methods = ['GET'])
@cross_origin(supports_credentials=True)
def user_make(id):
session['Hi'] = 'There'
return 'ye'
@app.route('/take', methods = ['GET'])
@cross_origin(supports_credentials=True)
def user_load(id):
return session['Hi']
反应:
let data = new FormData()
return axios
.get('12.34.56.78' + '/give', data, {
headers: {
"Content-Type": "multipart/form-data",
},
}).then(
return axios
.take('12.34.56.78' + '/take', data, {
headers: {
"Content-Type": "multipart/form-data",
},
}))
在 ip='12.34.56.78' 和域 'example.com' 的服务器上: 在 safari 上使用域或 ip 时,输出为
'there'
两者都
然而,在 chrome, 对于 ip,输出是
'there'
然而,对于域,输出是
Key Error
编辑: 更多信息: 这是在 AWS ec2 ubuntu 服务器上,前端端口 80 和后端端口 5000 上的 运行。我使用 AWS Route 53 将 IP 地址连接到域名...以防万一。访问前端可以到ip或者domain,访问后端必须到ip:5000
需要更多信息吗?
这个可以修复吗? 谢谢!
我认为问题在于 google chrome 如何管理 cookie。这是“SameSite”属性。早在 2020 年 7 月 14 日,Google 开始逐步推出一项新的浏览器政策,并进行了一些重大更改。如果未指定 SameSite=Lax,则默认将 cookie 视为 SameSite=Lax 属性。另一个弃用并删除了使用 SameSite=None 属性的 cookie,该属性不包含 Secure 属性。这意味着任何请求 SameSite=None 但未标记为安全的 cookie 现在将被拒绝。这意味着前端无法联系后端并且站点无法正常工作。要修复它,您只需要确保在创建 _SESSION_ID cookie 时它包含 SameSite=None 和 安全 属性。
P.S.1:基于article of Caleb。后端是 Rails 上的 Ruby,但我认为这不是问题。 P.S.2:在更改任何内容之前,请尝试其他基于 chrome 的浏览器,例如 Vivaldi、Comodo 甚至是新的Microsoft Edge.