使用STS临时访问凭证访问OSS
假设您是一个移动App开发者,希望使用阿里云OSS服务来保存App的终端用户数据,并且要保证每个App用户之间的数据隔离。此时,您可以使用STS授权用户直接访问OSS。
目录
- App用户登录。App用户和云账号无关,它是App的终端用户,App服务器支持App用户登录。对于每个有效的App用户来说,需要App服务器能定义出每个App用户的最小访问权限。
- App服务器请求STS服务获取一个安全令牌(SecurityToken)。在调用STS之前,App服务器需要确定App用户的最小访问权限(用RAM Policy来自定义授权策略)以及凭证的过期时间。然后通过扮演角色(AssumeRole)来获取一个代表角色身份的安全令牌(SecurityToken)。
- STS返回给App服务器一个临时访问凭证,包括一个安全令牌(SecurityToken)、临时访问密钥(AccessKeyId和AccessKeySecret)以及过期时间。
- App服务器将临时访问凭证返回给App客户端,App客户端可以缓存这个凭证。当凭证失效时,App客户端需要向App服务器申请新的临时访问凭证。例如,临时访问凭证有效期为1小时,那么App客户端可以每30分钟向App服务器请求更新临时访问凭证。
- App客户端使用本地缓存的临时访问凭证去请求OSS API。OSS收到访问请求后,会通过STS服务来验证访问凭证,正确响应用户请求。
一、DEMO项目文件截图
二、DEMO项目代码片段
application.properties
#阿里云访问控制RAM子账户信息,需要登录阿里云控制台查看(Secret只在创建时可查看,需要做好备份)
aliyun.oss.accessKeyId=LTAI5xxxxxxxxxxxxxxx
aliyun.oss.accessKeySecret=KqfbKGA4xxxxxxxxxxxxxxx
#角色ID,在角色中进行授权,获取相应的权限
aliyun.sts.roleArn=acs:ram::1481594054055183:role/ramosstest
#指临时凭证的名称,一般来说建议使用不同的应用程序用户来区分。自定义(可不设置)
aliyun.sts.roleSessionName=RamOssTest
pom.xml
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--添加aliyun-java-sdk的相关依赖 start-->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-sts</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>3.5.0</version>
</dependency>
<!--添加aliyun-java-sdk的相关依赖 end-->
StsTokenVO.java
package com.csdn.vo;
import lombok.Data;
import java.io.Serializable;
/**
* 获取Token返回结果
*/
@Data
public class StsTokenVO implements Serializable {
/**
* 访问密钥标识
*/
private String accessKeyId;
/**
* 访问密钥
*/
private String accessKeySecret;
/**
* 安全令牌
*/
private String securityToken;
}
StsTokenService.java
package com.csdn.service;
import com.csdn.vo.StsTokenVO;
public interface StsTokenService {
/**
* 获取STS token接口
*
* @return StsTokenVO
*/
StsTokenVO getStsToken();
}
StsTokenServiceImpl.java
package com.csdn.service;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.aliyuncs.sts.model.v20150401.AssumeRoleRequest;
import com.aliyuncs.sts.model.v20150401.AssumeRoleResponse;
import com.csdn.vo.StsTokenVO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
@Service
public class StsTokenServiceImpl implements StsTokenService {
private static final Logger LOGGER = LoggerFactory.getLogger(StsTokenServiceImpl.class);
@Value("${aliyun.oss.accessKeyId}")
private String accessKeyId;
@Value("${aliyun.oss.accessKeySecret}")
private String accessKeySecret;
@Value("${aliyun.sts.roleArn}")
private String roleArn;
@Value("${aliyun.sts.roleSessionName}")
private String roleSessionName;
/**
* token失效时间,单位秒(不设置默认60封装,这里设置5分钟)
*/
private static final Long durationSeconds = 300L;
private static final String ENDPOINT = "sts.aliyuncs.com";
/**
* 获取STStoken接口
*
* @param:
* @return: StsTokenVO
*/
@Override
public StsTokenVO getStsToken() {
StsTokenVO tokenVO = new StsTokenVO();
try {
// 添加endpoint(直接使用STS endpoint,前两个参数留空,无需添加region ID)
DefaultProfile.addEndpoint("", "", "Sts", ENDPOINT);
// 构造default profile(参数留空,无需添加region ID)
IClientProfile profile = DefaultProfile.getProfile("", accessKeyId, accessKeySecret);
// 用profile构造client
DefaultAcsClient client = new DefaultAcsClient(profile);
final AssumeRoleRequest request = new AssumeRoleRequest()
request.setMethod(MethodType.POST);
request.setRoleArn(roleArn);
request.setRoleSessionName(roleSessionName);
// request.setDurationSeconds(durationSeconds);
// 针对该临时权限可以根据该属性赋予规则,格式为json,没有特殊要求,默认为空
// request.setPolicy(policy); // Optional
final AssumeRoleResponse response = client.getAcsResponse(request);
AssumeRoleResponse.Credentials credentials = response.getCredentials();
tokenVO.setAccessKeyId(credentials.getAccessKeyId());
tokenVO.setAccessKeySecret(credentials.getAccessKeySecret());
tokenVO.setSecurityToken(credentials.getSecurityToken());
return tokenVO;
} catch (ClientException e) {
LOGGER.error("获取阿里云STS临时授权权限失败,错误信息:" + e);
return null;
}
}
}
StsTokenController.java
package com.csdn.controller;
import com.csdn.service.StsTokenService;
import com.csdn.vo.StsTokenVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api")
public class StsTokenController {
@Autowired
private StsTokenService stsTokenService;
@GetMapping("/oss/token")
public StsTokenVO getToken() {
return stsTokenService.getStsToken();
}
}
三、 访问接口运行结果
作者:YangRoc
出处:https://www.cnblogs.com/YangRoc/p/17186382.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
如果本篇文章有帮助到你,你可以请作者喝杯咖啡表示鼓励 ☕️
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了