in solution/solution-cross-account-sts-token/code-example/java/common/src/main/java/org/example/sdk2_0/AssumeRoleSample.java [15:62]
public static void main(String[] args) throws Exception {
// 初始化凭据客户端,使用Credentials工具,保证您的应用程序本身是无AK的
// 借助Credentials工具的默认凭据链,您可以用同一套代码,通过程序之外的配置来控制不同环境下的凭据获取方式
// 当您在初始化凭据客户端不传入任何参数时,Credentials工具将会尝试按照如下顺序查找相关凭据信息(优先级由高到低):
// 1. 使用系统属性
// 2. 使用环境变量
// 3. 使用OIDC RAM角色
// 4. 使用配置文件
// 5. 使用ECS实例RAM角色(需要通过环境变量 ALIBABA_CLOUD_ECS_METADATA 指定 ECS 实例角色名称;通过环境变量 ALIBABA_CLOUD_ECS_IMDSV2_ENABLE=true 开启在加固模式下获取STS Token)
// 详情请参考:https://help.aliyun.com/zh/sdk/developer-reference/v2-manage-access-credentials#3ca299f04bw3c
// 要使用默认凭据链,初始化 Client 时,必须使用空的构造函数,不能配置 Config 入参
// 除了使用默认凭据链,您也可以在代码中显式配置,来初始化凭据客户端
// 详情请参考:https://help.aliyun.com/zh/sdk/developer-reference/v2-manage-access-credentials#a9e9aa404bzfy
com.aliyun.credentials.Client credentialClient = new com.aliyun.credentials.Client();
// 跨账号角色扮演获取STS Token
// 如果您缓存了该STS Token,需要特别注意STS Toke的到期时间,避免缓存时间过长而STS Token过期导致程序错误
CredentialModel assumeRoleCredentialModel = createAssumeRoleCredential(credentialClient);
// 调用API,跨账号进行资源操作
// 以调用GetCallerIdentity获取当前调用者身份信息为例
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
.setAccessKeyId(assumeRoleCredentialModel.getAccessKeyId())
.setAccessKeySecret(assumeRoleCredentialModel.getAccessKeySecret())
.setSecurityToken(assumeRoleCredentialModel.getSecurityToken())
// 地域,以华东1(杭州)为例
.setRegionId("cn-hangzhou");
com.aliyun.sts20150401.Client stsClient = new com.aliyun.sts20150401.Client(config);
RuntimeOptions runtimeOptions = new RuntimeOptions()
// 开启自动重试机制,只会对超时等网络异常进行重试
.setAutoretry(true)
// 设置自动重试次数,默认3次
.setMaxAttempts(3);
try {
GetCallerIdentityResponse getCallerIdentityResponse = stsClient.getCallerIdentityWithOptions(runtimeOptions);
System.out.println(JSON.toJSONString(getCallerIdentityResponse));
} catch (TeaException e) {
// 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
e.printStackTrace();
// 打印错误码
System.out.println(e.getCode());
// 打印错误信息,错误信息中包含 RequestId
System.out.println(e.getMessage());
// 打印服务端返回的具体错误内容
System.out.println(e.getData());
}
}