使用临时URL进行授权访问
开发过程中,您有任何问题可以在github上提交issue,或者在华为云对象存储服务论坛中发帖求助。接口参考文档详细介绍了每个接口的参数和使用方法。
OBS客户端支持通过访问密钥、请求方法类型、请求参数等信息生成一个在Query参数中携带鉴权信息的URL,可将该URL提供给其他用户进行临时访问。在生成URL时,您需要指定URL的有效期来限制访客用户的访问时长。
如果您想授予其他用户对桶或对象临时进行其他操作的权限(例如上传或下载对象),则需要生成带对应请求的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的步骤如下:
- 通过ObsClient->createSignedUrl生成带签名信息的URL。
- 使用任意HTTP库发送HTTP/HTTPS请求,访问OBS服务。
以下代码展示了如何使用临时URL进行授权访问,包括:创建桶、上传对象、下载对象、列举对象、删除对象。
创建桶
// 引入依赖库
require 'vendor/autoload.php';
// 使用源码安装时引入SDK代码库
// require 'obs-autoloader.php';
// 声明命名空间
use Obs\ObsClient;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\ClientException;
// 创建ObsClient实例
$obsClient = new ObsClient ( [
//推荐通过环境变量获取AKSK,这里也可以使用其他外部引入方式传入,如果使用硬编码可能会存在泄露风险。
//您可以登录访问管理控制台获取访问密钥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 ]);
$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 (ClientException $ex){
printf("%s using temporary signature url:\n", 'Create bucket');
printf("\t%s failed!\n", $url);
printf('Exception message:%s', $ex ->getMessage());
}
上传对象
// 引入依赖库
require 'vendor/autoload.php';
// 使用源码安装时引入SDK代码库
// require 'obs-autoloader.php';
// 声明命名空间
use Obs\ObsClient;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\ClientException;
// 创建ObsClient实例
$obsClient = new ObsClient ( [
//推荐通过环境变量获取AKSK,这里也可以使用其他外部引入方式传入,如果使用硬编码可能会存在泄露风险。
//您可以登录访问管理控制台获取访问密钥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 ]);
$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 (ClientException $ex){
printf("%s using temporary signature url:\n", 'Put object');
printf("\t%s failed!\n", $url);
printf('Exception message:%s', $ex ->getMessage());
}
下载对象
// 引入依赖库
require 'vendor/autoload.php';
// 使用源码安装时引入SDK代码库
// require 'obs-autoloader.php';
// 声明命名空间
use Obs\ObsClient;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\ClientException;
// 创建ObsClient实例
$obsClient = new ObsClient ( [
//推荐通过环境变量获取AKSK,这里也可以使用其他外部引入方式传入,如果使用硬编码可能会存在泄露风险。
//您可以登录访问管理控制台获取访问密钥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 ]);
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 (ClientException $ex){
printf("%s using temporary signature url:\n", 'Get object');
printf("\t%s failed!\n", $url);
printf('Exception message:%s', $ex ->getMessage());
}
列举对象
// 引入依赖库
require 'vendor/autoload.php';
// 使用源码安装时引入SDK代码库
// require 'obs-autoloader.php';
// 声明命名空间
use Obs\ObsClient;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\ClientException;
// 创建ObsClient实例
$obsClient = new ObsClient ( [
//推荐通过环境变量获取AKSK,这里也可以使用其他外部引入方式传入,如果使用硬编码可能会存在泄露风险。
//您可以登录访问管理控制台获取访问密钥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 ]);
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 (ClientException $ex){
printf("%s using temporary signature url:\n", 'List objects');
printf("\t%s failed!\n", $url);
printf('Exception message:%s', $ex ->getMessage());
}
删除对象
// 引入依赖库
require 'vendor/autoload.php';
// 使用源码安装时引入SDK代码库
// require 'obs-autoloader.php';
// 声明命名空间
use Obs\ObsClient;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\ClientException;
// 创建ObsClient实例
$obsClient = new ObsClient ( [
//推荐通过环境变量获取AKSK,这里也可以使用其他外部引入方式传入,如果使用硬编码可能会存在泄露风险。
//您可以登录访问管理控制台获取访问密钥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 ]);
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 (ClientException $ex){
printf("%s using temporary signature url:\n", 'Delete object');
printf("\t%s failed!\n", $url);
printf('Exception message:%s', $ex ->getMessage());
}
使用Method参数指定HTTP请求方法类型;使用Expires参数指定生成的URL有效期;使用Headers参数指定请求的头信息;使用SpecialParam参数指定特殊操作符;使用QueryParams参数指定请求的查询参数。