用OBS Python SDK生成带签名的临时访问链接(文件分享小工具)
一、为什么用预签名 URL
对象存储的"私有桶"默认只有授权账号能访问,安全性高。但分享场景很常见:给合作方发一份合同、把大文件临时发给同事、让前端限时拉取一张私有图片……
预签名 URL(Signed URL)的思路是:用你的 AK/SK 对一次"允许的操作(如 GET 下载)+ 对象 + 有效期"生成签名,拼成一条普通 HTTPS 链接。对方不需要任何账号,只要在有效期内打开链接就能完成这次操作;过期后链接作废。桶始终是私有的,只是临时授权了这一次访问。
适合:
- 临时分享私有文件,且不希望长期公开;
- 前端需要限时访问私有资源(如私密图片、报表);
- 批量生成"下载券"分发给不同用户。
二、环境准备
安装官方 OBS Python SDK(包名 esdk-obs-python):
pip install esdk-obs-python
AK/SK 同样走环境变量,不要硬编码:
export AccessKeyID="你的AK"
export SecretAccessKey="你的SK"
区域 Endpoint 对照(节选):
| 区域 | Endpoint |
|---|---|
| 华北-北京四 | obs.cn-north-4.myhuaweicloud.com |
| 华南-广州 | obs.cn-south-1.myhuaweicloud.com |
| 华东-上海一 | obs.cn-east-3.myhuaweicloud.com |
先准备一个私有桶,并上传一个待分享的对象(例如
photos/report.pdf)。桶私有即可,不需要公共读。
三、核心代码
完整脚本如下,保存为 share.py(同目录已附 05-share.py 可直接用):
import os
from obs import ObsClient
# AK/SK 从环境变量读取,避免硬编码
AK = os.getenv("AccessKeyID")
SK = os.getenv("SecretAccessKey")
# 按桶所在区域填写 Endpoint,示例为华北-北京四
SERVER = "https://obs.cn-north-4.myhuaweicloud.com"
BUCKET = "my-private-bucket" # 替换成你自己的私有桶名
def get_client():
return ObsClient(access_key_id=AK, secret_access_key=SK, server=SERVER)
def make_share_link(object_key, expires=3600, method="GET"):
"""生成一个带签名的临时访问链接。
expires: 有效时长,单位秒,默认 3600(1 小时)
method : 允许的操作,下载用 GET,允许上传用 PUT
"""
client = get_client()
try:
resp = client.createSignedUrl(
method=method,
bucketName=BUCKET,
objectKey=object_key,
expires=expires,
)
if resp.status < 300:
print(f"分享链接({expires} 秒后失效):")
print(resp.signedUrl)
else:
print(f"生成失败:{resp.errorCode} {resp.errorMessage}")
finally:
client.close()
if __name__ == "__main__":
# 生成一个 1 小时有效的下载链接
make_share_link("photos/report.pdf", expires=3600)
# 生成一个 1 天有效的下载链接
# make_share_link("photos/report.pdf", expires=86400)
代码关键点:
- 生成签名链接用
client.createSignedUrl(method=..., bucketName=..., objectKey=..., expires=...),参数都是关键字传参; - 返回对象取
resp.signedUrl就是可直接访问的 HTTPS 链接;用resp.status < 300判断是否生成成功; expires是有效期(秒),到点链接自动失效;method="GET"用于分享下载;如果想让对方"上传"到指定对象,改成method="PUT"即可(同样限时)。
安全提示:签名 URL 里包含基于 AK/SK 计算的签名信息(并不在链接里暴露 SK 原文),但在有效期内任何拿到链接的人都能用。所以有效期设短一点、别把链接发给你不信任的人。
四、用法示例
-
运行脚本得到链接,例如:
https://my-private-bucket.obs.cn-north-4.myhuaweicloud.com/photos/report.pdf?Expires=...&Signature=... -
把链接发给对方,对方在浏览器打开即可下载
report.pdf; -
超过
expires时间后再打开,会返回权限拒绝——链接已失效。
五、进阶
- 批量分享:把多个对象名放进列表循环调用
make_share_link即可; - 限制内容类型:
createSignedUrl还支持headers={"Content-Type": "application/pdf"}等参数,限定这次操作的请求头; - 结合业务:可在 Web 后端按用户请求动态生成链接(例如用户点击"下载"时才签发),实现"按需授权、限时有效"的下载服务。
六、小结
用 OBS 的预签名 URL,能在"桶保持私有"的前提下,安全、限时地把文件分享出去:一条 createSignedUrl 调用 + 一个过期时间,就替代了"对外开放整个桶"或"给对方开账号"这两种不优雅的做法。把它接进你的下载/分享流程,既安全又省事。
- 点赞
- 收藏
- 关注作者
评论(0)