九游平台/ 对象存储服务 obs/ sdk参考/ node.js/ / 使用临时url进行授权访问(node.js sdk)
更新时间:2024-10-11 gmt 08:00

使用临时url进行授权访问(node.js sdk)-九游平台

开发过程中,您有任何问题可以在github上,或者在中发帖求助。

功能说明

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

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

接口约束

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

方法定义

obsclient.createsignedurlsync(params)

请求参数

表1 请求参数列表

参数名称

参数类型

是否必选

描述

method

httpmethodtype

必选

参数解释:

http方法类型,详情参见httpmethodtype

bucket

string

必选

参数解释

桶名。

约束限制:

  • 桶的名字需全局唯一,不能与已有的任何桶名称重复,包括其他用户创建的桶。
  • 桶命名规则如下:
    • 3~63个字符,数字或字母开头,支持小写字母、数字、“-”、“.”。
    • 禁止使用ip地址。
    • 禁止以“-”或“.”开头及结尾。
    • 禁止两个“.”相邻(如:“my..bucket”)。
    • 禁止“.”和“-”相邻(如:“my-.bucket”和“my.-bucket”)。
  • 同一用户在同一个区域多次创建同名桶不会报错,创建的桶属性以第一次请求为准。

取值范围:

长度为3~63个字符。

默认取值:

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

可选

参数解释:

请求中携带的查询参数。

约束限制:

取值范围:

默认取值:

表2 httpmethodtype

常量值

说明

get

http get请求。

post

http post请求。

put

http put请求。

delete

http delete请求。

head

http head请求。

options

http options请求。

表3 specialparam

常量值

适用接口

storagepolicy

设置/获取桶存储类型。

quota

设置/获取桶配额。

storageinfo

获取桶存量信息。

location

获取桶区域位置。

acl

设置/获取桶acl、设置/获取对象acl。

policy

设置/获取/删除桶策略。

cors

设置/获取/删除桶cors配置。

versioning

设置/获取桶多版本状态。

website

设置/获取/删除桶website配置。

logging

设置/获取桶日志管理配置。

lifecycle

设置/获取/删除桶生命周期配置。

notification

设置/获取桶时间通知配置。

tagging

设置/获取/删除桶标签。

append

追加上传对象

delete

批量删除对象。

versions

列举桶内多版本对象。

uploads

列举桶内分段上传任务、初始化分段上传任务。

restore

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

返回结果

表4 返回结果

参数名称

参数类型

描述

signedurl

string

参数解释:

带授权信息的url。

actualsignedrequestheaders

object

参数解释:

通过带授权信息的url发起请求时实际应携带的头域。

通过obs node.js sdk生成临时url访问obs的步骤如下:

  1. 通过obsclient.createsignedurlsync生成带签名信息的url。
  2. 使用任意http库发送http/https请求,访问obs服务。

如果遇到跨域报错、签名不匹配问题,请参考以下步骤排查问题:

  1. 未配置跨域,需要在控制台配置cors规则,请参考。
  2. 签名计算问题,请参考url中携带签名排查签名参数是否正确;比如上传对象功能,后端将content-type参与计算签名生成授权url,但是前端使用授权url时没有设置content-type字段或者传入错误的值,此时会出现跨域错误。九游平台的解决方案为:content-type字段前后端保持一致。

以下代码示例展示了如何使用临时url进行授权访问,包括:创建桶、上传对象、下载对象、列举对象、删除对象。

代码示例一:创建桶

本示例用于使用临时url授权创建桶。

// 引入obs库
// 使用npm安装
var obsclient = require('esdk-obs-nodejs');
// 使用源码安装
// var obsclient = require('./lib/obs');
var https = require('https');
var urllib = require('url');
var crypto = require('crypto');
// 创建obsclient实例
var obsclient = new obsclient({
       // 推荐通过环境变量获取aksk,这里也可以使用其他外部引入方式传入,如果使用硬编码可能会存在泄露风险
       // 您可以登录访问管理控制台获取访问密钥ak/sk,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html
       access_key_id: process.env.access_key_id,
       secret_access_key: process.env.secret_access_key,
       server : 'https://your-endpoint'
});
let bucketname = 'bucketname';
let method = 'put';
let res = obsclient.createsignedurlsync({method : method, bucket : bucketname});
let location = 'your-location';
let content  = `${location}`;
// 使用put请求创建桶
var url = urllib.parse(res.signedurl);
var req = https.request({
       method : method,
       host : url.hostname,
       port : url.port,
       path : url.path,
       rejectunauthorized : false,
       headers : res.actualsignedrequestheaders || {}
});
console.log('creating bucket using url:'   res.signedurl);
req.on('response',   (serverback) => {
       var buffers = [];
       serverback.on('data', (data) => {
              buffers.push(data);
       }).on('end', () => {
              
              if(serverback.statuscode < 300){
                     console.log('creating bucket using temporary signature succeed.');
              }else{
                     console.log('creating bucket using temporary signature failed!');
                     console.log('status:'   serverback.statuscode);
                     console.log('\n');
              };
              buffers = buffer.concat(buffers);
              if(buffers.length > 0){
                     console.log(buffers.tostring());
              };
              console.log('\n');
       });
}).on('error',(err) => {
       console.log('creating bucket using temporary signature failed!');
       console.log(err);
       console.log('\n');
});
if(content){
       req.write(content);
};
req.end();

代码示例二:上传对象

本示例用于使用临时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
// 引入obs库
// 使用npm安装
constobsclient=require("esdk-obs-nodejs");
// 使用源码安装
// var obsclient = require('./lib/obs');
// 创建obsclient实例
constobsclient=newobsclient({
// 推荐通过环境变量获取aksk,这里也可以使用其他外部引入方式传入,如果使用硬编码可能会存在泄露风险
// 您可以登录访问管理控制台获取访问密钥ak/sk,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html
access_key_id:process.env.access_key_id,
secret_access_key:process.env.secret_access_key,
// 【可选】如果使用临时ak/sk和securitytoken访问obs,同样建议您尽量避免使用硬编码,以降低信息泄露风险。您可以通过环境变量获取访问密钥ak/sk,也可以使用其他外部引入方式传入
// security_token: process.env.security_token,
// endpoint填写bucket对应的endpoint, 这里以华北-北京四为例,其他地区请按实际情况填写
server:"https://obs.cn-north-4.myhuaweicloud.com",
});
functioncreatesignedurlsync(){
// 指定http方法类型, 这里以put为例
constmethod='put';
constparams={
// 指定存储桶名称
bucket:"examplebucket",
// 指定对象名,此处以 example/objectname 为例
key:"example/objectname",
// 指定http方法类型
method:method,
// 指定签名url的过期时间,这里以3600为例,单位为秒
expires:3600,
// 指定请求中携带的头域
headers:{
"content-type":"text/plain",
}
};
// 生成上传对象的带授权信息的url
constres=obsclient.createsignedurlsync(params);
console.log("signedurl: %s",res.signedurl);
console.log("actualsignedrequestheaders: %v",res.actualsignedrequestheaders);
letcontent='hello obs';
// 使用put请求上传对象
varurl=urllib.parse(res.signedurl);
varreq=https.request({
method:method,
host:url.hostname,
port:url.port,
path:url.path,
rejectunauthorized:false,
headers:res.actualsignedrequestheaders||{}
});
console.log('creating object using url:'res.signedurl);
req.on('response',(serverback)=>{
varbuffers=[];
serverback.on('data',(data)=>{
buffers.push(data);
}).on('end',()=>{
if(serverback.statuscode<300){
console.log('creating object using temporary signature succeed.');
}else{
console.log('creating object using temporary signature failed!');
console.log('status:'serverback.statuscode);
console.log('\n');
};
buffers=buffer.concat(buffers);
if(buffers.length>0){
console.log(buffers.tostring());
};
console.log('\n');
});
}).on('error',(err)=>{
console.log('creating object using temporary signature failed!');
console.log(err);
console.log('\n');
});
if(content){
req.write(content);
};
req.end();
};
createsignedurlsync();

代码示例三:下载对象

本示例用于使用临时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
// 引入obs库
// 使用npm安装
constobsclient=require("esdk-obs-nodejs");
// 使用源码安装
// var obsclient = require('./lib/obs');
// 创建obsclient实例
constobsclient=newobsclient({
// 推荐通过环境变量获取aksk,这里也可以使用其他外部引入方式传入,如果使用硬编码可能会存在泄露风险
// 您可以登录访问管理控制台获取访问密钥ak/sk,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html
access_key_id:process.env.access_key_id,
secret_access_key:process.env.secret_access_key,
// 【可选】如果使用临时ak/sk和securitytoken访问obs,同样建议您尽量避免使用硬编码,以降低信息泄露风险。您可以通过环境变量获取访问密钥ak/sk,也可以使用其他外部引入方式传入
// security_token: process.env.security_token,
// endpoint填写bucket对应的endpoint, 这里以华北-北京四为例,其他地区请按实际情况填写
server:"https://obs.cn-north-4.myhuaweicloud.com",
});
functioncreatesignedurlsync(){
// 指定http方法类型, 这里以get为例
constmethod='get';
constparams={
// 指定存储桶名称
bucket:"examplebucket",
// 指定对象名,此处以 example/objectname 为例
key:"example/objectname",
// 指定http方法类型
method:method,
// 指定签名url的过期时间,这里以3600为例,单位为秒
expires:3600,
};
// 使用get请求下载对象
varurl=urllib.parse(res.signedurl);
varreq=https.request({
method:method,
host:url.hostname,
port:url.port,
path:url.path,
rejectunauthorized:false,
headers:res.actualsignedrequestheaders||{}
});
console.log('creating object using url:'res.signedurl);
req.on('response',(serverback)=>{
varbuffers=[];
serverback.on('data',(data)=>{
buffers.push(data);
}).on('end',()=>{
if(serverback.statuscode<300){
console.log('getting object using temporary signature succeed.');
}else{
console.log('getting object using temporary signature failed!');
console.log('status:'serverback.statuscode);
console.log('\n');
};
buffers=buffer.concat(buffers);
if(buffers.length>0){
console.log(buffers.tostring());
};
console.log('\n');
});
}).on('error',(err)=>{
console.log('getting object using temporary signature failed!');
console.log(err);
console.log('\n');
});
req.end();
};
createsignedurlsync();

代码示例四:列举对象

本示例用于使用临时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
// 引入obs库
// 使用npm安装
constobsclient=require("esdk-obs-nodejs");
// 使用源码安装
// var obsclient = require('./lib/obs');
// 创建obsclient实例
constobsclient=newobsclient({
// 推荐通过环境变量获取aksk,这里也可以使用其他外部引入方式传入,如果使用硬编码可能会存在泄露风险
// 您可以登录访问管理控制台获取访问密钥ak/sk,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html
access_key_id:process.env.access_key_id,
secret_access_key:process.env.secret_access_key,
// 【可选】如果使用临时ak/sk和securitytoken访问obs,同样建议您尽量避免使用硬编码,以降低信息泄露风险。您可以通过环境变量获取访问密钥ak/sk,也可以使用其他外部引入方式传入
// security_token: process.env.security_token,
// endpoint填写bucket对应的endpoint, 这里以华北-北京四为例,其他地区请按实际情况填写
server:"https://obs.cn-north-4.myhuaweicloud.com",
});
functioncreatesignedurlsync(){
// 指定http方法类型, 这里以get为例
constmethod='get';
constparams={
// 指定存储桶名称
bucket:"examplebucket",
// 指定http方法类型
method:method,
// 指定签名url的过期时间,这里以3600为例,单位为秒
expires:3600,
};
// 使用get请求获取对象列表
varurl=urllib.parse(res.signedurl);
varreq=https.request({
method:method,
host:url.hostname,
port:url.port,
path:url.path,
rejectunauthorized:false,
headers:res.actualsignedrequestheaders||{}
});
console.log('listing object using url:'res.signedurl);
req.on('response',(serverback)=>{
varbuffers=[];
serverback.on('data',(data)=>{
buffers.push(data);
}).on('end',()=>{
if(serverback.statuscode<300){
console.log('listing object using temporary signature succeed.');
}else{
console.log('listing object using temporary signature failed!');
console.log('status:'serverback.statuscode);
console.log('\n');
};
buffers=buffer.concat(buffers);
if(buffers.length>0){
console.log(buffers.tostring());
};
console.log('\n');
});
}).on('error',(err)=>{
console.log('listing object using temporary signature failed!');
console.log(err);
console.log('\n');
});
req.end();
};
createsignedurlsync();

代码示例五:删除对象

本示例用于使用临时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
// 引入obs库
// 使用npm安装
constobsclient=require("esdk-obs-nodejs");
// 使用源码安装
// var obsclient = require('./lib/obs');
// 创建obsclient实例
constobsclient=newobsclient({
// 推荐通过环境变量获取aksk,这里也可以使用其他外部引入方式传入,如果使用硬编码可能会存在泄露风险
// 您可以登录访问管理控制台获取访问密钥ak/sk,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html
access_key_id:process.env.access_key_id,
secret_access_key:process.env.secret_access_key,
// 【可选】如果使用临时ak/sk和securitytoken访问obs,同样建议您尽量避免使用硬编码,以降低信息泄露风险。您可以通过环境变量获取访问密钥ak/sk,也可以使用其他外部引入方式传入
// security_token: process.env.security_token,
// endpoint填写bucket对应的endpoint, 这里以华北-北京四为例,其他地区请按实际情况填写
server:"https://obs.cn-north-4.myhuaweicloud.com",
});
functioncreatesignedurlsync(){
// 指定http方法类型, 这里以delete为例
constmethod='delete';
constparams={
// 指定存储桶名称
bucket:"examplebucket",
// 指定对象名,此处以 example/objectname 为例
key:"example/objectname",
// 指定http方法类型
method:method,
// 指定签名url的过期时间,这里以3600为例,单位为秒
expires:3600,
};
// 使用delete请求删除对象
varurl=urllib.parse(res.signedurl);
varreq=https.request({
method:method,
host:url.hostname,
port:url.port,
path:url.path,
rejectunauthorized:false,
headers:res.actualsignedrequestheaders||{}
});
console.log('deleting object using url:'res.signedurl);
req.on('response',(serverback)=>{
varbuffers=[];
serverback.on('data',(data)=>{
buffers.push(data);
}).on('end',()=>{
if(serverback.statuscode<300){
console.log('deleting object using temporary signature succeed.');
}else{
console.log('deleting object using temporary signature failed!');
console.log('status:'serverback.statuscode);
console.log('\n');
};
buffers=buffer.concat(buffers);
if(buffers.length>0){
console.log(buffers.tostring());
};
console.log('\n');
});
}).on('error',(err)=>{
console.log('deleting object using temporary signature failed!');
console.log(err);
console.log('\n');
});
req.end();
};
createsignedurlsync();

相关文档

网站地图