使用临时URL进行授权访问
开发过程中,您有任何问题可以在github上提交issue,或者在华为云对象存储服务论坛中发帖求助。接口参考文档详细介绍了每个接口的参数和使用方法。
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 |
是 |
否 |
设置桶ACL |
PUT |
acl |
是 |
否 |
获取桶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 |
是 |
是 |
设置对象ACL |
PUT |
acl |
是 |
是 |
查看对象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服务。
以下代码展示了如何使用临时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 = "<CompleteMultipartUpload>";
content += "<Part>";
content += "<PartNumber>1</PartNumber>";
content += "<ETag>da6a0d097e307ac52ed9b4ad551801fc</ETag>";
content += "</Part>";
content += "<Part>";
content += "<PartNumber>2</PartNumber>";
content += "<ETag>da6a0d097e307ac52ed9b4ad551801fc</ETag>";
content += "</Part>";
content += "</CompleteMultipartUpload>";
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');
});
- 使用Method参数指定HTTP请求方法类型;使用Expires参数指定生成的URL有效期;使用Headers参数指定请求的头信息;使用SpecialParam参数指定特殊操作符;使用QueryParams参数指定请求的查询参数。
- 后端生成临时URL返回的ActualSignedRequestHeaders可能会携带Host,如果使用浏览器上传对象,则不需要配置Host,即在上传时需要去掉Headers中的Host,否则会报错。