直接使用阿里云账号的主账号的AccessKey ID和AccessKey Secret进行应用开发会有一定的安全风险,为了提升安全性,除了通过RAM角色控制权限范围外,您还可以使用为RAM角色签发的STS Token来访问阿里云服务。

STS Token介绍

阿里云STS (Security Token Service) 是为阿里云账号(或RAM用户)提供短期访问权限管理的云服务。通过STS,您可以为联盟用户(您的本地账号系统所管理的用户)颁发一个自定义时效和访问权限的访问凭证。联盟用户可以使用STS短期访问凭证直接调用阿里云服务API,或登录阿里云管理控制台操作被授权访问的资源。

使用STS Token调用SDK有以下优势:

  • 减少了主账号AccessKey ID和AccessKey Secret泄露的风险,特别是移动设备等场景。

  • 能使用灵活的权限控制,STS Token有一定的时间限制,并且根据RAM角色的灵活设置对ECS、SLB等资源的精细授权。

说明
在使用STS Token前,确保该产品支持STS Token验证。

设置STS Token

您可以通过以下两种方式设置STS Token:
  • 方式一:直接使用STS Token
    直接使用STS Token时,您需要自行维护STS Token的周期性更新。
    #include <iostream>
    #include <alibabacloud/core/AlibabaCloud.h>
    #include <alibabacloud/core/sts/StsClient.h>
    #include <alibabacloud/core/StsAssumeRoleCredentialsProvider.h>
    #include <alibabacloud/ecs/EcsClient.h>
    
    using namespace AlibabaCloud;
    using namespace AlibabaCloud::Ecs;
    
    int main(int argc, char** argv)
    {
        // 初始化 SDK
        AlibabaCloud::InitializeSdk();
    
        // 配置 ecs 实例
        ClientConfiguration configuration("<your-region-id>");
        EcsClient client(Credentials("<your-access-key-id>", "<your-access-key-secret>", <your-session-token>),
            configuration);
    
        // 创建API请求并设置参数
        Model::DescribeInstancesRequest request;
        request.setPageSize(10);
        auto outcome = client.describeInstances(request);
        if (!outcome.isSuccess())
        {
            // 异常处理
            std::cout << outcome.error().errorCode() << std::endl;
            AlibabaCloud::ShutdownSdk();
            return -1;
        }
        std::cout << "totalCount: " << outcome.result().getTotalCount() << std::endl;
        // 关闭 SDK
        AlibabaCloud::ShutdownSdk();
        return 0;
    }
    其中:
    • region-id是您正在使用的地域ID。你可以通过调用DescribeRegions接口查看地域ID。
    • sts-access-key-idsts-access-key-secretsts-session-token是调用AssumeRole接口返回的授权信息。
  • 方式二:使用SDK自动管理STS Token
    您可以通过指定RAM的角色信息,让SDK帮您自动申请并维护STS Token。
    #include <iostream>
    #include <alibabacloud/core/AlibabaCloud.h>
    #include <alibabacloud/core/sts/StsClient.h>
    #include <alibabacloud/core/StsAssumeRoleCredentialsProvider.h>
    #include <alibabacloud/ecs/EcsClient.h>
    
    using namespace AlibabaCloud;
    using namespace AlibabaCloud::Ecs;
    
    int main(int argc, char** argv)
    {
        // 初始化 SDK
        AlibabaCloud::InitializeSdk();
    
        // 配置 ecs 实例
        ClientConfiguration configuration("<your-region-id>");
        auto stsClient = std::make_shared<Sts::StsClient>("<your-access-key-id>", "<your-access-key-secret>", configuration);
        auto credentialsProvider = std::make_shared<StsAssumeRoleCredentialsProvider>(stsClient, "<your-role-arn>", "<your-role-session-name>");
        EcsClient client(credentialsProvider, configuration);
    
        // 创建API请求并设置参数
        Model::DescribeInstancesRequest request;
        request.setPageSize(10);
        auto outcome = client.describeInstances(request);
        if (!outcome.isSuccess())
        {
            // 异常处理
            std::cout << outcome.error().errorCode() << std::endl;
            AlibabaCloud::ShutdownSdk();
            return -1;
        }
        std::cout << "totalCount: " << outcome.result().getTotalCount() << std::endl;
        // 关闭 SDK
        AlibabaCloud::ShutdownSdk();
        return 0;
    }
    其中:
    • role-arn是角色全局资源描述符,您可以通过访问RAM控制台,单击角色名,进入详情页后查询角色名对应的role-arn。

    • role-session-name是临时角色名称,您可以通过调用AssumeRole接口来获取一个扮演该角色的临时身份,创建成功后,便可以使用创建时的RoleSessionName参数作为本方式的role-session-name参数。