您可以通过STS服务给其他用户颁发一个临时访问凭证。该用户可使用临时访问凭证在规定时间内访问您的OSS资源。临时访问凭证无需透露您的长期密钥,使您的OSS资源访问更加安全。
- 1.App用户登录。App用户和云账号无关,它是App的终端用户,App服务器支持App用户登录。对于每个有效的App用户来说,需要App服务器能定义出每个App用户的最小访问权限。
- 2.App服务器请求STS服务获取一个安全令牌(SecurityToken)。在调用STS之前,App服务器需要确定App用户的最小访问权限(用RAM Policy来自定义授权策略)以及凭证的过期时间。然后通过扮演角色(AssumeRole)来获取一个代表角色身份的安全令牌(SecurityToken)。
- 3.STS返回给App服务器一个临时访问凭证,包括一个安全令牌(SecurityToken)、临时访问密钥(AccessKeyId和AccessKeySecret)以及过期时间。
- 4.App服务器将临时访问凭证返回给App客户端,App客户端可以缓存这个凭证。当凭证失效时,App客户端需要向App服务器申请新的临时访问凭证。例如,临时访问凭证有效期为1小时,那么App客户端可以每30分钟向App服务器请求更新临时访问凭证。
- 5.App客户端使用本地缓存的临时访问凭证去请求OSS API。OSS收到访问请求后,会通过STS服务来验证访问凭证,正确响应用户请求。
步骤一:创建RAM用户
- 1.登录RAM控制台。
- 2.在左侧导航栏,选择身份管理 > 用户。
- 3.单击创建用户。
- 4.输入登录名称和显示名称。
- 5.在访问方式区域下,选择Open API 调用访问,然后单击确定。
- 6.单击复制,保存访问密钥(AccessKey ID 和 AccessKey Secret)。
步骤二:为RAM用户授予请求AssumeRole的权限
- 1.单击已创建RAM用户右侧对应的添加权限。
- 2.在添加权限页面,选择AliyunSTSAssumeRoleAccess系统策略。
-
- 3.确定
-
步骤三:创建用于获取临时访问凭证的角色
- 1.在左侧导航栏,选择身份管理 > 角色。
- 2.单击创建角色,选择可信实体类型为阿里云账号,单击下一步。
- 3.角色名称填写为RamOssTest,选择云账号为当前云账号。
- 4.单击完成。角色创建完成后,单击关闭。
- 5.在RAM角色管理页面,搜索框输入角色名称RamOssTest。
- 6.单击复制,保存角色的ARN。
-
步骤四:为角色授予上传文件的权限
- 创建上传文件的自定义权限策略。
- 在左侧导航栏,选择权限管理 > 权限策略。
- 单击创建权限策略。
- 在创建权限策略页面,单击脚本编辑,然后在策略文档输入框中赋予角色向目标存储空间examplebucket下的目录exampledir上传文件的权限。具体配置示例如下。
{ "Version": "1","Statement": [ { "Effect": "Allow","Action": [ "oss:PutObject" ],"Resource": [ "acs:oss:*:*:examplebucket/exampledir","acs:oss:*:*:examplebucket/exampledir/*" ] } ] }
- 创建上传文件的自定义权限策略。
- 策略配置完成后,单击下一步。
- 在基本信息区域,填写策略名称为RamTestPolicy,然后单击确定。
- 为RAM角色RamOssTest授予自定义权限策略。
- 在左侧导航栏,选择身份管理 > 角色。
- 在角色页面,找到目标RAM角色RamOssTest。
- 单击RAM角色RamOssTest右侧的添加权限。
- 在添加权限页面下的自定义策略页签,选择已创建的自定义权限策略RamTestPolicy。
- 单击确定。
步骤五:获取临时访问凭证
安装这个扩展 composer require alibabacloud/sdk
AlibabaCloud::accessKeyClient($config['secretId'],$config['secretKey']) ->regionId($config['region']) ->asDefaultClient(); $result = AlibabaCloud::rpc() ->product('Sts') ->scheme('https') ->version('2015-04-01') ->action('AssumeRole') ->method('POST') ->host('sts.aliyuncs.com') ->options([ 'query' => [ 'DurationSeconds'=>$config['durationSeconds'],//时长 'RoleArn'=>$config['roleArn'],//角色ARn 'RoleSessionName'=>$roleSessionName//访问名称自己定义 ],]) ->request();
前端上传测试
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Document</title>
</head>
<body>
<button id="upload">上传</button>
<input id="file" type="file" />
<!-- 导入SDK文件 -->
<script
type="text/javascript"
src="https://gosspublic.alicdn.com/aliyun-oss-sdk-6.16.0.min.js"
></script>
<script type="text/javascript">
const client = new OSS({
// yourRegion填写Bucket所在地域。以华东1(杭州)为例,yourRegion填写为oss-cn-hangzhou。
region: 'oss-cn-beijing',// 从STS服务获取的临时访问密钥(AccessKey ID和AccessKey Secret)。
accessKeyId: 'STS.NSq7wNDckxWSEfWKZyZhWUtLC',accessKeySecret: '6aT48NcdmRmovdstS9ajWNF7eYfAvWuYXCTZAFa8LpuK',// 从STS服务获取的安全令牌(SecurityToken)。
stsToken: 'CAIS/wF1q6Ft5B2yfSjIr5DEfM36qbxKz5W4R0Dmr1osVud7urHnoTz2IHpFenFoCO4avvg/lGlW7/cTlr90UIRyWUvHYM1H7ZlG6jSob4/AvfvstRPXE3VJQTr9MQXy+eOPScebJYqvV5XAQlTAkTAJstmeXD6+XlujHISUgJp8FLo+VRW5ajw0b7U/ZHEVyqkgOGDWKOymPzPzn2PUFzAIgAdnjn5l4qnNqa/1qDim1QOmlbFI+9+pc8P9P5U3Ya0SCYnlgLZEEYPayzNV5hRw86N7sbdJ4z+vvKvGWQgPu03XbbaEro0/dVEgN/kgebRNqf/njuF1ofDDXHJYbfj0o4sagAGj2hHKFF62nXLH1eiNekTizIbLYME9qmkm7lKt+9O6sh33Lbi3qaAEPNe3HimE4tYcAiMIZBK3XZWAla7yv0LeYfIXnuT4Nslgq/nH7S78tpdSiOj2BFWMUmpseQop2FZg/FpaZwuAzPdfV1a2Me8PL0/SciBeRdkTI9s23+uAgw==',bucket: 'xiaoshutest'
});
const upload = document.getElementById("upload");
const headers = {
// 指定该Object被下载时网页的缓存行为。
// 'Cache-Control': 'no-cache',// 指定该Object被下载时的名称。
// 'Content-Disposition': 'oss_download.txt',// 指定该Object被下载时的内容编码格式。
// 'Content-Encoding': 'UTF-8',// 指定过期时间。
// 'Expires': 'Wed,08 Jul 2022 16:57:01 GMT',// 指定Object的存储类型。
// 'x-oss-storage-class': 'Standard',// 指定Object的访问权限。
// 'x-oss-object-acl': 'private',// 设置Object的标签,可同时设置多个标签。
// 'x-oss-tagging': 'Tag1=1&Tag2=2',// 指定CopyObject操作时是否覆盖同名目标Object。此处设置为true,表示禁止覆盖同名Object。
// 'x-oss-forbid-overwrite': 'true',};
async function putObject () {
try {
const data = document.getElementById("file").files[0];
console.log(data);
console.log(222);
// 填写Object完整路径。Object完整路径中不能包含Bucket名称。
// 您可以通过自定义文件名(例如exampleobject.txt)或文件完整路径(例如exampledir/exampleobject.txt)的形式实现将数据上传到当前Bucket或Bucket中的指定目录。
// data对象可以自定义为file对象、Blob数据或者OSS Buffer。
const result = await client.put(
"/exampleobject22.png",data
//{headers}
);
console.log(result);
} catch (e) {
console.log(2);
console.log(e);
}
}
upload.addEventListener("click",() => {
putObject();
});
</script>
</body>
</html>
如果前端上传的时候又跨域的问题在这里设置
官方文档https://help.aliyun.com/document_detail/100624.html?spm=5176.8466032.help.dexternal.739f1450FwuC0e