Oss利用STS上传文件的全生命周期
前言
OSS
是阿里云提供的对象存储服务,可以用来存储各种文件。
上个月接到了一个需求,在一套原有的代码基础上,新增了Oss的文件上传功能。
想想这不是很轻松?然后我交给了新来的后端同事。
结果令我有点没想到,他居然是先文件穿到应用服务器,然后再上传到Oss。
这种操作方式对应用服务器的带宽压力很大,特别是大文件的时候,会需要修改php.ini的配置等等等等。并且还有内存溢出的问题。
最后不得不我自己来写了。
为此我写一份OSS的上传全流程,部分照搬了阿里的文档。
也是方便我自己以后查阅和流程巩固。
使用STS临时访问凭证访问OSS
STS(Security Token Service)临时访问凭证是一种安全机制,用于在云计算环境中提供短期的访问授权。它允许用户或服务以安全的方式获得有限的和临时的访问权限。以下是获取STS临时访问凭证的基本步骤:
身份验证:首先,用户或服务需要通过身份验证。这通常涉及提供用户名和密码,或使用现有的身份验证机制(如OAuth)。
请求临时凭证:一旦身份验证成功,用户或服务可以向STS请求临时访问凭证。这个请求通常需要包括身份验证信息和请求访问的资源或服务的详情。
定义访问策略:在请求临时凭证时,需要定义一个访问策略。这个策略规定了用户或服务可以访问哪些资源,以及可以执行哪些操作。
STS处理请求:STS收到请求后,会验证请求的合法性,并根据提供的访问策略生成一个临时访问凭证。
颁发临时凭证:一旦验证和生成完毕,STS会向请求者提供一个临时访问凭证。这个凭证通常包括访问密钥、秘密密钥和一个安全令牌。
使用临时凭证:用户或服务可以使用这个临时访问凭证来访问指定的云资源。凭证通常有时间限制,过期后将失效。
凭证过期:一旦临时访问凭证过期,用户或服务将无法再使用该凭证访问云资源。如果需要继续访问,必须重新进行身份验证并请求新的临时凭证。
通过这种方式,STS临时访问凭证提供了一种灵活且安全的方式来管理对云资源的访问,确保只有授权用户或服务才能在指定时间内访问敏感数据或功能。
sequenceDiagram participant 用户 as User (App) participant 应用服务器 as Application Server participant 身份验证系统 as Authentication System participant STS as Security Token Service participant 云资源 as Cloud Resources 用户->>身份验证系统: 提供身份验证信息(用户名和密码/OAuth等) 身份验证系统->>用户: 身份验证成功 用户->>应用服务器: 请求访问云资源 应用服务器->>STS: 请求临时访问凭证(包括身份信息和访问策略) STS->>应用服务器: 处理请求并验证合法性 STS->>应用服务器: 颁发临时访问凭证(访问密钥、秘密密钥和安全令牌) 应用服务器->>用户: 提供临时访问凭证 用户->>云资源: 使用临时凭证访问/上传数据 Note over 云资源: 凭证通常有时间限制 Note over 用户,云资源: 凭证过期后无法访问<br>需要重新进行身份验证
创建RAM用户
- 登录RAM控制台。
- 在左侧导航栏,选择身份管理>用户。
- 单击创建用户。
- 输入登录名称和显示名称。
- 在
访问方式
区域下,选择OpenAPI调用访问,然后单击确定。 - 单击复制,保存访问密钥(AccessKey ID 和 AccessKey Secret)。
为RAM用户授予请求AssumeRole的权限
- 单击已创建RAM用户右侧对应的添加权限。
- 在添加权限页面,选择AliyunSTSAssumeRoleAccess系统策略。
- 单击确定。
创建用于获取临时访问凭证的角色
- 在左侧导航栏,选择身份管理>角色。
- 单击创建角色,选择可信实体类型为阿里云账号,单击下一步。
- 在创建角色对话框,角色名称填写为
RamOssTest
(你想要的角色名称),选择信任的云账号为当前云账号。 - 单击完成。角色创建完成后,单击关闭。
- 在角色页面,搜索框输入角色名称
RamOssTest
,然后单击RamOssTest
。 - 单击ARN右侧的复制,保存角色的ARN。
为角色授予上传文件的权限
创建上传文件的自定义权限策略。
- 在左侧导航栏,选择权限管理>权限策略。
- 在权限策略页面,单击创建权限策略。
- 在创建权限策略页面,单击脚本编辑,然后在策略文档输入框中赋予角色向目标存储空间
examplebucket
下的src
以及dest
目录上传文件的权限。具体配置示例如下。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"oss:PutObject"
],
"Resource": [
"acs:oss:*:*:examplebucket/src/*",
"acs:oss:*:*:examplebucket/dest/*"
]
}
]
} - 策略配置完成后,单击继续编辑基本信息。
- 在基本信息区域,填写策略名称
为RamTestPolicy
,然后单击确定。
为RAM角色RamOssTest授予自定义权限策略
在左侧导航栏,选择身份管理 > 角色。
在角色页面,找到目标RAM角色
RamOssTest
。单击RAM角色
RamOssTest
右侧的添加权限。在添加权限页面下的自定义策略页签,选择已创建的自定义权限策略
RamTestPolicy
。单击确定。
获取临时访问凭证
使用STS SDK
安装STS SDK for PHP
1 | composer require alibabacloud/sts-20150401 |
获取 临时访问凭证
1 | try { |
- 返回结果
Key | Value | Explanation |
---|---|---|
AccessKeyId | STS.** | 临时 Access Key ID |
AccessKeySecret | **oyH6 | 临时 Secret Access Key |
Expiration | 2023-11-22 12:07:04 | Token 过期时间 |
SecurityToken | CAIS+**oyH6 | Security Token |
使用临时访问凭证上传文件并配置回调地址
流程图
sequenceDiagram participant 用户 as User/App participant OSS as Aliyun OSS participant 回调服务器 as Callback Server 用户->>OSS: 使用STS token 上传文件并设置回调地址 OSS->>回调服务器: 访问回调地址 回调服务器->>OSS: 返回处理结果 OSS->>用户: 将回调信息返回给前端
使用 OOS SDK
安装OOS SDK for PHP
1 | composer require aliyuncs/oss-sdk-php |
使用临时访问凭证上传文件+配置回调地址
1 | // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已通过环境变量设置临时访问密钥(OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET)以及安全令牌(OSS_SESSION_TOKEN)。 |
回调地址接收到的参数
- 配置路由(OSS POST 进行回调)
1
2Route::post('oss/callback', [\App\Http\Controllers\Api\V1\OssController::class, 'callback'])
->name('oss.callback'); - 回调接收方法
1
2
3
4
5
6
7
8
9
10/**
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function callback(Request $request)
{
\Log::info(['oss callback request' => $request->all()]);
// 可以将回调信息存储到数据库中 并且 返回给前端(回调方法返回的信息 会通过OSS返回到前端)
return response()->json(['code' => 200, 'message' => 'success']);
}