
# 生成带授权信息的URL(HarmonyOS 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字段前后端保持一致。
   
 
#### 方法定义
```
createSignedUrlSync(input: CreateSignedUrlSyncInput): CreateSignedUrlSyncOutput
```
#### 请求参数
表1请求参数列表 
| **参数名称** | **参数类型**                                                    | **是否必选** | **描述**                                                                                                                |
|:---|:---|:---|:---|
| input    | [CreateSignedUrlSyncInput] | 必选       | **参数解释：** 生成带授权信息的URL接口入参，详见[CreateSignedUrlSyncInput]。 |
   
 表2CreateSignedUrlSyncInput 
| **参数名称**     | **参数类型**                                         | **是否必选** | **描述**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
|:---|:---|:---|:---|
| Method       | [HttpMethodType] | 必选       | **参数解释：** HTTP方法类型，详情参见[HttpMethodType]。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| Bucket       | string                                           | 可选       | **参数解释** **：** 桶名。 **约束限制：** - 桶的名字需全局唯一，不能与已有的任何桶名称重复，包括其他用户创建的桶。  - 桶命名规则如下： - 3～63个字符，数字或字母开头，支持小写字母、数字、"-"、"."。  - 禁止使用IP地址。  - 禁止以"-"或"."开头及结尾。  - 禁止两个"."相邻（如："my..bucket"）。  - 禁止"."和"-"相邻（如："my-.bucket"和"my.-bucket"）。    - 同一用户在同一个区域多次创建同名桶不会报错，创建的桶属性以第一次请求为准。   **默认取值：** 无 |
| Key          | string                                           | 可选       | **参数解释：** 对象名。对象名是对象在存储桶中的唯一标识。对象名是对象在桶中的完整路径，路径中不包含桶名。 例如，您对象的访问地址为examplebucket.obs.cn-north-4. myhuaweicloud.com/folder/test.txt 中，对象名为folder/test.txt。 **取值范围：** 长度大于0且不超过1024的字符串。 **默认取值：** 无                                                                                                                                                                                                                                                                                                                                                                                                               |
| SpecialParam | [SpecialParam]  | 可选       | **参数解释：** 要访问的子资源，详情参见[SpecialParam]。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| Expires      | number                                           | 可选       | **参数解释：** 带授权信息的URL的过期时间。 **取值范围：** 0\~（2^31^-1），单位：秒。 **默认取值：** 300                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| Headers      | object                                           | 可选       | **参数解释：** 请求中携带的头域。 **默认取值：** 无                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| QueryParams  | object                                           | 可选       | **参数解释：** 请求中携带的查询参数。 **默认取值：** 无                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
   
 表3HttpMethodType 
| **常量名** | **原始值** | **说明**          |
|:---|:---|:---|
| GET     | GET     | HTTP GET请求。     |
| POST    | POST    | HTTP POST请求。    |
| PUT     | PUT     | HTTP PUT请求。     |
| DELETE  | DELETE  | HTTP DELETE请求。  |
| HEAD    | HEAD    | HTTP HEAD请求。    |
| OPTIONS | OPTIONS | HTTP OPTIONS请求。 |
   
 表4SpecialParam 
| **常量名**        | **原始值**       | **适用接口**              |
|:---|:---|:---|
| STORAGE_POLICY | storagePolicy | 设置/获取桶存储类型。           |
| QUOTA          | quota         | 设置/获取桶配额。             |
| STORAGE_INFO   | storageinfo   | 获取桶存量信息。              |
| LOCATION       | location      | 获取桶区域位置。              |
| Acl            | acl           | 设置/获取桶ACL、设置/获取对象ACL。 |
| POLICY         | policy        | 设置/获取/删除桶策略。          |
| CORS           | cors          | 设置/获取/删除桶CORS配置。      |
| VERSIONING     | versioning    | 设置/获取桶多版本状态。          |
| WEBSITE        | website       | 设置/获取/删除桶Website配置。   |
| LOGGING        | logging       | 设置/获取桶日志管理配置。         |
| LIFECYCLE      | lifecycle     | 设置/获取/删除桶生命周期配置。      |
| NOTIFICATION   | notification  | 设置/获取桶时间通知配置。         |
| TAGGING        | tagging       | 设置/获取/删除桶标签。          |
| APPEND         | append        | 追加上传对象                |
| DELETE         | delete        | 批量删除对象。               |
| VERSIONS       | versions      | 列举桶内多版本对象。            |
| UPLOADS        | uploads       | 列举桶内分段上传任务、初始化分段上传任务。 |
| RESTORE        | restore       | 恢复归档存储或深度归档存储对象。      |
   
#### 返回结果
表5CreateSignedUrlSyncOutput 
| **参数名称**                   | **参数类型** | **描述**                                                                                                                                                                                                   |
|:---|:---|:---|
| SignedUrl                  | string   | **参数解释：** 带授权信息的URL。 **默认取值：** 无             |
| ActualSignedRequestHeaders | object   | **参数解释：** 通过带授权信息的URL发起请求时实际应携带的头域。 **默认取值：** 无 |
   
#### 代码示例
使用临时URL上传对象
```
// 引入依赖包
import ObsClient, { HttpMethodType } from '@obs/esdk-obs-harmony';
import { request, BusinessError } from '@kit.BasicServicesKit';
import { process } from '@kit.ArkTS';
import { hilog } from '@kit.PerformanceAnalysisKit';
const processManager = new process.ProcessManager();
// 指定存储桶名称
const bucketName = "examplebucket";
// 指定对象，此处以 example/objectname 为例
const objectKey = "example/objectname";
 // Server填写Bucket对应的Endpoint, 这里以华北-北京四为例，其他地区请按实际情况填写
const server = "obs.cn-north-4.myhuaweicloud.com";
// 文件的本地存储路径。仅支持"internal"协议类型，"internal://cache/"为应用的私有目录，是必填字段
const sourceFile = "internal://cache/hello.txt";
// 创建ObsClient实例
const obsClient = new ObsClient({
  // 推荐通过环境变量获取AKSK，这里也可以使用其他外部引入方式传入，如果使用硬编码可能会存在泄露风险
  // 您可以登录访问管理控制台获取访问密钥AK/SK，获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html
  AccessKeyId: processManager.getEnvironmentVar("ACCESS_KEY_ID"),
  SecretAccessKey: processManager.getEnvironmentVar("SECRET_ACCESS_KEY"),
  // 【可选】如果使用临时AK/SK和SecurityToken访问OBS，同样建议您尽量避免使用硬编码，以降低信息泄露风险。您可以通过环境变量获取访问密钥AK/SK，也可以使用其他外部引入方式传入
  // SecurityToken: processManager.getEnvironmentVar("SECURITY_TOKEN"),
  Server: server,
});
async function putObject() {
  const result = obsClient.createSignedUrlSync({
    // 指定HTTP方法类型，这里以HttpMethodType.PUT为例
    Method: HttpMethodType.PUT,
    // 指定存储桶名称
    Bucket: bucketName,
    // 指定对象名
    Key: objectKey,
    // 指定带授权信息的URL的过期时间。
    Expires: 3600,
    // 指定请求中携带的头域
    Headers: {
      "Content-Type": "text/plain"
    }
  });
  let uploadTask: request.UploadTask;
  // 指定上传的配置信息
  let uploadConfig: request.UploadConfig = {
    url: result.SignedUrl,
    method: HttpMethodType.PUT,
    header: result.ActualSignedRequestHeaders,
    files: [{ filename: objectKey, name: "file", uri: sourceFile, type: "text/plain" }],
    data: [],
  };
  try {
    request.uploadFile(getContext(), uploadConfig).then((data: request.UploadTask) => {
      uploadTask = data;
      uploadTask.on('progress',  (uploadedSize: number, totalSize: number) => {
        hilog.info(0x0001, 'OBS-Harmony', 'Upload progress notification. totalSize:' + totalSize + ' uploadedSize:' + uploadedSize);
      });
      let upCompleteCallback = (taskStates: Array<request.TaskState>) => {
        for (let i = 0; i < taskStates.length; i++) {
          hilog.info(0x0001, 'OBS-Harmony', "upOnComplete taskState:" + JSON.stringify(taskStates[i]));
        }
      };
      uploadTask.on('complete', upCompleteCallback);
      let upFailCallback = (taskStates: Array<request.TaskState>) => {
        for (let i = 0; i < taskStates.length; i++) {
          hilog.info(0x0001, 'OBS-Harmony', "upOnFail taskState:" + JSON.stringify(taskStates[i]));
        }
      };
      uploadTask.on('fail', upFailCallback);
    }).catch((err: BusinessError) => {
      hilog.error(0x0001, 'OBS-Harmony', `Failed to request the upload. Code: ${err.code}, message: ${err.message}`);
    });
  } catch (err) {
    hilog.error(0x0001, 'OBS-Harmony', `Failed to request the upload. err: ${JSON.stringify(err)}`);
  }
}
putObject();
```
