场景:手机端调用阿里云视频点播sdk,需要一个临时访问权限
这是上面入口的链接
发现里面对安全授权配置方面说的不够细,根本看不懂。
后来找到了这个文档,STS临时授权访问OSS,由于不太懂视频点播和oss的关系,不知道适不适用。其实视频点播就是基于oss的。(其实再看这篇文档之前已经踩了很多坑了,这里直接按照正确的顺序给大家说一下)
但是,视频点播的权限和oss的权限是不一样的,可以看一下视频点播sts临时授权
访问,这样配置方面就做好了,然后需要记一下视频点播的区域编码和刚才创建的角色的ARN,是需要写到代码里的。
然后就是代码部分了,只能说文档里给的代码就是个坑。
先下载阿里云的php-sdk,好像有多个版本,有的已经不维护不推荐使用了,给出了新的下载方式,可以用composer直接安装。官方安装文档入口
上代码
<?php
namespace common\proxy;
use AlibabaCloud\Sts\Sts;
use PHPUnit\Framework\TestCase;
use AlibabaCloud\Client\AlibabaCloud;
use AlibabaCloud\Sts\V20150401\AssumeRole;
use AlibabaCloud\Client\Exception\ServerException;
use AlibabaCloud\Client\Exception\ClientException;
/**
* Class StsTest
*
* @package AlibabaCloud\Tests\Feature
*/
class AliyunStsProxy extends TestCase
{
/**
* @expectedException \AlibabaCloud\Client\Exception\ServerException
* @expectedExceptionMessageRegExp /EntityNotExist.Role: The specified Role not exists/
* @throws ClientException
* @throws ServerException
*/
//构建AssumeRole请求
public function Sts()
{
//构建阿里云client时需要设置AccessKey ID和AccessKey Secret
AlibabaCloud::accessKeyClient(\yii::$app->params['oss']['accessKeyId'], \yii::$app->params['oss']['accessKeySecret'])
->regionId(\yii::$app->params['vod']['region'])->asDefaultClient();
try {
$response = Sts::v20150401()
->assumeRole()
//指定角色ARN
->withRoleArn(\yii::$app->params['vod']['acs'])
//RoleSessionName即临时身份的会话名称,用于区分不同的临时身份
->withRoleSessionName(\yii::$app->params['vod']['sessionName'])
//设置权限策略以进一步限制角色的权限
->withPolicy('{
"Version": "1",
"Statement": [{
"Action": "vod:*",
"Resource": "*",
"Effect": "Allow"
}]
}')
->connectTimeout(300)
->timeout(300)
->request();
if($response->getStatusCode() == 200){
$body = $response->getBody();
$content = json_decode($body);
$ret['status'] = true;
$ret['data']['key_id'] = $content->Credentials->AccessKeyId;
$ret['data']['key_secret'] = $content->Credentials->AccessKeySecret;
$ret['data']['sts_token'] = $content->Credentials->SecurityToken;
return $ret;
}else{
$ret['status'] = false;
$ret['data'] = [];
return $ret;
}
} catch (\Exception $e) {
$ret['status'] = false;
$ret['msg'] = $e->getMessage();
$ret['data'] = [];
return $ret;
}
}
}
这样就可以获取临时的AccessKeyId、AccessKeySecret、SecurityToken了