文档首页/ 对象存储服务 OBS/ SDK参考/ Python/ 其他接口(Python SDK)/ 生成带授权信息的URL(Python SDK)
更新时间:2024-11-13 GMT+08:00
分享

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

功能说明

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

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

接口约束

  • 如果遇到跨域报错、签名不匹配问题,请参考以下步骤排查问题:
    1. 未配置跨域,需要在控制台配置CORS规则,请参考配置桶允许跨域请求
    2. 签名计算问题,请参考URL中携带签名排查签名参数是否正确;比如上传对象功能,后端将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

可选

参数解释:

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

例如,您对象的访问地址为examplebucket.obs.cn-north-4.myhuaweicloud.com/folder/test.txt 中,对象名为folder/test.txt。

取值范围:

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

默认取值:

specialParam

str

可选

参数解释:

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

取值范围:

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

默认取值:

expires

int

可选

参数解释:

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

取值范围:

大于等于0的整型数,单位:秒。

默认取值:

300秒

headers

dict

可选

参数解释:

请求中携带的头域。

默认取值:

queryParams

dict

可选

参数解释:

请求中携带的查询参数。

默认取值:

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

  1. 未配置跨域,需要在控制台配置CORS规则,请参考配置桶允许跨域请求
  2. 签名计算问题,请参考URL中携带签名排查签名参数是否正确;比如上传对象功能,后端将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
from obs import ObsClient
import os
import traceback
import base64

# 推荐通过环境变量获取AKSK,这里也可以使用其他外部引入方式传入,如果使用硬编码可能会存在泄露风险
# 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html
ak = os.getenv("AccessKeyID")
sk = os.getenv("SecretAccessKey")
# 【可选】如果使用临时AKSK和SecurityToken访问OBS,则同样推荐通过环境变量获取
# security_token = os.getenv("SecurityToken")
# server填写Bucket对应的Endpoint, 这里以华北-北京四为例,其他地区请按实际情况填写
server = "https://obs.cn-north-4.myhuaweicloud.com"
# 创建obsClient实例
# 如果使用临时AKSK和SecurityToken访问OBS,需要在创建实例时通过security_token参数指定securityToken值
obsClient = ObsClient(access_key_id=ak, secret_access_key=sk, server=server)
try:
    # 生成创建桶的带授权信息的URL
    res1 = obsClient.createSignedUrl(method='PUT', bucketName='bucketname', expires=3600)
    print('signedUrl:', res1.signedUrl)
    print('actualSignedRequestHeaders:', res1.actualSignedRequestHeaders)

    # 生成上传对象的带授权信息的URL
    res2 = obsClient.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 = obsClient.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 = obsClient.createSignedUrl(method='GET', bucketName='bucketname', objectKey='objectkey', expires=3600)
    print('signedUrl:', res4.signedUrl)
    print('actualSignedRequestHeaders:', res4.actualSignedRequestHeaders)

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

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

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

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

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

    # 生成图片持久化处理的带授权信息的URL
    # 源对象所在的桶名
    bucketName = 'originBucketName'; 
    # 处理前的源对象名
    objectKey = 'test.png';

    # 处理后的对象名
    targetObjectName ="save.png"
    # 处理后保存的桶名, 可选参数
    targetBucketName ="saveBucketName"
    queryParams={}
    queryParams["x-image-process"]="image/resize,w_100"
    queryParams["x-image-save-object"]=base64.b64encode(targetObjectName .encode("utf-8")).decode()
     # 可选参数
    queryParams["x-image-save-bucket"]=base64.b64encode(targetBucketName .encode("utf-8")).decode()

    res10 = obsClient.createSignedUrl(method='GET', bucketName=bucketName, objectKey=objectKey, queryParams=queryParams, expires=3600)
    print('signedUrl:', res10.signedUrl)
    print('actualSignedRequestHeaders:', res10.actualSignedRequestHeaders)
except:
    print(traceback.format_exc())

相关文档