STS的优势如下:
- 您无需透露您的长期密钥(AccessKey)给第三方应用,只需生成一个访问令牌并将令牌交给第三方应用。您可以自定义这个令牌的访问权限及有效期限。
- 您无需关心权限撤销问题,访问令牌过期后自动失效。
项目场景:给客户端临时Token
遇到的错误:Can not find endpoint to access
解决办法:aliyun-java-sdk-core包版本问题,我这里从3.7.1改为3.0.0就好了
<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.0.0</version>
</dependency>
其他需要注意的问题:
- regionId需要填写正确 regionId文档
- ARN:即角色的ID , 该参数在新建RAM角色后基本信息中
贴个代码
// 创建一个 Aliyun Acs Client, 用于发起 OpenAPI 请求
IClientProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
DefaultAcsClient client = new DefaultAcsClient(profile);
// 创建一个 AssumeRoleRequest 并设置请求参数
final AssumeRoleRequest request = new AssumeRoleRequest();
//请求方式
request.setMethod(com.aliyuncs.http.MethodType.POST);
request.setProtocol(com.aliyuncs.http.ProtocolType.HTTPS);
//角色Arn
request.setRoleArn(roleArn);
//用来标识临时访问凭证的名称 可根据客户端+用户id生成
request.setRoleSessionName(roleSessionName);
//额外权限, 可为null
request.setPolicy(policy);
//设置临时访问凭证的有效期,单位是秒,最小值为900
request.setDurationSeconds(durationSeconds);
final AssumeRoleResponse response = client.getAcsResponse(request);
//token
System.out.println("SecurityToken:" + response .getCredentials().getSecurityToken()));