使用临时url进行授权访问-九游平台

开发过程中,您有任何问题可以在github上,或者在中发帖求助。接口参考文档详细介绍了每个接口的参数和使用方法。
obs客户端支持通过访问密钥、请求方法类型、请求参数等信息生成一个在query参数中携带鉴权信息的url,可将该url提供给其他用户进行临时访问。在生成url时,您需要指定url的有效期来限制访客用户的访问时长。
如果您想授予其他用户对桶或对象临时进行其他操作的权限(例如上传或下载对象),则需要生成带对应请求的url后(例如使用生成put请求的url上传对象),将该url提供给其他用户。
通过该方式可支持的操作以及相关信息见下表:
操作名 |
http请求方法 |
特殊操作符(子资源) |
是否需要桶名 |
是否需要对象名 |
---|---|---|---|---|
列举桶内对象 |
get |
n/a |
是 |
否 |
列举桶内多版本对象 |
get |
versions |
是 |
否 |
列举分段上传任务 |
get |
uploads |
是 |
否 |
获取桶元数据 |
head |
n/a |
是 |
否 |
获取桶区域位置 |
get |
location |
是 |
否 |
获取桶存量信息 |
get |
storageinfo |
是 |
否 |
设置桶配额 |
put |
quota |
是 |
否 |
获取桶配额 |
get |
quota |
是 |
否 |
设置桶存储类型 |
put |
storagepolicy |
是 |
否 |
获取桶存储类型 |
get |
storagepolicy |
是 |
否 |
设置桶访问权限 |
put |
acl |
是 |
否 |
获取桶访问权限 |
get |
acl |
是 |
否 |
开启/关闭桶日志 |
put |
logging |
是 |
否 |
查看桶日志 |
get |
logging |
是 |
否 |
设置桶策略 |
put |
policy |
是 |
否 |
查看桶策略 |
get |
policy |
是 |
否 |
删除桶策略 |
delete |
policy |
是 |
否 |
设置生命周期规则 |
put |
lifecycle |
是 |
否 |
查看生命周期规则 |
get |
lifecycle |
是 |
否 |
删除生命周期规则 |
delete |
lifecycle |
是 |
否 |
设置托管配置 |
put |
website |
是 |
否 |
查看托管配置 |
get |
website |
是 |
否 |
清除托管配置 |
delete |
website |
是 |
否 |
设置桶多版本状态 |
put |
versioning |
是 |
否 |
查看桶多版本状态 |
get |
versioning |
是 |
否 |
查看跨域规则 |
get |
cors |
是 |
否 |
删除跨域规则 |
delete |
cors |
是 |
否 |
设置桶标签 |
put |
tagging |
是 |
否 |
查看桶标签 |
get |
tagging |
是 |
否 |
删除桶标签 |
delete |
tagging |
是 |
否 |
上传对象 |
put |
n/a |
是 |
是 |
追加上传 |
post |
append |
是 |
是 |
下载对象 |
get |
n/a |
是 |
是 |
复制对象 |
put |
n/a |
是 |
是 |
删除对象 |
delete |
n/a |
是 |
是 |
批量删除对象 |
post |
delete |
是 |
是 |
获取对象属性 |
head |
n/a |
是 |
是 |
设置对象访问权限 |
put |
acl |
是 |
是 |
查看对象访问权限 |
get |
acl |
是 |
是 |
初始化分段上传任务 |
post |
uploads |
是 |
是 |
上传段 |
put |
n/a |
是 |
是 |
复制段 |
put |
n/a |
是 |
是 |
列举已上传的段 |
get |
n/a |
是 |
是 |
合并段 |
post |
n/a |
是 |
是 |
取消分段上传任务 |
delete |
n/a |
是 |
是 |
恢复归档存储对象 |
post |
restore |
是 |
是 |
通过obs browserjs sdk生成临时url访问obs的步骤如下:
- 通过obsclient.createsignedurlsync生成带签名信息的url。
- 使用任意http库发送http/https请求,访问obs服务。

如果遇到跨域报错、签名不匹配问题,请参考以下步骤排查问题:
- 未配置跨域,需要在控制台配置cors规则,请参考。
- 签名计算问题,请参考url中携带签名排查签名参数是否正确;比如上传对象功能,后端将content-type参与计算签名生成授权url,但是前端使用授权url时没有设置content-type字段或者传入错误的值,此时会出现跨域错误。九游平台的解决方案为:content-type字段前后端保持一致。
以下代码展示了如何使用临时url进行授权访问,包括:上传对象、下载对象、列举对象、删除对象。
上传对象
// 创建obsclient实例 var obsclient = new obsclient({ // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量accesskeyid和secretaccesskey。 // 前端本身没有process对象,可以使用webpack类打包工具定义环境变量,就可以在代码中运行了。 // 您可以登录访问管理控制台获取访问密钥ak/sk,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html access_key_id: process.env.accesskeyid, secret_access_key: process.env.secretaccesskey, // 这里以华北-北京四为例,其他地区请按实际情况填写 server: 'https://obs.cn-north-4.myhuaweicloud.com' }); // 使用put请求上传对象 var bucketname = 'bucketname'; var objectkey = 'objectname'; var method = 'put'; var headers = { 'content-type' : 'text/plain' } var res = obsclient.createsignedurlsync({ method : method, bucket : bucketname, key : objectkey, expires : 3600, headers : headers }); var content = 'hello obs'; var reopt = { method : method, url : res.signedurl, withcredentials: false, headers : res.actualsignedrequestheaders || {}, validatestatus: function(status){ return status >= 200; }, maxredirects : 0, responsetype : 'text', data : content, }; axios.request(reopt).then(function (response) { if(response.status < 300){ console.log('creating object using temporary signature succeed.'); }else{ console.log('creating object using temporary signature failed!'); console.log('status:' response.status); console.log('\n'); } console.log(response.data); console.log('\n'); }).catch(function (err) { console.log('creating object using temporary signature failed!'); console.log(err); console.log('\n'); });
下载对象
// 创建obsclient实例 var obsclient = new obsclient({ // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量accesskeyid和secretaccesskey。 // 前端本身没有process对象,可以使用webpack类打包工具定义环境变量,就可以在代码中运行了。 // 您可以登录访问管理控制台获取访问密钥ak/sk,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html access_key_id: process.env.accesskeyid, secret_access_key: process.env.secretaccesskey, // 这里以华北-北京四为例,其他地区请按实际情况填写 server: 'https://obs.cn-north-4.myhuaweicloud.com' }); // 使用get请求下载对象 var bucketname = 'bucketname'; var objectkey = 'objectname'; var method = 'get'; var res = obsclient.createsignedurlsync({ method : method, bucket : bucketname, key : objectkey, expires : 3600, }); var reopt = { method : method, url : res.signedurl, withcredentials: false, headers : res.actualsignedrequestheaders || {}, validatestatus: function(status){ return status >= 200; }, maxredirects : 0, responsetype : 'text', }; axios.request(reopt).then(function (response) { if(response.status < 300){ console.log('getting object using temporary signature succeed.'); }else{ console.log('getting object using temporary signature failed!'); console.log('status:' response.status); console.log('\n'); } console.log(response.data); console.log('\n'); }).catch(function (err) { console.log('getting object using temporary signature failed!'); console.log(err); console.log('\n'); });
列举对象
// 创建obsclient实例 var obsclient = new obsclient({ // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量accesskeyid和secretaccesskey。 // 前端本身没有process对象,可以使用webpack类打包工具定义环境变量,就可以在代码中运行了。 // 您可以登录访问管理控制台获取访问密钥ak/sk,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html access_key_id: process.env.accesskeyid, secret_access_key: process.env.secretaccesskey, // 这里以华北-北京四为例,其他地区请按实际情况填写 server: 'https://obs.cn-north-4.myhuaweicloud.com' }); // 使用get请求获取对象列表 var bucketname = 'bucketname'; var method = 'get'; var res = obsclient.createsignedurlsync({ method : method, bucket : bucketname, expires : 3600, }); var reopt = { method : method, url : res.signedurl, withcredentials: false, headers : res.actualsignedrequestheaders || {}, validatestatus: function(status){ return status >= 200; }, maxredirects : 0, responsetype : 'text', }; axios.request(reopt).then(function (response) { if(response.status < 300){ console.log('listing object using temporary signature succeed.'); }else{ console.log('listing object using temporary signature failed!'); console.log('status:' response.status); console.log('\n'); } console.log(response.data); console.log('\n'); }).catch(function (err) { console.log('listing object using temporary signature failed!'); console.log(err); console.log('\n'); });
删除对象
// 创建obsclient实例 var obsclient = new obsclient({ // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量accesskeyid和secretaccesskey。 // 前端本身没有process对象,可以使用webpack类打包工具定义环境变量,就可以在代码中运行了。 // 您可以登录访问管理控制台获取访问密钥ak/sk,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html access_key_id: process.env.accesskeyid, secret_access_key: process.env.secretaccesskey, // 这里以华北-北京四为例,其他地区请按实际情况填写 server: 'https://obs.cn-north-4.myhuaweicloud.com' }); // 使用delete请求删除对象 var bucketname = 'bucketname'; var objectkey = 'objectname'; var method = 'delete'; var res = obsclient.createsignedurlsync({ method : method, bucket : bucketname, key : objectkey, expires : 3600, }); var reopt = { method : method, url : res.signedurl, withcredentials: false, headers : res.actualsignedrequestheaders || {}, validatestatus: function(status){ return status >= 200; }, maxredirects : 0, responsetype : 'text', }; axios.request(reopt).then(function (response) { if(response.status < 300){ console.log('deleting object using temporary signature succeed.'); }else{ console.log('deleting object using temporary signature failed!'); console.log('status:' response.status); console.log('\n'); } console.log(response.data); console.log('\n'); }).catch(function (err) { console.log('deleting object using temporary signature failed!'); console.log(err); console.log('\n'); });
初始化分段上传任务
// 创建obsclient实例 var obsclient = new obsclient({ // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量accesskeyid和secretaccesskey。 // 前端本身没有process对象,可以使用webpack类打包工具定义环境变量,就可以在代码中运行了。 // 您可以登录访问管理控制台获取访问密钥ak/sk,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html access_key_id: process.env.accesskeyid, secret_access_key: process.env.secretaccesskey, // 这里以华北-北京四为例,其他地区请按实际情况填写 server: 'https://obs.cn-north-4.myhuaweicloud.com' }); // 使用post请求初始化分段上传任务 var bucketname = 'bucketname'; var objectkey = 'objectname'; var method = 'post'; var res = obsclient.createsignedurlsync({ method : method, bucket : bucketname, key : objectkey, expires : 3600, specialparam: "uploads" }); var reopt = { method : method, url : res.signedurl, withcredentials: false, headers : res.actualsignedrequestheaders || {}, validatestatus: function(status){ return status >= 200; }, maxredirects : 0, responsetype : 'text', }; axios.request(reopt).then(function (response) { if(response.status < 300){ console.log('initiate multipart upload using temporary signature succeed.'); }else{ console.log('initiate multipart upload using temporary signature failed!'); console.log('status:' response.status); console.log('\n'); } console.log(response.data); console.log('\n'); }).catch(function (err) { console.log('initiate multipart upload using temporary signature failed!'); console.log(err); console.log('\n'); });
上传段
// 创建obsclient实例 var obsclient = new obsclient({ // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量accesskeyid和secretaccesskey。 // 前端本身没有process对象,可以使用webpack类打包工具定义环境变量,就可以在代码中运行了。 // 您可以登录访问管理控制台获取访问密钥ak/sk,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html access_key_id: process.env.accesskeyid, secret_access_key: process.env.secretaccesskey, // 这里以华北-北京四为例,其他地区请按实际情况填写 server: 'https://obs.cn-north-4.myhuaweicloud.com' }); // 使用put请求上传段 var bucketname = 'bucketname'; var objectkey = 'objectname'; var method = 'put'; var headers = { 'content-type' : 'text/plain' } var res = obsclient.createsignedurlsync({ method : method, bucket : bucketname, key : objectkey, expires : 3600, headers: headers queryparams: { // 指定上传段的段号 'partnumber': '1', // 分段上传任务的id。任务id可以通过初始化分段上传任务生成。 'uploadid': '000001648453845dbb78f2340dd4*****', } }); var content = 'hello obs'; var reopt = { method : method, url : res.signedurl, withcredentials: false, headers : res.actualsignedrequestheaders || {}, validatestatus: function(status){ return status >= 200; }, maxredirects : 0, responsetype : 'text', data : content, }; axios.request(reopt).then(function (response) { if(response.status < 300){ console.log('upload part using temporary signature succeed.'); }else{ console.log('upload part using temporary signature failed!'); console.log('status:' response.status); console.log('\n'); } console.log(response.data); console.log('\n'); }).catch(function (err) { console.log('upload part upload using temporary signature failed!'); console.log(err); console.log('\n'); });
合并段
// 创建obsclient实例 var obsclient = new obsclient({ // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量accesskeyid和secretaccesskey。 // 前端本身没有process对象,可以使用webpack类打包工具定义环境变量,就可以在代码中运行了。 // 您可以登录访问管理控制台获取访问密钥ak/sk,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html access_key_id: process.env.accesskeyid, secret_access_key: process.env.secretaccesskey, // 这里以华北-北京四为例,其他地区请按实际情况填写 server: 'https://obs.cn-north-4.myhuaweicloud.com' }); // 使用post请求合并段 var bucketname = 'bucketname'; var objectkey = 'objectname'; var method = 'post'; var headers = { 'content-type' : 'application/xml' } var res = obsclient.createsignedurlsync({ method : method, bucket : bucketname, key : objectkey, expires : 3600, headers: headers, queryparams: { // 分段上传任务的id。任务id可以通过初始化分段上传任务生成。 'uploadid': '000001648453845dbb78f2340dd4*****', } }); var content = ""; content = " "; var reopt = { method : method, url : res.signedurl, withcredentials: false, headers : res.actualsignedrequestheaders || {}, validatestatus: function(status){ return status >= 200; }, maxredirects : 0, responsetype : 'text', data : content, }; axios.request(reopt).then(function (response) { if(response.status < 300){ console.log('complete multipart upload using temporary signature succeed.'); }else{ console.log('complete multipart upload using temporary signature failed!'); console.log('status:' response.status); console.log('\n'); } console.log(response.data); console.log('\n'); }).catch(function (err) { console.log('complete multipart upload using temporary signature failed!'); console.log(err); console.log('\n'); });"; content = " "; content = "1 "; content = "da6a0d097e307ac52ed9b4ad551801fc "; content = ""; content = " "; content = "2 "; content = "da6a0d097e307ac52ed9b4ad551801fc "; content = "

- 使用method参数指定http请求方法类型;使用expires参数指定生成的url有效期;使用headers参数指定请求的头信息;使用specialparam参数指定特殊操作符;使用queryparams参数指定请求的查询参数。
- 后端生成临时url返回的actualsignedrequestheaders可能会携带host,如果使用浏览器上传对象,则不需要配置host,即在上传时需要去掉headers中的host,否则会报错。
相关文档
意见反馈
文档内容是否对您有帮助?
如您有其它疑问,您也可以通过华为云社区问答频道来与我们联系探讨