更新时间:2024-11-07 GMT+08:00
分享

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

功能说明

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

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

接口约束

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

方法定义

createSignedUrlSync(input: CreateSignedUrlSyncInput): CreateSignedUrlSyncOutput

请求参数

表1 请求参数列表

参数名称

参数类型

是否必选

描述

input

CreateSignedUrlInput

必选

参数解释:

生成带授权信息的URL接口入参,详见CreateSignedUrlInput

表2 CreateSignedUrlInput

参数名称

参数类型

是否必选

描述

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~(231-1),单位:秒。

默认取值:

300

Headers

object

可选

参数解释:

请求中携带的头域。

默认取值:

QueryParams

object

可选

参数解释:

请求中携带的查询参数。

默认取值:

表3 HttpMethodType

常量名

原始值

说明

GET

GET

HTTP GET请求。

POST

POST

HTTP POST请求。

PUT

PUT

HTTP PUT请求。

DELETE

DELETE

HTTP DELETE请求。

HEAD

HEAD

HTTP HEAD请求。

OPTIONS

OPTIONS

HTTP OPTIONS请求。

表4 SpecialParam

常量名

原始值

适用接口

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

恢复归档存储或深度归档存储对象。

返回结果

表5 CreateSignedUrlOutput

参数名称

参数类型

描述

SignedUrl

string

参数解释:

带授权信息的URL。

默认取值:

ActualSignedRequestHeaders

object

参数解释:

通过带授权信息的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
// 引入依赖包
import ObsClient, { HttpMethodType } from '@obs/esdk-obs-harmony';

// 指定存储桶名称
const bucketName = "examplebucket";
// 指定对象,此处以 example/objectname 为例
const objectKey = "example/objectname";
 // Server填写Bucket对应的Endpoint, 这里以华北-北京四为例,其他地区请按实际情况填写
const server = "https://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: process.env.ACCESS_KEY_ID,
  SecretAccessKey: process.env.SECRET_ACCESS_KEY,
  // 【可选】如果使用临时AK/SK和SecurityToken访问OBS,同样建议您尽量避免使用硬编码,以降低信息泄露风险。您可以通过环境变量获取访问密钥AK/SK,也可以使用其他外部引入方式传入
  // SecurityToken: process.env.SECURITY_TOKEN,
  Server,
});

const putObject = async () => {
  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;
  // 指定上传的配置信息,可参考鸿蒙开发者文档https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-request-V5#uploadconfig6
  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) => {
        console.info('Upload delete progress notification.' + 'totalSize:' + totalSize + 'uploadedSize:' + uploadedSize);
      });
      let upCompleteCallback = (taskStates: Array<request.TaskState>) => {
        for (let i = 0; i < taskStates.length; i++) {
          console.info("upOnComplete taskState:" + JSON.stringify(taskStates[i]));
        }
      };
      uploadTask.on('complete', upCompleteCallback);

      let upFailCallback = (taskStates: Array<request.TaskState>) => {
        for (let i = 0; i < taskStates.length; i++) {
          console.info("upOnFail taskState:" + JSON.stringify(taskStates[i]));
        }
      };
      uploadTask.on('fail', upFailCallback);

    }).catch((err: BusinessError) => {
      console.error(`Failed to request the upload. Code: ${err.code}, message: ${err.message}`);
    });
  } catch (err) {
    console.error(`Failed to request the upload. err: ${JSON.stringify(err)}`);
  }
}

putObject();

相关文档