生成带授权信息的URL(Harmony SDK)
功能说明
通过访问密钥、请求方法类型、请求参数等信息生成一个在Query参数中携带鉴权信息的URL,可将该URL提供给其他用户进行临时访问。在生成URL时,需要指定URL的有效期来限制访客用户的访问时长。
如果想授予其他用户对桶或对象临时进行其他操作的权限(例如上传或下载对象),则需要生成带对应请求的URL后(例如使用生成PUT请求的URL上传对象),将该URL提供给其他用户。
接口约束
方法定义
createSignedUrlSync(input: CreateSignedUrlSyncInput): CreateSignedUrlSyncOutput
请求参数
参数名称 |
参数类型 |
是否必选 |
描述 |
---|---|---|---|
input |
必选 |
参数解释: 生成带授权信息的URL接口入参,详见CreateSignedUrlInput。 |
参数名称 |
参数类型 |
是否必选 |
描述 |
---|---|---|---|
Method |
必选 |
参数解释: HTTP方法类型,详情参见HttpMethodType。 |
|
Bucket |
string |
可选 |
参数解释: 桶名。 约束限制:
默认取值: 无 |
Key |
string |
可选 |
参数解释: 对象名。对象名是对象在存储桶中的唯一标识。对象名是对象在桶中的完整路径,路径中不包含桶名。 例如,您对象的访问地址为examplebucket.obs.cn-north-4. myhuaweicloud.com/folder/test.txt 中,对象名为folder/test.txt。 取值范围: 长度大于0且不超过1024的字符串。 默认取值: 无 |
SpecialParam |
可选 |
参数解释: 要访问的子资源,详情参见SpecialParam。 |
|
Expires |
number |
可选 |
参数解释: 带授权信息的URL的过期时间。 取值范围: 0~(231-1),单位:秒。 默认取值: 300 |
Headers |
object |
可选 |
参数解释: 请求中携带的头域。 默认取值: 无 |
QueryParams |
object |
可选 |
参数解释: 请求中携带的查询参数。 默认取值: 无 |
常量名 |
原始值 |
说明 |
---|---|---|
GET |
GET |
HTTP GET请求。 |
POST |
POST |
HTTP POST请求。 |
PUT |
PUT |
HTTP PUT请求。 |
DELETE |
DELETE |
HTTP DELETE请求。 |
HEAD |
HEAD |
HTTP HEAD请求。 |
OPTIONS |
OPTIONS |
HTTP OPTIONS请求。 |
常量名 |
原始值 |
适用接口 |
---|---|---|
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 |
恢复归档存储或深度归档存储对象。 |
返回结果
参数名称 |
参数类型 |
描述 |
---|---|---|
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(); |