文档首页/ 对象存储服务 OBS/ SDK参考/ PHP/ 临时授权访问/ 使用临时URL进行授权访问
更新时间:2026-09-18 GMT+08:00

使用临时URL进行授权访问

开发过程中,您有任何问题可以在GitHub上提交issue。接口参考文档详细介绍了每个接口的参数和使用方法。

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服务。

如果遇到跨域报错、签名不匹配问题,请参考以下步骤排查问题:

  1. 未配置跨域,需要在控制台配置CORS规则,请参考配置桶允许跨域请求。
  2. 签名计算问题,请参考URL中携带签名排查签名参数是否正确;比如在上传对象时,后端将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/intl/zh-cn/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/intl/zh-cn/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/intl/zh-cn/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/intl/zh-cn/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/intl/zh-cn/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();    
}

使用Method参数指定HTTP请求方法类型;使用Expires参数指定生成的URL有效期;使用Headers参数指定请求的头信息;使用SpecialParam参数指定特殊操作符;使用QueryParams参数指定请求的查询参数。