用OBS Python SDK生成带签名的临时访问链接(文件分享小工具)

举报
海是岛思念的泪 发表于 2026/08/23 16:11:51 2026/08/23
【摘要】 桶设私有最安全,但想临时分享文件怎么办?本文用华为云OBS官方Python SDK的createSignedUrl生成带签名、有过期时间的临时下载链接,对方无需账号、过期自动失效,纯代码实现。

一、为什么用预签名 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 原文),但在有效期内任何拿到链接的人都能用。所以有效期设短一点、别把链接发给你不信任的人。

四、用法示例

  1. 运行脚本得到链接,例如:

    https://my-private-bucket.obs.cn-north-4.myhuaweicloud.com/photos/report.pdf?Expires=...&Signature=...
    
  2. 把链接发给对方,对方在浏览器打开即可下载 report.pdf

  3. 超过 expires 时间后再打开,会返回权限拒绝——链接已失效。

五、进阶

  • 批量分享:把多个对象名放进列表循环调用 make_share_link 即可;
  • 限制内容类型createSignedUrl 还支持 headers={"Content-Type": "application/pdf"} 等参数,限定这次操作的请求头;
  • 结合业务:可在 Web 后端按用户请求动态生成链接(例如用户点击"下载"时才签发),实现"按需授权、限时有效"的下载服务。

六、小结

用 OBS 的预签名 URL,能在"桶保持私有"的前提下,安全、限时地把文件分享出去:一条 createSignedUrl 调用 + 一个过期时间,就替代了"对外开放整个桶"或"给对方开账号"这两种不优雅的做法。把它接进你的下载/分享流程,既安全又省事。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。