阿里云控制台配置

1. 创建用户

oss临时授权URL如何下载java 临时授权的方式_阿里云


2. 创建角色

oss临时授权URL如何下载java 临时授权的方式_oss临时授权URL如何下载java_02


3. 创建权限策略

oss临时授权URL如何下载java 临时授权的方式_STS_03

此为权限策略的脚本,表示对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. 将权限策略赋予角色。

oss临时授权URL如何下载java 临时授权的方式_阿里云_04

5. 临时授权访问权限

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

oss临时授权URL如何下载java 临时授权的方式_阿里云_05

oss临时授权URL如何下载java 临时授权的方式_阿里云_06

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

oss临时授权URL如何下载java 临时授权的方式_json_07

脚本内容

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

这一步的意思是,新建了一个权限,这个权限的内容就是可以扮演acs?:1894xxxxxx722283:role/ramtestappreadonly这个角色。

6.用户配置

oss临时授权URL如何下载java 临时授权的方式_OSS_08

在权限管理中,将第5步创建的临时授权访问权限赋予用户,这就意味着,该用户可以扮演这个角色了。

oss临时授权URL如何下载java 临时授权的方式_oss临时授权URL如何下载java_09

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

**

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”]的值,看看是否能够修改其他文件。