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

开发过程中,您有任何问题可以在github上,或者在中发帖求助。
功能说明
通过访问密钥、请求方法类型、请求参数等信息生成一个在query参数中携带鉴权信息的url,可将该url提供给其他用户进行临时访问。在生成url时,需要指定url的有效期来限制访客用户的访问时长。
如果想授予其他用户对桶或对象临时进行其他操作的权限(例如上传或下载对象),则需要生成带对应请求的url后(例如生成上传对象put请求的url),将该url提供给其他用户。
接口约束
- obs支持的region与endpoint的对应关系,详细信息请参见。
- 如果遇到跨域报错、签名不匹配问题,请参考以下步骤排查问题:
- 未配置跨域,需要在控制台配置cors规则,请参考。
- 签名计算问题,请参考url中携带签名排查签名参数是否正确;比如上传对象功能,后端将content-type参与计算签名生成授权url,但是前端使用授权url时没有设置content-type字段或者传入错误的值,此时会出现跨域错误。九游平台的解决方案为:content-type字段前后端保持一致。
方法定义
obsclient.createsignedurlsync(params)
请求参数
参数名称 |
参数类型 |
是否必选 |
描述 |
---|---|---|---|
method |
必选 |
参数解释: http方法类型,详情参见httpmethodtype。 |
|
bucket |
string |
必选 |
参数解释: 桶名。 约束限制:
取值范围: 长度为3~63个字符。 默认取值: 无 |
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 |
http get请求。 |
post |
http post请求。 |
put |
http put请求。 |
delete |
http delete请求。 |
head |
http head请求。 |
options |
http options请求。 |
常量值 |
适用接口 |
---|---|
storagepolicy |
设置/获取桶存储类型。 |
quota |
设置/获取桶配额。 |
storageinfo |
获取桶存量信息。 |
location |
获取桶区域位置。 |
acl |
设置/获取桶acl、设置/获取对象acl。 |
policy |
设置/获取/删除桶策略。 |
cors |
设置/获取/删除桶cors配置。 |
versioning |
设置/获取桶多版本状态。 |
website |
设置/获取/删除桶website配置。 |
logging |
设置/获取桶日志管理配置。 |
lifecycle |
设置/获取/删除桶生命周期配置。 |
notification |
设置/获取桶时间通知配置。 |
tagging |
设置/获取/删除桶标签。 |
append |
追加上传对象 |
delete |
批量删除对象。 |
versions |
列举桶内多版本对象。 |
uploads |
列举桶内分段上传任务、初始化分段上传任务。 |
restore |
恢复归档存储或深度归档存储对象。 |
返回结果
参数名称 |
参数类型 |
描述 |
---|---|---|
signedurl |
string |
参数解释: 带授权信息的url。 |
actualsignedrequestheaders |
object |
参数解释: 通过带授权信息的url发起请求时实际应携带的头域。 |
通过obs node.js sdk生成临时url访问obs的步骤如下:
- 通过obsclient.createsignedurlsync生成带签名信息的url。
- 使用任意http库发送http/https请求,访问obs服务。

如果遇到跨域报错、签名不匹配问题,请参考以下步骤排查问题:
- 未配置跨域,需要在控制台配置cors规则,请参考。
- 签名计算问题,请参考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 = ``; // 使用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(); ${location}
代码示例二:上传对象
本示例用于使用临时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(); |
相关文档
意见反馈
文档内容是否对您有帮助?
如您有其它疑问,您也可以通过华为云社区问答频道来与我们联系探讨