首页 运维干货Python利用S3的Presigned URLs实现无鉴权上传与下载

Python利用S3的Presigned URLs实现无鉴权上传与下载

运维派隶属马哥教育旗下专业运维社区,是国内成立最早的IT运维技术社区,欢迎关注公众号:yunweipai
领取学习更多免费Linux云计算、Python、Docker、K8s教程关注公众号:马哥linux运维

S3协议操作对象存储服务,通常是实现上传下载功能。 但是在某些场景下,程序不具备操作权限,或为了安全原因而缩小权限配置,需要实现无鉴权的上传与下载。 这时可以用S3协议的Presigned URLs来实现无鉴权读写操作。

Python利用S3的Presigned URLs实现无鉴权上传与下载插图

推荐使用PUT而不是POST来实现上传,因为PUT使用起来比较简单。

PUT上传

generate_presigned_url的源码可见botocore/signers.py#L245

这里的返回值,就是一个在1小时内可以用PUT上传的URL字符串。 通过某种方式传递URL到无鉴权的服务或客户端,就可以实现上传功能。

S3_*等,就是鉴权信息。生成URL需要鉴权信息,使用时则不用。 上面代码中,还包含一个if判定桶的存在性并自动建立的功能。 它在生产环境基本无用,但是方便调试,可以酌情去掉。

以下是上传示例:

GET下载

整个实现和PUT非常类似,只是改了ClientMethodHttpMethod

以下是下载示例:

POST上传

generate_presigned_post的源码可见botocore/signers.py#L605。 除了URL外,fields是个dict,也是必须要传递的参数。 并且似乎需要传递或约定path,也可能使用通用的file也行。

HTML网页示例如下,其中也可发现fields中包含的具体内容。:

总结

同样是上传,用POST就会麻烦一些,因此推荐PUT。 二者的区别,可能在于操作的幂等性,POST是不能重复的,而PUT可以。 (仅语义推断,未实测验证。)

分段上传,用Presigned URLs似乎是不支持的。

原文来自:https://note.qidong.name/2020/08/python-s3-presigned-url/
作者:匿蟒

本文链接:http://www.yunweipai.com/37130.html

网友评论comments

发表评论

电子邮件地址不会被公开。

暂无评论

Copyright © 2012-2020 YUNWEIPAI.COM - 运维派
扫二维码
扫二维码
返回顶部