
# 使用临时URL进行授权访问
![](https://support.huaweicloud.com/sdk-php-devg-obs/public_sys-resources/notice_3.0-zh-cn.png)
开发过程中，您有任何问题可以在GitHub上[提交issue](https://github.com/huaweicloud/huaweicloud-sdk-php-obs/issues)，或者在[华为云对象存储服务论坛](https://bbs.huaweicloud.com/forum/forum-620-1.html)中发帖求助。[接口参考文档](https://support.huaweicloud.com/api-obs_php_sdk_api_zh/obs_38_0001.html)详细介绍了每个接口的参数和使用方法。
OBS客户端支持通过访问密钥、请求方法类型、请求参数等信息生成一个在Query参数中携带鉴权信息的URL，可将该URL提供给其他用户进行临时访问。在生成URL时，您需要指定URL的有效期来限制第三方用户的访问时长。
如果您想授予其他用户对桶或对象进行临时操作的权限（例如上传或下载对象），则需要生成对应HTTP方法的URL（例如生成PUT请求的URL用于上传对象），将该URL提供给其他用户。
通过该方式可支持的操作以及相关信息见下表：
| **操作名**   | **HTTP请求方法** | **特殊操作符** **（子资源）** | **是否需要桶名** | **是否需要对象名** |
|:---|:---|:---|:---|:---|
| 创建桶       | PUT          | N/A                 | 是          | 否           |
| 获取桶列表     | GET          | N/A                 | 否          | 否           |
| 删除桶       | DELETE       | N/A                 | 是          | 否           |
| 列举桶内对象    | 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          | 是          | 否           |
| 设置跨域规则    | PUT          | cors                | 是          | 否           |
| 查看跨域规则    | GET          | cors                | 是          | 否           |
| 删除跨域规则    | DELETE       | cors                | 是          | 否           |
| OPTIONS桶  | OPTIONS      | N/A                 | 是          | 否           |
| 设置桶标签     | PUT          | tagging             | 是          | 否           |
| 查看桶标签     | GET          | tagging             | 是          | 否           |
| 删除桶标签     | DELETE       | tagging             | 是          | 否           |
| 上传对象      | PUT          | N/A                 | 是          | 是           |
| 下载对象      | 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                 | 是          | 是           |
| OPTIONS对象 | OPTIONS      | N/A                 | 是          | 是           |
| 恢复归档存储对象  | POST         | restore             | 是          | 是           |
   
通过OBS PHP SDK生成临时URL访问OBS的步骤如下：
1. 通过ObsClient-\>createSignedUrl生成带签名信息的URL。
2. 使用任意HTTP库发送HTTP/HTTPS请求，访问OBS服务。
![](https://support.huaweicloud.com/sdk-php-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字段在前后端保持一致。
3. 签名 URL 中包含鉴权信息，请勿在公开日志中输出完整 URL
 
以下代码展示了如何使用临时URL进行授权访问，包括：创建桶、上传对象、下载对象、列举对象、删除对象。
#### 创建桶
```
<?php
// 引入依赖库
require 'vendor/autoload.php';
// 使用源码安装时引入SDK代码库
// require 'obs-autoloader.php';
// 声明命名空间
use Obs\ObsClient;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\ClientException;
// 创建ObsClient实例
$obsClient = new ObsClient([ 
    //推荐通过环境变量获取访问密钥AK/SK，这里也可以使用其他外部引入方式传入，如果使用硬编码可能会存在泄露风险。
    //您可以登录访问管理控制台获取访问密钥AK/SK，获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html
    'key' => getenv('ACCESS_KEY_ID'),
    'secret' => getenv('SECRET_ACCESS_KEY'),
    'endpoint' => 'https://your-endpoint',
    'signature' => 'obs'
]);
// URL有效期，3600秒
$expires = 3600;
// 创建桶
$resp = $obsClient->createSignedUrl([ 
    'Method' => 'PUT',
    'Bucket' => 'bucketname',
    'Expires' => $expires
]);printf("SignedUrl:%s\n", $resp['SignedUrl']);
$httpClient = new Client(['verify' => false]); // 仅用于测试环境，生产环境请启用 SSL 验证
$content = '<CreateBucketConfiguration><LocationConstraint>your-location</LocationConstraint></CreateBucketConfiguration>'; 
$url = $resp['SignedUrl'];
try {
       $response = $httpClient->request('PUT', $url, ['body' => $content, 'headers'=> $resp['ActualSignedRequestHeaders']]);
       printf("%s using temporary signature url:\n", 'Create bucket');
       printf("\t%s successfully.\n", $url);
       printf("\tStatus:%d\n", $response->getStatusCode());
       printf("\tContent:%s\n", $response->getBody()->getContents());
       $response->getBody()-> close();
} catch(Exception $ex) {
       printf("%s using temporary signature url:\n", 'Create bucket');
       printf("\t%s failed!\n", $url);
       printf('Exception message:%s\n', $ex ->getMessage());
} finally {
       $response->getBody()->close();    
}
```
#### 上传对象
```
<?php
// 引入依赖库
require 'vendor/autoload.php';
// 使用源码安装时引入SDK代码库
// require 'obs-autoloader.php';
// 声明命名空间
use Obs\ObsClient;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\ClientException;
// 创建ObsClient实例
$obsClient = new ObsClient([ 
    //推荐通过环境变量获取访问密钥AK/SK，这里也可以使用其他外部引入方式传入，如果使用硬编码可能会存在泄露风险。
    //您可以登录访问管理控制台获取访问密钥AK/SK，获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html
    'key' => getenv('ACCESS_KEY_ID'),
    'secret' => getenv('SECRET_ACCESS_KEY'),
    'endpoint' => 'https://your-endpoint',
    'signature' => 'obs'
]);
// URL有效期，3600秒
$expires = 3600;
// 上传对象
$resp = $obsClient->createSignedUrl([ 
    'Method' => 'PUT',
    'Bucket' => 'bucketname',
    'Key' => 'objectname',
    'Expires' => $expires
]);printf("SignedUrl:%s\n", $resp['SignedUrl']);
$url = $resp['SignedUrl'];
$httpClient = new Client(['verify' => false]); // 仅用于测试环境，生产环境请启用 SSL 验证
$content = 'Hello OBS'; 
try {
       $response = $httpClient->request('PUT', $url, ['body' => $content, 'headers'=> $resp['ActualSignedRequestHeaders']]);
       printf("%s using temporary signature url:\n", 'Put object');
       printf("\t%s successfully.\n", $url);
       printf("\tStatus:%d\n", $response->getStatusCode());
       printf("\tContent:%s\n", $response->getBody()->getContents());
       $response->getBody()-> close();
} catch(Exception $ex) {
       printf("%s using temporary signature url:\n", 'Put object');
       printf("\t%s failed!\n", $url);
       printf('Exception message:%s\n', $ex ->getMessage());
} finally {
       $response->getBody()->close();    
}
```
#### 下载对象
```
<?php
// 引入依赖库
require 'vendor/autoload.php';
// 使用源码安装时引入SDK代码库
// require 'obs-autoloader.php';
// 声明命名空间
use Obs\ObsClient;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\ClientException;
// 创建ObsClient实例
$obsClient = new ObsClient([ 
    //推荐通过环境变量获取访问密钥AK/SK，这里也可以使用其他外部引入方式传入，如果使用硬编码可能会存在泄露风险。
    //您可以登录访问管理控制台获取访问密钥AK/SK，获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html
    'key' => getenv('ACCESS_KEY_ID'),
    'secret' => getenv('SECRET_ACCESS_KEY'),
    'endpoint' => 'https://your-endpoint',
    'signature' => 'obs'
]);
// URL有效期，3600秒
$expires = 3600;
// 下载对象
$resp = $obsClient->createSignedUrl([ 
    'Method' => 'GET',
    'Bucket' => 'bucketname',
    'Key' => 'objectname',
    'Expires' => $expires
]);printf("SignedUrl:%s\n", $resp['SignedUrl']);
$url = $resp['SignedUrl'];
$httpClient = new Client(['verify' => false]); // 仅用于测试环境，生产环境请启用 SSL 验证
 
try {
       $response = $httpClient->request('GET', $url, ['headers'=> $resp['ActualSignedRequestHeaders']]);
       printf("%s using temporary signature url:\n", 'Get object');
       printf("\t%s successfully.\n", $url);
       printf("\tStatus:%d\n", $response->getStatusCode());
       printf("\tContent:%s\n", $response->getBody()->getContents());
       $response->getBody()-> close();
} catch(Exception $ex) {
       printf("%s using temporary signature url:\n", 'Get object');
       printf("\t%s failed!\n", $url);
       printf('Exception message:%s\n', $ex ->getMessage());
} finally {
       $response->getBody()->close();    
}
```
#### 列举对象
```
<?php
// 引入依赖库
require 'vendor/autoload.php';
// 使用源码安装时引入SDK代码库
// require 'obs-autoloader.php';
// 声明命名空间
use Obs\ObsClient;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\ClientException;
// 创建ObsClient实例
$obsClient = new ObsClient([ 
    //推荐通过环境变量获取访问密钥AK/SK，这里也可以使用其他外部引入方式传入，如果使用硬编码可能会存在泄露风险。
    //您可以登录访问管理控制台获取访问密钥AK/SK，获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html
    'key' => getenv('ACCESS_KEY_ID'),
    'secret' => getenv('SECRET_ACCESS_KEY'),
    'endpoint' => 'https://your-endpoint',
    'signature' => 'obs'
]);
// URL有效期，3600秒
$expires = 3600;
// 列举对象
$resp = $obsClient->createSignedUrl([ 
    'Method' => 'GET',
    'Bucket' => 'bucketname',
    'Expires' => $expires
]);printf("SignedUrl:%s\n", $resp['SignedUrl']);
$url = $resp['SignedUrl'];
$httpClient = new Client(['verify' => false]); // 仅用于测试环境，生产环境请启用 SSL 验证
 
try {
       $response = $httpClient->request('GET', $url, ['headers'=> $resp['ActualSignedRequestHeaders']]);
       printf("%s using temporary signature url:\n", 'List objects');
       printf("\t%s successfully.\n", $url);
       printf("\tStatus:%d\n", $response->getStatusCode());
       printf("\tContent:%s\n", $response->getBody()->getContents());
       $response->getBody()-> close();
} catch(Exception $ex) {
       printf("%s using temporary signature url:\n", 'List objects');
       printf("\t%s failed!\n", $url);
       printf('Exception message:%s\n', $ex ->getMessage());
} finally {
       $response->getBody()->close();    
}
```
#### 删除对象
```
<?php
// 引入依赖库
require 'vendor/autoload.php';
// 使用源码安装时引入SDK代码库
// require 'obs-autoloader.php';
// 声明命名空间
use Obs\ObsClient;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\ClientException;
// 创建ObsClient实例
$obsClient = new ObsClient([ 
    //推荐通过环境变量获取访问密钥AK/SK，这里也可以使用其他外部引入方式传入，如果使用硬编码可能会存在泄露风险。
    //您可以登录访问管理控制台获取访问密钥AK/SK，获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html
    'key' => getenv('ACCESS_KEY_ID'),
    'secret' => getenv('SECRET_ACCESS_KEY'),
    'endpoint' => 'https://your-endpoint',
    'signature' => 'obs'
]);
// URL有效期，3600秒
$expires = 3600;
// 删除对象
$resp = $obsClient->createSignedUrl([ 
    'Method' => 'DELETE',
    'Bucket' => 'bucketname',
    'Key' => 'objectname',
    'Expires' => $expires
]);printf("SignedUrl:%s\n", $resp['SignedUrl']);
$url = $resp['SignedUrl'];
$httpClient = new Client(['verify' => false]); // 仅用于测试环境，生产环境请启用 SSL 验证
 
try {
       $response = $httpClient->request('DELETE', $url, ['headers'=> $resp['ActualSignedRequestHeaders']]);
       printf("%s using temporary signature url:\n", 'Delete object');
       printf("\t%s successfully.\n", $url);
       printf("\tStatus:%d\n", $response->getStatusCode());
       printf("\tContent:%s\n", $response->getBody()->getContents());
       $response->getBody()-> close();
} catch(Exception $ex) {
       printf("%s using temporary signature url:\n", 'Delete object');
       printf("\t%s failed!\n", $url);
       printf('Exception message:%s\n', $ex ->getMessage());
} finally {
    $response->getBody()->close();
    $obsClient -> close();    
}
```
![](https://support.huaweicloud.com/sdk-php-devg-obs/public_sys-resources/note_3.0-zh-cn.png)
使用**Method参数** 指定HTTP请求方法类型；使用**Expires参数** 指定生成的URL有效期；使用**Headers参数** 指定请求的头信息；使用**SpecialParam参数** 指定特殊操作符；使用**QueryParams参数**指定请求的查询参数。
