更新时间:2026-07-01 GMT+08:00

生成带授权信息的URL(Python SDK)

功能说明

通过访问密钥、请求方法类型、请求参数等信息生成一个在Query参数中携带鉴权信息的URL,可将该URL提供给其他用户进行临时访问。在生成URL时,需要指定URL的有效期来限制访客用户的访问时长。

如果想授予其他用户对桶或对象临时进行其他操作的权限(例如上传或下载对象),则需要生成带对应请求的URL后(例如使用生成PUT请求的URL上传对象),将该URL提供给其他用户。

接口约束

  • 如果遇到跨域报错、签名不匹配问题,请参考以下步骤排查问题:
    1. 未配置跨域,需要在控制台配置CORS规则。
    2. 签名计算问题,请排查签名参数是否正确;比如上传对象功能,后端将Content-Type参与计算签名生成授权URL,但是前端使用授权URL时没有设置Content-Type字段或者传入错误的值,此时会出现跨域错误。解决方案为:Content-Type字段前后端保持一致。

方法定义

ObsClient.createSignedUrl(method, bucketName, objectKey, specialParam, expires, headers, queryParams)

请求参数

表1 请求参数列表

参数名称

参数类型

是否必选

描述

method

str

必选

参数解释:

HTTP方法类型

取值范围:

  • GET
  • POST
  • PUT
  • DELETE
  • HEAD

默认取值:

bucketName

str

可选

参数解释

桶名。

约束限制:

  • 桶的名字需全局唯一,不能与已有的任何桶名称重复,包括其他用户创建的桶。
  • 桶命名规则如下:
    • 3~63个字符,数字或字母开头,支持小写字母、数字、“-”、“.”。
    • 禁止使用IP地址。
    • 禁止以“-”或“.”开头及结尾。
    • 禁止两个“.”相邻(如:“my..bucket”)。
    • 禁止“.”和“-”相邻(如:“my-.bucket”和“my.-bucket”)。
  • 同一用户在同一个区域多次创建同名桶不会报错,创建的桶属性以第一次请求为准。

默认取值:

objectKey

str

可选

参数解释:

对象名。对象名是对象在存储桶中的唯一标识。对象名是对象在桶中的完整路径,路径中不包含桶名。

取值范围:

长度大于0且不超过1024的字符串。

默认取值:

specialParam

str

可选

参数解释:

特殊操作符,代表要操作的子资源,

取值范围:

  • versions
  • uploads
  • location
  • storageinfo
  • quota
  • storagePolicy
  • acl
  • append
  • logging
  • policy
  • lifecycle
  • website
  • versioning
  • cors
  • notification
  • delete
  • restore

默认取值:

expires

int

可选

参数解释:

带授权信息的URL的过期时间。

取值范围:

  • 临时密钥取值范围为0~86400秒。
  • 永久密钥取值范围为0~630720000秒。

默认取值:

300秒

headers

dict

可选

参数解释:

请求中携带的头域。

默认取值:

queryParams

dict

可选

参数解释:

请求中携带的查询参数。

默认取值:

如果遇到跨域报错、签名不匹配问题,请参考以下步骤排查问题:

  1. 未配置跨域,需要在控制台配置CORS规则。
  2. 签名计算问题,请排查签名参数是否正确;比如上传对象功能,后端将Content-Type参与计算签名生成授权URL,但是前端使用授权URL时没有设置Content-Type字段或者传入错误的值,此时会出现跨域错误。解决方案为:Content-Type字段前后端保持一致。

返回结果

表2 返回结果

参数名称

参数类型

描述

signedUrl

str

参数解释:

带授权信息的URL。

默认取值:

actualSignedRequestHeaders

dict

参数解释:

通过带授权信息的URL发起请求时实际应携带的头域。

默认取值:

代码样例

此用例用于生成带授权信息的临时URL。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import os
import traceback
import base64
from obs import ObsClient

# 推荐通过环境变量获取AK/SK,这里也可以使用其他外部引入方式传入,如果使用硬编码可能会存在泄露风险
# 您可以登录访问管理控制台获取访问密钥AK/SK
ak = os.getenv('AccessKeyID')
sk = os.getenv('SecretAccessKey')
# 如需使用临时AK/SK和SecurityToken访问OBS,则同样推荐通过环境变量获取
# security_token = os.getenv('SecurityToken')
# server填写桶所在区域的endpoint
server = 'https://your-endpoint'

# 创建obsClient实例
# 如果使用临时AK/SK和SecurityToken访问OBS,需要在创建实例时通过security_token参数指定securityToken值
obs_client = ObsClient(access_key_id=ak, secret_access_key=sk, server=server)
try:
    # 生成创建桶的带授权信息的URL
    res1 = obs_client.createSignedUrl(method='PUT', bucketName='bucketname', expires=3600)
    # createSignedUrl 返回 dict-like 对象,推荐使用字典访问方式获取签名URL和请求头
    print('signedUrl:', res1['signedUrl'])
    print('actualSignedRequestHeaders:', res1['actualSignedRequestHeaders'])

    # 生成上传对象的带授权信息的URL
    res2 = obs_client.createSignedUrl(method='PUT', bucketName='bucketname', objectKey='objectkey', expires=3600,
                                     headers = {'Content-Type': 'text/plain'})
    print('signedUrl:', res2['signedUrl'])
    print('actualSignedRequestHeaders:', res2['actualSignedRequestHeaders'])

    # 生成设置对象ACL的带授权信息的URL
    res3 = obs_client.createSignedUrl(method='PUT', bucketName='bucketname', objectKey='objectkey', specialParam='acl',
                                     expires = 3600, headers = {'x-obs-acl': 'private'})
    print('signedUrl:', res3['signedUrl'])
    print('actualSignedRequestHeaders:', res3['actualSignedRequestHeaders'])

    # 生成下载对象的带授权信息的URL
    res4 = obs_client.createSignedUrl(method='GET', bucketName='bucketname', objectKey='objectkey', expires=3600)
    print('signedUrl:', res4['signedUrl'])
    print('actualSignedRequestHeaders:', res4['actualSignedRequestHeaders'])

    # 指定对象的历史版本号生成下载对象的带授权信息的URL
    res4_version = obs_client.createSignedUrl(method='GET', bucketName='bucketname', objectKey='objectkey', expires=3600,
                                             query_params = {'versionID': 'G00111401201878AFF'})
    print('signedUrl:', res4_version['signedUrl'])
    print('actualSignedRequestHeaders:', res4_version['actualSignedRequestHeaders'])

    # 生成删除对象的带授权信息的URL
    res5 = obs_client.createSignedUrl(method='DELETE', bucketName='bucketname', objectKey='objectkey', expires=3600)
    print('signedUrl:', res5['signedUrl'])
    print('actualSignedRequestHeaders:', res5['actualSignedRequestHeaders'])

    # 生成删除桶的带授权信息的URL
    res6 = obs_client.createSignedUrl(method='DELETE', bucketName='bucketname', expires=3600)
    print('signedUrl:', res6['signedUrl'])
    print('actualSignedRequestHeaders:', res6['actualSignedRequestHeaders'])

    # 生成设置初始化分段任务的带授权信息的URL
    res7 = obs_client.createSignedUrl(method='POST', bucketName='bucketname', objectKey='objectkey',
                                     special_param = 'uploads', expires = 3600)
    print('signedUrl:', res7['signedUrl'])
    print('actualSignedRequestHeaders:', res7['actualSignedRequestHeaders'])

    # 生成上传段的带授权信息的URL
    res8 = obs_client.createSignedUrl(method='PUT', bucketName='bucketname', objectKey='objectkey', expires=3600,
                                     query_params = {'partNumber': '1', 'uploadId': '00000*****'})
    print('signedUrl:', res8['signedUrl'])
    print('actualSignedRequestHeaders:', res8['actualSignedRequestHeaders'])

    # 生成合并段的带授权信息的URL
    res9 = obs_client.createSignedUrl(method='POST', bucketName='bucketname', objectKey='objectkey', expires=3600,
                                     query_params = {'uploadId': '00000*****'})
    print('signedUrl:', res9['signedUrl'])
    print('actualSignedRequestHeaders:', res9['actualSignedRequestHeaders'])

    # 生成图片持久化处理的带授权信息的URL
    # 源对象所在的桶名
    bucket_name = 'originBucketName'
    # 处理前的源对象名
    object_key = 'test.png'
    # 处理后的对象名
    target_object_name = 'save.png'
    # 处理后保存的桶名, 可选参数
    target_bucket_name = 'saveBucketName'
    query_params = {}
    query_params['x-image-process'] = 'image/resize, w_100'
    query_params['x-image-save-object'] = base64.b64encode(target_object_name.encode('utf-8')).decode()
     # 可选参数
    query_params['x-image-save-bucket'] = base64.b64encode(target_bucket_name.encode('utf-8')).decode()
    res10 = obs_client.createSignedUrl(method='GET', bucketName=bucket_name, objectKey=object_key, queryParams=query_params, expires=3600)
    print('signedUrl:', res10['signedUrl'])
    print('actualSignedRequestHeaders:', res10['actualSignedRequestHeaders'])
except Exception:
    print(traceback.format_exc())