j9九游会登录/ 对象存储服务 obs/ sdk参考/ php/ / 使用临时url进行授权访问
更新时间:2024-01-31 gmt 08:00

使用临时url进行授权访问-j9九游会登录

开发过程中,您有任何问题可以在github上,或者在中发帖求助。接口参考文档详细介绍了每个接口的参数和使用方法。

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

是

否

设置桶访问权限

put

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

是

是

设置对象访问权限

put

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字段或者传入错误的值,此时会出现跨域错误。j9九游会登录的解决方案为:content-type字段前后端保持一致。

以下代码展示了如何使用临时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->createsigned;
printf("signedurl:%s\n", $resp ['signedurl']);
$httpclient = new client(['verify' => false ]);
$content = 'your-location'; 
$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->createsigned;
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->createsigned;
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->createsigned;
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->createsigned;
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参数指定请求的查询参数。

相关文档

网站地图