本文介绍如何使用STS以及签名URL临时授权访问OSS资源。
说明 由于STS临时账号以及签名URL均需设置有效时长,当您使用STS临时账号生成签名URL执行相关操作(例如上传、下载文件)时,以最小的有效时长为准。例如您的STS临时账号的有效时长设置为1200秒、签名URL设置为3600秒时,当有效时长超过1200秒后,您无法使用此STS临时账号生成的签名URL上传文件。
使用STS进行临时授权
OSS可以通过阿里云STS (Security Token Service) 进行临时授权访问。阿里云STS是为云计算用户提供临时访问令牌的Web服务。通过STS,您可以为第三方应用或子用户(即用户身份由您自己管理的用户)颁发一个自定义时效和权限的访问凭证。关于STS的更多信息,请参见STS介绍。
STS的优势如下:
- 您无需透露您的长期密钥(AccessKey)给第三方应用,只需生成一个访问令牌并将令牌交给第三方应用。您可以自定义这个令牌的访问权限及有效期限。
- 您无需关心权限撤销问题,访问令牌过期后自动失效。
使用STS访问OSS的流程请参见开发指南中的使用STS临时访问凭证访问OSS。
以下代码用于使用STS临时授权上传文件。
说明 您可以通过调用STS服务
AssumeRole接口或者使用
各语言STS SDK来获取临时访问凭证。临时访问凭证包括临时访问密钥(AccessKeyId和AccessKeySecret)和安全令牌(SecurityToken)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | <?php if (is_file(__DIR__ . '/../autoload.php' )) { require_once __DIR__ . '/../autoload.php' ; } if (is_file(__DIR__ . '/../vendor/autoload.php' )) { require_once __DIR__ . '/../vendor/autoload.php' ; } use OSS\OssClient; use OSS\Core\OssException; // 从STS服务获取的临时访问密钥(AccessKey ID和AccessKey Secret)。 $accessKeyId = "<var class=" keyword varname " id=" varname-ekx-gib-ieu ">yourAccessKeyId</var>" ; $accessKeySecret = "<var class=" keyword varname " id=" varname-bz4-n3q-s4a ">yourAccessKeySecret</var>" ; // 从STS服务获取的安全令牌(SecurityToken)。 $securityToken = "<var class=" keyword varname " id=" varname-pz7-1tv-8yn ">yourSecurityToken</var>" ; // <var class="keyword varname" id="varname-ot7-r19-u51">yourEndpoint</var>填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。 $endpoint = "<var class=" keyword varname " id=" varname-60x-od9-w2s ">yourEndpoint</var>" ; // 填写Bucket名称。 $bucket= "examplebucket" ; // 填写不包含Bucket名称在内的Object完整路径。 $object = "exampleobject.txt" ; // 填写上传的字符串。 $content = "Hello OSS" ; try { $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint, false , $securityToken); // 使用STS临时授权上传文件。 $ossClient->putObject($bucket, $object, $content); } catch (OssException $e) { print $e->getMessage(); } |
使用签名URL进行临时授权
您可以将生成的签名URL提供给访客进行临时访问。生成签名URL时,您可以通过指定URL的过期时间来限制访客的访问时长。
授权访问的完整代码请参见GitHub。
- 生成上传的签名URL
以下代码用于生成上传(PutObject)的签名URL,并使用生成的签名URL上传文件。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455<?php
if
(is_file(__DIR__ .
'/../autoload.php'
)) {
require_once __DIR__ .
'/../autoload.php'
;
}
if
(is_file(__DIR__ .
'/../vendor/autoload.php'
)) {
require_once __DIR__ .
'/../vendor/autoload.php'
;
}
use OSS\OssClient;
use OSS\Core\OssException;
use OSS\Http\RequestCore;
use OSS\Http\ResponseCore;
// 从STS服务获取的临时访问密钥(AccessKey ID和AccessKey Secret)。
$accessKeyId =
"<var class="
keyword varname
" id="
varname-wy5-1le-i4b
">yourAccessKeyId</var>"
;
$accessKeySecret =
"<var class="
keyword varname
" id="
varname-net-4uj-za6
">yourAccessKeySecret</var>"
;
// 从STS服务获取的安全令牌(SecurityToken)。
$securityToken =
"<var class="
keyword varname
" id="
varname-s2i-xsz-gy0
">yourSecurityToken</var>"
;
// <var class="keyword varname" id="varname-xqk-pxs-oit">yourEndpoint</var>填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
$endpoint =
"<var class="
keyword varname
" id="
varname-1xt-puz-j8w
">yourEndpoint</var>"
;
// 填写Bucket名称。
$bucket=
"examplebucket"
;
// 填写不包含Bucket名称在内的Object完整路径。
$object =
"exampleobject.txt"
;
// 设置签名URL的有效时长为3600秒。
$timeout =
3600
;
try
{
$ossClient =
new
OssClient($accessKeyId, $accessKeySecret, $endpoint,
false
, $securityToken);
// 生成签名URL。
$signedUrl = $ossClient->signUrl($bucket, $object, $timeout,
"PUT"
);
}
catch
(OssException $e) {
printf(__FUNCTION__ .
": FAILED\n"
);
printf($e->getMessage() .
"\n"
);
return
;
}
print(__FUNCTION__ .
": signedUrl: "
. $signedUrl .
"\n"
);
// 使用签名URL上传文件。
// 填写上传的字符串。
$content =
"Hello OSS"
;
$request =
new
RequestCore($signedUrl);
// 生成的签名URL以PUT的方式访问。
$request->set_method(
'PUT'
);
$request->add_header(
'Content-Type'
,
''
);
$request->add_header(
'Content-Length'
, strlen($content));
$request->set_body($content);
$request->send_request();
$res =
new
ResponseCore($request->get_response_header(),
$request->get_response_body(), $request->get_response_code());
if
($res->isOK()) {
print(__FUNCTION__ .
": OK"
.
"\n"
);
}
else
{
print(__FUNCTION__ .
": FAILED"
.
"\n"
);
};
- 生成下载的签名URL
以下代码用于生成下载文件(GetObject)的签名URL,并使用生成的签名URL下载文件。
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950<?php
if
(is_file(__DIR__ .
'/../autoload.php'
)) {
require_once __DIR__ .
'/../autoload.php'
;
}
if
(is_file(__DIR__ .
'/../vendor/autoload.php'
)) {
require_once __DIR__ .
'/../vendor/autoload.php'
;
}
use OSS\OssClient;
use OSS\Core\OssException;
use OSS\Http\RequestCore;
use OSS\Http\ResponseCore;
// 从STS服务获取的临时访问密钥(AccessKey ID和AccessKey Secret)。
$accessKeyId =
"<var class="
keyword varname
" id="
varname-zz6-6x7-sfb
">yourAccessKeyId</var>"
;
$accessKeySecret =
"<var class="
keyword varname
" id="
varname-bvu-q2v-m55
">yourAccessKeySecret</var>"
;
// 从STS服务获取的安全令牌(SecurityToken)。
$securityToken =
"<var class="
keyword varname
" id="
varname-u4k-02f-qgx
">yourSecurityToken</var>"
;
// <var class="keyword varname" id="varname-u46-a04-l5b">yourEndpoint</var>填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
$endpoint =
"<var class="
keyword varname
" id="
varname-sba-v59-gtg
">yourEndpoint</var>"
;
// 填写Bucket名称。
$bucket=
"examplebucket"
;
// 填写不包含Bucket名称在内的Object完整路径。
$object =
"exampleobject.txt"
;
// 设置签名URL的有效时长为3600秒。
$timeout =
3600
;
try
{
$ossClient =
new
OssClient($accessKeyId, $accessKeySecret, $endpoint,
false
, $securityToken);
// 生成GetObject的签名URL。
$signedUrl = $ossClient->signUrl($bucket, $object, $timeout);
}
catch
(OssException $e) {
printf(__FUNCTION__ .
": FAILED\n"
);
printf($e->getMessage() .
"\n"
);
return
;
}
print(__FUNCTION__ .
": signedUrl: "
. $signedUrl .
"\n"
);
// 您可以使用代码来访问签名URL,也可以输入到浏览器地址栏中进行访问。
$request =
new
RequestCore($signedUrl);
// 生成的签名URL默认以GET方式访问。
$request->set_method(
'GET'
);
$request->add_header(
'Content-Type'
,
''
);
$request->send_request();
$res =
new
ResponseCore($request->get_response_header(), $request->get_response_body(), $request->get_response_code());
if
($res->isOK()) {
print(__FUNCTION__ .
": OK"
.
"\n"
);
}
else
{
print(__FUNCTION__ .
": FAILED"
.
"\n"
);
};