阿里云OSS使用STS临时授权访问

阿里云控制台配置

1. 创建用户
在这里插入图片描述
2. 创建角色
在这里插入图片描述
3. 创建权限策略
在这里插入图片描述

此为权限策略的脚本,表示对your-Bucket-name有读写权限,修改your-Bucket-name成你的Bucket。

{
   "Version": "1",
   "Statement": [{
   	"Effect": "Allow",
   	"Action": [
   		"oss:DeleteObject",
   		"oss:ListParts",
   		"oss:AbortMultipartUpload",
   		"oss:PutObject"
   	],
   	"Resource": [
   		"acs:oss:*:*:your-Bucket-name",
   		"acs:oss:*:*:your-Bucket-name/*"
   	]
   }]
}

4. 将权限策略赋予角色。

在这里插入图片描述

5. 临时授权访问权限
上面的步骤中,我们创建了用户、角色、访问权限,至此应该很容易理解,那就是角色拥有权限,用户在扮演某个角色。但是如果在用户扮演角色的时候不进行控制,那么一个用户就可以扮演任何角色了,这显然是不可以的,临时授权访问实际就是控制用户可以扮演哪些角色。每个角色都有一个ARN值,这个需要我们先记录下来,将来会用到。
查看ARN

在这里插入图片描述

然后新建策略,在Resource处填写刚才得到的ARN。

在这里插入图片描述脚本内容

{
   "Statement": [{
   	"Action": "sts:AssumeRole",
   	"Effect": "Allow",
   	"Resource": "acs:ram::1894xxxxxx722283:role/ramtestappreadonly"
   }],
   "Version": "1"
}

这一步的意思是,新建了一个权限,这个权限的内容就是可以扮演acs?:1894xxxxxx722283:role/ramtestappreadonly这个角色。
6.用户配置
在这里插入图片描述在权限管理中,将第5步创建的临时授权访问权限赋予用户,这就意味着,该用户可以扮演这个角色了。

在这里插入图片描述注意:我们好像只允许了用户可以扮演某个角色的权限,但是并没有设置具体的扮演哪个角色,这一步将在服务端代码中进行设置。
**

PHP服务端使用STS授权访问

**


require_once('aliyun-php-sdk-core/Config.php');
require_once('aliyun-oss-php-sdk-master/autoload.php');

use Sts\Request\V20150401 as Sts;
use OSS\OssClient;
use OSS\Core\OssException;
use OSS\Http\RequestCore;
use OSS\Http\ResponseCore;

$endpoint = "<在oss控制台中选择某Bucket后查看>";
$STSaccessKeyID = "<在第6步用户配置中创建并记录>";
$STSaccessKeySecret = "<在第6步用户配置中创建并记录>";
$STSroleArn = "<在第5步临时授权访问中查看>";
$bucket = "<你的bucket名称>";
$OSSfilename = "<上传到OSS的路径+文件名>";
$tokenExpire = 900;//过期时间 单位s 最小900 最大3600
//Policy的意义是仅允许用户操作bucket上传指定的文件,
//例如:我用userid当做用户头像的文件名称,当userid=1001的用户上传头像时,
//$OSSfilename = "usericon/1001.jpg",就相当于对该用户开放了写权限。
$policy = '{
	"Statement": [
		{
		"Action": [
			"oss:PutObject",
			"oss:ListParts"
		],
		"Effect": "Allow",
		"Resource": [
			"acs:oss:*:*:'.$bucket.'/'.$OSSfilename.'"
		]
		}
	],
	"Version": "1"
}';

$iClientProfile = DefaultProfile::getProfile("cn-hangzhou", $STSaccessKeyID, $STSaccessKeySecret);
$client = new DefaultAcsClient($iClientProfile);
$request = new Sts\AssumeRoleRequest();
$request->setRoleSessionName("aaa");
$request->setRoleArn($STSroleArn);	/**	这里才真正的让用户扮演了角色。**/
$request->setPolicy($policy);		/**	进一步设置用户此次请求的操作权限。**/
$request->setDurationSeconds($tokenExpire);
$response = $client->doAction($request);
$body = $response->getBody();
$content = json_decode($body);//STS临时授权凭证

//我自己封装返回结果;
$res = array();
$res['status'] = 0;
if ($response->getStatus() == 200)
{
	$res['status'] = 200;
	$res['Endpoint'] = $endpoint;
	$res['AccessKeyId'] = $content->Credentials->AccessKeyId;
	$res['AccessKeySecret'] = $content->Credentials->AccessKeySecret;
	$res['SecurityToken'] = $content->Credentials->SecurityToken;
	$res['BucketName'] = $bucket;
	$res['FileName'] = $OSSfilename;
}
echo json_encode($res);

$res的内容,客户端使用这些参数进行文件操作。

{
    "status":200,
    "Endpoint":"http://oss-cn-hangzhou.aliyuncs.com",
    "AccessKeyId":"STS.NKGc1ADSgECCSYYqM5HDhUiMr",
    "AccessKeySecret":"CihpVTTtzQeGCeVJjHwYtKPq6MLHXQuo81xKHMBcsQ4F",
    "SecurityToken":"CAISvAJ1q6Ft5B2yfSjIr4jyKIv1qYxG8oGoUX/olU1gRMtEuqzmkDz2IHhNe3VuA+0WtvowmW5Q5vkelqphWoMdsJRrrDo1vPpt6gqET9frX6XXhOV2ZvTHdEGXDxnkppGwB8zyUNLafNq0dlnAjVUd6LDmdDKkLSrHVJqSksxfc8gwVAu1ZiYkYdBNPVlGqdQGDXLLKe3XH3yMuGfLC1dysQdRkH527b/FoveR8R3Dllb3uK536I36OcqjdNI+fsU9AcWkwKlzf7bB3StZ9xlB7+BRt5dzwgv8+NOFDHspukzXaraPqoA+clAgPvBjSpQp9qasyadK3cXIjJnyxhp3OuVYbj/SXojIwrGfQLr2aohjKOajZSuQjIjfacXvzBkjZX9eMQpWe9ckI2NxAgdpVyneLaar6Ls//YRT0E7vGoABAMhh7Kf5NN5S2Kl+Qm4BbBquIprfqOsKGvfLV4wCc4D+3lU4OQaQkPFAaGG5QpSRSU5g1qe8CIAAXMY9a5s6Cf0KqbzJRjdk3d1jJyGu/Tukszarxf6OVYAZjR0NuafdkkTJ+e6civmb7T0d7Pn1iNf5BvBnRAoINb2VSEjiIbU=",
    "BucketName":"XXXXXXXXX",
    "FileName":"XXXXXXX.jpg"
}

客户端C#测试

//发起HTTP-GET请求;
static string HttpGet(string url)
{
    string result = string.Empty;
    try
    {
        HttpWebRequest wbRequest = (HttpWebRequest)WebRequest.Create(url);
        wbRequest.Method = "GET";
        HttpWebResponse wbResponse = (HttpWebResponse)wbRequest.GetResponse();
        using (Stream responseStream = wbResponse.GetResponseStream())
        {
            using (StreamReader sReader = new StreamReader(responseStream))
            {
                result = sReader.ReadToEnd();
            }
        }
    }
    catch (Exception)
    {
        return null;
    }
    return result;
}

static void Main(string[] args)
{
    //请求服务器获取STS参数;
    string res = HttpGet("http://127.0.0.1/public/STS_Test.php");
    JSONNode json = JSON.Parse(res);	//JSON对象来源于SimpleJSON库,百度下载;

    //初始化OSS;
    OssClient ossStsClient = new OssClient(json["Endpoint"], json["AccessKeyId"], json["AccessKeySecret"], json["SecurityToken"]);
    //本地文件路径;
    string localFile = "D://testImage.jpg";
    try
    {
        //上传文件;
        ossStsClient.PutObject(json["BucketName"], json["FileName"], localFile);
        Console.WriteLine("Put object succeeded");
    }
    catch (Exception ex)
    {
        Console.WriteLine("Put object failed, {0}", ex.Message);
    }
    Console.ReadKey();
}

从客户端代码可以看出,前端不用保存任何OSS的参数,每次发起请求都会生成新的AccessKeyId和AccessKeySecret,并且可以限制客户端只能修改指定文件,安全性得到了提高。
你可以尝试修改json[“FileName”]的值,看看是否能够修改其他文件。

如果要在WEB端访问STS,请看《WEB STS方式访问》

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值