使用 STS 方式调用 OpenAPI

更新时间:
复制为 MD 格式

配置环境变量

配置环境变量 MPAAS_AK_ENV 和 MPAAS_SK_ENV。

  • Linux 和 macOS 系统配置方法执行以下命令:

    export MPAAS_AK_ENV=<ACCESS_KEY_ID>
    export MPAAS_SK_ENV=<ACCESS_KEY_SECRET>
    说明

    其中 <ACCESS_KEY_ID> 替换为已准备好的 AccessKey ID,<ACCESS_KEY_SECRET> 替换为 AccessKey Secret。

  • Windows 系统配置方法:

    1. 新建环境变量,添加环境变量 MPAAS_AK_ENV 和 MPAAS_SK_ENV,并写入已准备好的 AccessKey ID 和 AccessKey Secret。

    2. 重启 Windows 系统。

前置条件

  1. 登录 RAM 控制台 创建一个用户,获取到用户的访问密钥(AccessKey ID 和 AccessKey Secret)。

  2. 为 RAM 用户授予请求 AssumeRole 的权限。

    创建完 RAM 用户后,使用 阿里云主账号 或拥有 访问控制(RAM)管理权限的 RAM 账号 授予该 RAM 用户通过扮演角色调用 STS 服务的权限 AliyunSTSAssumeRoleAccess

    说明

    授予 RAM 用户调用 STS 服务 AssumeRole 接口的固定权限是 AliyunSTSAssumeRoleAccess,与后续获取临时访问凭证以及通过临时访问凭证发起 mPaaS 请求所需权限无关。

创建 RAM 角色

使用 阿里云主账号 或拥有 访问控制(RAM)管理权限的 RAM 账号 创建 RAM 角色用于定义 RAM 角色被扮演时,可以获得的访问权限。

  1. 登录 RAM 控制台

  2. 在左侧导航栏,选择 身份管理 > 角色

  3. 角色 页面,单击 创建角色

  4. 创建角色 页面,选择 信任主体类型 云账号,然后选择 信任主体名称 当前云账号,单击 确定

    image.png

  5. 创建角色 对话框,输入角色名称,然后单击 确定

  6. 单击 ARN 右侧的 复制,保存角色的 ARN。

    image.png

为 RAM 角色授予 mPaaS 的权限

创建完 RAM 角色后,使用 阿里云主账号 或拥有 访问控制(RAM)管理权限的 RAM 账号 为 RAM 角色附加一个或多个权限策略,明确 RAM 角色在被扮演时所能拥有的访问权限,如 MpaasFullAccess 权限。

使用 RAM 用户扮演 RAM 角色获取临时访问凭证

重要

STS 临时访问凭证无法通过阿里云主账号的访问密钥(AccessKey)调用 STS API 接口获取,否则会导致报错失败。以下示例将以使用 RAM 用户的访问密钥(AccessKey)为例进行操作。

  • 为角色授予上传文件的权限后,RAM 用户需要通过扮演角色来获取临时访问凭证。临时访问凭证包括安全令牌(SecurityToken)、临时访问密钥(AccessKeyId 和 AccessKeySecret)以及过期时间(Expiration)。您可以使用 STS SDK 获取临时访问凭证。有关更多语言的 STS SDK 示例,请参见STS SDK 概览

  • 示例代码中的 endpoint 为 STS 服务接入点地址。为了获得更快的 STS 服务响应速度,您可以根据服务器所处地域,选择对应的或相近的 STS 服务接入点地址进行填写。有关 STS 服务接入点地址信息,请参见 服务接入点

    import com.alibaba.fastjson.JSON;
    import com.aliyun.mpaas20201028.models.QueryMcubeVhostRequest;
    import com.aliyun.mpaas20201028.models.QueryMcubeVhostResponse;
    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 com.aliyun.mpaas20201028.Client;
    
    public class StsServiceSample {
    
    
        /**
         * mPaaS控制台上对应的APP ID
         */
        private static final String APP_ID = "ALIPUB40DXXXXXXX";
    
        /**
         * mPaaS控制台上对应的工作空间id
         */
        private static final String WORKSPACE_ID = "default";
    
        /**
         * mPaaS控制台上对应的租户id
         */
        private static final String TENANT_ID = "XVXXXXXF";
    
        public static void main(String[] args) {
            // STS服务接入点,例如sts.cn-hangzhou.aliyuncs.com。您可以通过公网或者VPC接入STS服务。       
            String endpoint = "sts.cn-hangzhou.aliyuncs.com";
            // 从环境变量中获取步骤1生成的RAM用户的访问密钥(AccessKey IDAccessKey Secret)。
            String accessKeyId = System.getenv("ACCESS_KEY_ID");
            String accessKeySecret = System.getenv("ACCESS_KEY_SECRET");
            // 从环境变量中获取步骤3.6生成的RAM角色的RamRoleArn。
            String roleArn = System.getenv("RAM_ROLE_ARN");
            // 自定义角色会话名称,用来区分不同的令牌。        
            String roleSessionName = "yourRoleSessionName";
            // 临时访问凭证将获得角色拥有的所有权限。      
            String policy = null;
            // 临时访问凭证的有效时间,单位为秒。最小值为900,最大值以当前角色设定的最大会话时间为准。当前角色最大会话时间取值范围为3600秒~43200秒,默认值为3600秒。
            Long durationSeconds = 3600L;
            try {
                // 发起STS请求所在的地域。
                String regionId = "";
                // 添加endpoint。适用于Java SDK 3.12.0及以上版本。
                DefaultProfile.addEndpoint("", "", "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 request = new AssumeRoleRequest();
                // 适用于Java SDK 3.12.0及以上版本。
                request.setMethod(MethodType.POST);
                // 适用于Java SDK 3.12.0以下版本。
                // request.setMethod(MethodType.POST);
                request.setRoleArn(roleArn);
                request.setRoleSessionName(roleSessionName);
                // 若policy为空,则用户将获得该角色下所有权限
                request.setPolicy(policy);
                request.setDurationSeconds(durationSeconds);
                final AssumeRoleResponse response = client.getAcsResponse(request);
                // 打印获取到的sts信息
                System.out.println("Expiration: " + response.getCredentials().getExpiration());
                System.out.println("Access Key Id: " + response.getCredentials().getAccessKeyId());
                System.out.println("Access Key Secret: " + response.getCredentials().getAccessKeySecret());
                System.out.println("Security Token: " + response.getCredentials().getSecurityToken());
                System.out.println("RequestId: " + response.getRequestId());
    
                com.aliyun.teaopenapi.models.Config stsConfig = new com.aliyun.teaopenapi.models.Config()
                        .setAccessKeyId(response.getCredentials().getAccessKeyId())
                        .setAccessKeySecret(response.getCredentials().getAccessKeySecret())
                        .setSecurityToken(response.getCredentials().getSecurityToken())
                        // mpaas服务调用地址
                        .setEndpoint("mpaas.cn-hangzhou.aliyuncs.com");
    
                Client stsclient = new Client(stsConfig);
                QueryMcubeVhostRequest queryMcubeVhostRequest = new QueryMcubeVhostRequest();
                queryMcubeVhostRequest.setAppId(APP_ID);
                queryMcubeVhostRequest.setWorkspaceId(WORKSPACE_ID);
                queryMcubeVhostRequest.setTenantId(TENANT_ID);
                try {
                    QueryMcubeVhostResponse queryMcubeVhostResponse = stsclient.queryMcubeVhost(queryMcubeVhostRequest);
                    System.out.println(queryMcubeVhostResponse.getBody().getResultCode());
                    System.out.println(JSON.toJSONString(queryMcubeVhostResponse.getBody().getQueryVhostResult()));
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
    
    
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    }