生成带授权信息的URL(Python SDK)
功能说明
通过访问密钥、请求方法类型、请求参数等信息生成一个在Query参数中携带鉴权信息的URL,可将该URL提供给其他用户进行临时访问。在生成URL时,需要指定URL的有效期来限制访客用户的访问时长。
如果想授予其他用户对桶或对象临时进行其他操作的权限(例如上传或下载对象),则需要生成带对应请求的URL后(例如使用生成PUT请求的URL上传对象),将该URL提供给其他用户。
接口约束
- 如果遇到跨域报错、签名不匹配问题,请参考以下步骤排查问题:
- 未配置跨域,需要在控制台配置CORS规则。
- 签名计算问题,请排查签名参数是否正确;比如上传对象功能,后端将Content-Type参与计算签名生成授权URL,但是前端使用授权URL时没有设置Content-Type字段或者传入错误的值,此时会出现跨域错误。解决方案为:Content-Type字段前后端保持一致。
方法定义
ObsClient.createSignedUrl(method, bucketName, objectKey, specialParam, expires, headers, queryParams)
请求参数
| 参数名称 | 参数类型 | 是否必选 | 描述 |
|---|---|---|---|
| method | str | 必选 | 参数解释: HTTP方法类型 取值范围:
默认取值: 无 |
| bucketName | str | 可选 | 参数解释: 桶名。 约束限制:
默认取值: 无 |
| objectKey | str | 可选 | 参数解释: 对象名。对象名是对象在存储桶中的唯一标识。对象名是对象在桶中的完整路径,路径中不包含桶名。 取值范围: 长度大于0且不超过1024的字符串。 默认取值: 无 |
| specialParam | str | 可选 | 参数解释: 特殊操作符,代表要操作的子资源, 取值范围:
默认取值: 无 |
| expires | int | 可选 | 参数解释: 带授权信息的URL的过期时间。 取值范围:
默认取值: 300秒 |
| headers | dict | 可选 | 参数解释: 请求中携带的头域。 默认取值: 无 |
| queryParams | dict | 可选 | 参数解释: 请求中携带的查询参数。 默认取值: 无 |
如果遇到跨域报错、签名不匹配问题,请参考以下步骤排查问题:
- 未配置跨域,需要在控制台配置CORS规则。
- 签名计算问题,请排查签名参数是否正确;比如上传对象功能,后端将Content-Type参与计算签名生成授权URL,但是前端使用授权URL时没有设置Content-Type字段或者传入错误的值,此时会出现跨域错误。解决方案为:Content-Type字段前后端保持一致。
返回结果
| 参数名称 | 参数类型 | 描述 |
|---|---|---|
| signedUrl | str | 参数解释: 带授权信息的URL。 默认取值: 无 |
| actualSignedRequestHeaders | dict | 参数解释: 通过带授权信息的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()) |