python - Flask-Session cookie 适用于 IP 地址和域的其他浏览器,但对于 chrome,它仅适用于 IP 地址
问题描述
我发现了一个同样问题的问题,除了它已经 7 岁了,而且他们有相反的问题,chrome 为他们的域工作,但不是 IP。我需要这个应用程序在域上工作,而不是在 ip 上工作,这很不幸。如果我有一些像这样的基本代码:Flask:
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 时,输出为
'那里'
对彼此而言
但是,在 chrome 上,对于 ip,输出是
'那里'
但是,对于域,输出是
关键错误
编辑:更多信息:这是在 AWS ec2 ubuntu 服务器上,该服务器在前端的 80 端口和后端的 5000 端口上运行。我使用 AWS Route 53 将 IP 地址连接到域名......以防万一。要访问前端,可以去ip或域名,而要访问后端,必须去ip:5000
需要更多信息吗?
这是可以修复的吗?谢谢!
解决方案
我认为问题在于谷歌浏览器如何管理 cookie。这是“ SameSite ”属性。早在 2020 年 7 月 14 日,Google 就开始逐步推出新的浏览器政策,并进行了一些重大更改。如果未指定SameSite属性,则默认将 cookie 视为SameSite=Lax的一种。另一个弃用并删除了使用带有SameSite=None属性但不包含 Secure 属性的 cookie。这意味着任何请求SameSite=None但未标记为 Secure 的 cookie 现在都被拒绝。这意味着前端无法联系到后端,并且站点无法正常工作。要修复它,您只需要确保当您的_SESSION_ID创建的 cookie 包含SameSite=None和Secure属性。
PS1:基于Caleb的文章。后端是Ruby on Rails,但我认为这不是问题。PS2:在更改任何内容之前,请尝试其他基于 chrome 的浏览器,例如Vivaldi、Comodo甚至新的Microsoft Edge。
推荐阅读
- c++ - 尝试制作一个简单的 c++ shell
- swiftui - 如何检测溢出屏幕的视图?
- android - 从 uri 创建路径 - 错误 - MultipartUploadRequest- 在 addFileToUpload(path, "image") 中引发异常
- ruby-on-rails - 使用 RubyXL 将 XLSX 电子表格解析为键值对
- reactjs - Typescript React Native Element 必须是字符串错误
- hibernate - JPA 在查询命名参数问题
- java - 如何从控制台运行 FIJI 宏?显然需要的 ij.jar 文件在最近的安装中不存在
- angular - 测试组件时出现 ng 测试问题
- spring-boot - Spring Jpa 规范,多对多,按语言和值过滤
- python - 如何在pygame中自由变换图像?