
# 生成带授权信息的URL(Python SDK)
#### 功能说明
通过访问密钥、请求方法类型、请求参数等信息生成一个在Query参数中携带鉴权信息的URL，可将该URL提供给其他用户进行临时访问。在生成URL时，需要指定URL的有效期来限制访客用户的访问时长。
如果想授予其他用户对桶或对象临时进行其他操作的权限（例如上传或下载对象），则需要生成带对应请求的URL后（例如使用生成PUT请求的URL上传对象），将该URL提供给其他用户。
#### 接口约束
- OBS支持的Region与Endpoint的对应关系，详细信息请参见[地区与终端节点](https://developer.huaweicloud.com/endpoint?OBS)。

- 如果遇到跨域报错、签名不匹配问题，请参考以下步骤排查问题：
  1. 未配置跨域，需要在控制台配置CORS规则，请参考[配置桶允许跨域请求](https://support.huaweicloud.com/sdk-browserjs-devg-obs/obs_24_0107.html)。
  
  2. 签名计算问题，请参考[URL中携带签名](https://support.huaweicloud.com/api-obs/obs_04_0011.html)排查签名参数是否正确；比如上传对象功能，后端将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\~86400秒。  - 永久密钥取值范围为0\~630720000秒。   **默认取值：** 300秒                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| headers      | dict     | 可选       | **参数解释：** 请求中携带的头域。 **默认取值：** 无                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| queryParams  | dict     | 可选       | **参数解释：** 请求中携带的查询参数。 **默认取值：** 无                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
   
![](https://support.huaweicloud.com/sdk-python-devg-obs/public_sys-resources/caution_3.0-zh-cn.png)
如果遇到跨域报错、签名不匹配问题，请参考以下步骤排查问题：
1. 未配置跨域，需要在控制台配置CORS规则，请参考[配置桶允许跨域请求](https://support.huaweicloud.com/sdk-browserjs-devg-obs/obs_24_0107.html)。
2. 签名计算问题，请参考[URL中携带签名](https://support.huaweicloud.com/api-obs/obs_04_0011.html)排查签名参数是否正确；比如上传对象功能，后端将Content-Type参与计算签名生成授权URL，但是前端使用授权URL时没有设置Content-Type字段或者传入错误的值，此时会出现跨域错误。解决方案为：Content-Type字段前后端保持一致。
 
#### 返回结果
表2返回结果 
| **参数名称**                   | **参数类型** | **描述**                                                                                                                                                                                                   |
|:---|:---|:---|
| signedUrl                  | str      | **参数解释：** 带授权信息的URL。 **默认取值：** 无             |
| actualSignedRequestHeaders | dict     | **参数解释：** 通过带授权信息的URL发起请求时实际应携带的头域。 **默认取值：** 无 |
   
#### 代码样例
此用例用于生成带授权信息的临时URL。
```
import os
import traceback
import base64
from obs import ObsClient
# 推荐通过环境变量获取AK/SK，这里也可以使用其他外部引入方式传入，如果使用硬编码可能会存在泄露风险
# 您可以登录访问管理控制台获取访问密钥AK/SK，获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html
ak = os.getenv('AccessKeyID')
sk = os.getenv('SecretAccessKey')
# 如需使用临时AK/SK和SecurityToken访问OBS，则同样推荐通过环境变量获取
# security_token = os.getenv('SecurityToken')
# server填写Bucket对应的Endpoint，这里以华北-北京四为例，其他地区请按实际情况填写
server = 'https://obs.cn-north-4.myhuaweicloud.com'
# 创建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())
```
