
# 使用临时URL进行授权访问
![](https://support.huaweicloud.com/sdk-browserjs-devg-obs/public_sys-resources/notice_3.0-zh-cn.png)
开发过程中，您有任何问题可以在github上[提交issue](https://github.com/huaweicloud/huaweicloud-sdk-browserjs-obs/issues)，或者在[华为云对象存储服务论坛](https://bbs.huaweicloud.com/forum/forum-620-1.html)中发帖求助。[接口参考文档](https://support.huaweicloud.com/api-obs_browserjs_sdk_api_zh/obs_34_0001.html)详细介绍了每个接口的参数和使用方法。
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的步骤如下：
1. 通过ObsClient.createSignedUrlSync生成带签名信息的URL。
2. 使用任意HTTP库发送HTTP/HTTPS请求，访问OBS服务。
![](https://support.huaweicloud.com/sdk-browserjs-devg-obs/public_sys-resources/caution_3.0-zh-cn.png)
如果遇到跨域报错、签名不匹配问题，请参考以下步骤排查问题：
1. 未配置跨域，需要在控制台配置CORS规则，请参考[配置桶允许跨域请求](https://support.huaweicloud.com/sdk-browserjs-devg-obs/obs_24_0107.html)。
2. 签名计算问题，请参考[URL中携带签名](https://support.huaweicloud.com/api-obs/obs_04_0011.html)排查签名参数是否正确；比如上传对象功能，后端将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请求库为例
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请求库为例
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请求库为例
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请求库为例
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请求库为例
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请求库为例
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 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请求库为例
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');
});
```
![](https://support.huaweicloud.com/sdk-browserjs-devg-obs/public_sys-resources/note_3.0-zh-cn.png)
1. 使用Method参数指定HTTP请求方法类型；使用Expires参数指定生成的URL有效期；使用Headers参数指定请求的头信息；使用SpecialParam参数指定特殊操作符；使用QueryParams参数指定请求的查询参数。
2. 后端生成临时URL返回的ActualSignedRequestHeaders可能会携带Host，如果使用浏览器上传对象，则不需要配置Host，即在上传时需要去掉Headers中的Host，否则会报错。
 
