如何使用STS SDK获取具有简单上传(oss:PutObject)权限的临时访问凭证
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.auth.sts.AssumeRoleRequest;
import com.aliyuncs.auth.sts.AssumeRoleResponse;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet(name = "sts", value = "/sts")
public class GetSTSServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// STS服务接入点,例如sts.cn-hangzhou.aliyuncs.com。您可以通过公网或者VPC接入STS服务。
String endpoint = "sts.cn-hangzhou.aliyuncs.com";
// 从环境变量中获取步骤1生成的RAM用户的访问密钥(AccessKey ID和AccessKey Secret)。
String accessKeyId = "ABAI5tPLnpqT8JZJMVtRx5gD";
String accessKeySecret = "6bSDFUmxw8bD02twHAk2vIersuwrLUA";
// 从环境变量中获取步骤3生成的RAM角色的RamRoleArn。
String roleArn = "acs:ram::1732622035072713:role/ramossroletest";
// 自定义角色会话名称,用来区分不同的令牌,例如可填写为SessionTest。
String roleSessionName = "fileSessionUpload";
// 临时访问凭证将获得角色拥有的所有权限。
String policy = null;
// 临时访问凭证的有效时间,单位为秒。最小值为900,最大值以当前角色设定的最大会话时间为准。当前角色最大会话时间取值范围为3600秒~43200秒,默认值为3600秒。
// 在上传大文件或者其他较耗时的使用场景中,建议合理设置临时访问凭证的有效时间,确保在完成目标任务前无需反复调用STS服务以获取临时访问凭证。
Long durationSeconds = 3600L;
try {
// 发起STS请求所在的地域。建议保留默认值,默认值为空字符串("")。
String regionId = "";
// 添加endpoint。适用于Java SDK 3.12.0及以上版本。
DefaultProfile.addEndpoint(regionId, "Sts", endpoint);
// 添加endpoint。适用于Java SDK 3.12.0以下版本。
// DefaultProfile.addEndpoint("",regionId, "Sts", endpoint);
// 构造default profile。
IClientProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
// 构造client。
DefaultAcsClient client = new DefaultAcsClient(profile);
final AssumeRoleRequest assumeRoleRequest = new AssumeRoleRequest();
// 适用于Java SDK 3.12.0及以上版本。
assumeRoleRequest.setSysMethod(MethodType.POST);
// 适用于Java SDK 3.12.0以下版本。
// request.setMethod(MethodType.POST);
assumeRoleRequest.setRoleArn(roleArn);
assumeRoleRequest.setRoleSessionName(roleSessionName);
assumeRoleRequest.setPolicy(policy);
assumeRoleRequest.setDurationSeconds(durationSeconds);
final AssumeRoleResponse assumeRoleResponse = client.getAcsResponse(assumeRoleRequest);
System.out.println("Expiration: " + assumeRoleResponse.getCredentials().getExpiration());
// 临时访问凭证过期时间格式是UTC,与北京时间有8小时的时差。例如,临时访问凭证过期时间是2024-04-18T11:33:40Z,说明临时访问凭证将在北京时间2024年4月18日19时33分40秒之前过期
System.out.println("Access Key Id: " + assumeRoleResponse.getCredentials().getAccessKeyId());
System.out.println("Access Key Secret: " + assumeRoleResponse.getCredentials().getAccessKeySecret());
System.out.println("Security Token: " + assumeRoleResponse.getCredentials().getSecurityToken());
System.out.println("RequestId: " + assumeRoleResponse.getRequestId());
} catch (ClientException e) {
System.out.println("Failed:");
System.out.println("Error code: " + e.getErrCode());
System.out.println("Error message: " + e.getErrMsg());
System.out.println("RequestId: " + e.getRequestId());
}
}
}生成结果如下:
Expiration: 2024-10-19T15:03:47Z Access Key Id: STS.NU9MoqZR51pVsjdjPp1f9QpPt Access Key Secret: 6gnsvTyvrsVmxwEZCWL2JTcmRx2QTvorGEoBGZzXdvzKC Security Token: CAISywJ1q6Ft5B2yfSjIr5aMBtXFt40UhrK9cUzVjlAlPekVvrX7ljz2IHhMfXVtBegYs/s2nGBZ6/gelrh9SptIfkHfdsp36KlP9QSob9J5fB13L+ZW5qe+EE2/VjTZvqaLEcibIfrZfvCyESOm8gZ43br9cxi7QlWhKufnoJV7b9MRLGLaBHg8c7UwHAZ5r9IAPnb8LOukNgWQ4lDdF011oAFx+wgdgOadupTDtkqA1geikbJN+N6ue8OeApMybMslYbCcx/drc6fN6ilU5iVR+b1+5K4+om+f543AXwEPvkrfa7qFr4MzNmljb609ALVeq/zxifBjpvxyEhBGb7WoVgs8cVM8JOjIqKOscIsi5s6481TGFV55c8FdR3jkMj5V8L8hTnduUfAPRHG+p5JCZM90ZAFpFt5kTKnBL4rB5MUctfzRp1BBQbPUTzDnGoABiPcBGE8ul1pCpBCxVQK3DqCyumZ6ObzA2sR/tZ4bg3cB4E1N0WBVroa/ALOmpL17aNRJ8rI+WZqn8c4OA4gG+KvWDZRep0yGBgrBCWZbdxDxJn4y6I5c9X5SVfUSM83BqD8DrV+FBSb08ktCw5voBd7p5vS7LePJFHlSIr/shikgAA== RequestId: 7E7E5805-B30B-5A5A-BF5F-A31F3263FCFE
