我将带有boto3的预签名URL用于“保护”(或至少限制对S3中存储的内容的访问)(我将相对路径传递给Django视图,然后生成一个绝对的预签名URL到存储位置在S3上,然后将其作为重定向传递给客户端,客户端随后将检索所需的文件):
import boto3
class ContentStreamView(LoginRequiredMixin, RedirectView):
def get_redirect_url(self, **kwargs):
... relevant code below
s3_client = boto3.client('s3',
aws_access_key_id=self.storage_details.access_key,
aws_secret_access_key=self.storage_details.secret_key,
config=Config(signature_version=self.storage_details.signature_version))
# Key will equal the filepath to the content required.
return s3_client.generate_presigned_url(
ClientMethod='get_object',
ExpiresIn=60,
Params={
'Bucket': self.storage_details.bucket_name,
'Key': kwargs['filepath']
}
)
... passes the URL back to the client in the get method of the CBV
def get(self, request, *args, **kwargs):
...
url = self.get_redirect_url(filepath=path)
return HttpResponsePermanentRedirect(url)
我现在在S3存储桶上设置了我的CORS,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>HEAD</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
我在Django上设置了CORS,以允许所有操作:
CORS_ORIGIN_ALLOW_ALL = True
作为示例,当浏览器尝试访问https://myapp.com/streamer/some_folder/css/some_css_file.css
时,浏览器将重定向到(并按预期获取文件)预先签名的S3网址:https://examplebucket.s3.amazonaws.com/some_folder/css/some_css_file.css?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=credentials%2Faws4_request&X-Amz-Date=20180924T145056Z&X-Amz-Expires=60&X-Amz-SignedHeaders=host&X-Amz-Signature=signature
。
这很好,但是,css文件中的相对URL(用于字体和图像)返回403s。
相对URL的定义(例如):
some_css_file.css
...
@font-face {
font-family: 'Avenir LT';
font-weight: normal;
font-style: normal;
src: url('../Fonts/AvenirLTStd-Book.otf');
}
....
当客户端尝试访问src: url('../Fonts/AvenirLTStd-Book.otf');
时,文件中的相对URL可能返回403s,这可能是因为存储桶已锁定,并且需要对URL进行签名才能访问这些路径。
我该如何解决?
答案 0 :(得分:0)
我在使用Google云存储时遇到了类似的问题。我的解决方案是将这些特定文件设置为公共。 Google云存储使人们可以选择性地(即按对象级别)在存储桶中公开数据
对于Google云存储,我遵循了https://cloud.google.com/storage/docs/access-control/making-data-public
可悲的是,我必须对css文件中由相对URL链接到的每个文件进行迭代处理。这很烦人,但可以完成工作并维护所需的隐私
这是指向Google云存储https://cloudworks.dukamneti.co.ke/fonts-failed-load-resource-google-cloud-storage/#contact
中的解决方案的链接