从 Django 3.0 开始,添加了 SECURE_REFERRER_POLICY 并包含在python manage.py check --deploy
命令中。为了让我的 Django 项目从 Amazon S3 读取媒体文件,我之前将我的设置strict-origin-when-cross-origin
为域(类似于这个问题Amazon S3 Bucket Policy Referer中描述的内容)。
但这是一个非常基本的热链接保护,我在 Django 论坛上被建议切换到same-origin
.
但是,现在我的网站无法再获取其任何资产文件(403 错误),并且django-storages
到目前为止,浏览和搜索答案的 S3 文档已被证明是艰难且毫无结果的。:(
这是我目前拥有的:
在 Django 方面,我django-storages
配置了:
AWS_DEFAULT_ACL = 'authenticated-read'
SECURE_REFERRER_POLICY = 'same-origin'
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
在 AWS 上,我有以下策略(引用者的访问策略已被删除):
{
"Statement": [
{
"Sid": "Allow programatic admin to handle bucket",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::xxxxxxxxxxxxxx:user/bucket-manager"
},
"Action": "s3:*",
"Resource": "arn:aws:s3:::bucket-name/*"
}
]
}
以下 CORS:
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedHeader>Authorization</AllowedHeader>
</CORSRule>
</CORSConfiguration>
并且程序化用户具有以下策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::bucket-name",
"arn:aws:s3:::bucket-name/*"
]
}
]
}
我感觉我缺少的是将bucket-manager
用户添加到存储桶的 ACL 中,但是 UI 要求提供规范 ID,而我终其一生都找不到它。