临时密钥生成及使用指引

最近更新时间: 2024-10-17 17:10:00

获取临时密钥

CAM 的 STS 临时秘钥,以云 API 的形式提供。目前云 API 提供各种语言的 SDK,用户可以使用云 API 或 SDK 来申请临时密钥三元组。

通过 API 获取

STS 云 API 接口参数

STS 云 API 的接口参数说明 如下:

字段 是否必选 类型 描述
name String 用户昵称
policy String 策略语法(需要 base64 编码)
durationSeconds Int 指定临时证书的有效期,单位:秒。
不传的话默认 1800 秒,最长有效期:2 小时(7200 秒)。
Signature String 请求签名,用来验证此次请求的合法性,需要用户根据实际的输入参数计算得出。
Timestamp Int 时间戳
Nonce Int 随机数
SecretId String 在云 API 密钥上申请的标识身份的 SecretId,一个 SecretId 对应唯一的 SecretKey , 而 SecretKey 会用来生成请求签名 Signature。
Action String Action = GetFederationToken
Region String 地域参数,用来标识希望操作哪个地域的实例。

返回值

字段 类型 描述
credentials Object 对象里面包含 Token,tmpSecretId,tmpSecretKey 三元组。
--token String Token 值做鉴权时使用。
--tmpSecretId String tmpSecretId 签名时使用。
--tmpSecretKey String tmpSecretKey 签名时使用。
federatedUser String 返回标识用户。
示例:qcs::sts::123456789012:federated-user/Bob
expiredTime Int 证书无效的时间戳

访问请求示例

http://sts.api.qcloud.com/v2/index.php?Action=GetFederationToken&Nonce=652650920&Region=gz&RequestClient=SDK_JAVA_1.3&SecretId=SecretIDXXXXX&Signature=Bv4G9gCkDVy/lhiDHg2eOIo1PPI=&Timestamp=1494561662&name=Sevenyou&policy=eyJzdGF0ZW1lbnQiOiBbeyJhY3Rpb24iOiBbIm5hbWUvY29zOkdldE9iamVjdCIsIm5hbWUvY29zOlB1dE9iamVjdCJdLCJlZmZlY3QiOiAiYWxsb3ciLCJyZXNvdXJjZSI6WyJxY3M6OmNvczpjbi1ub3J0aDp1aWQvMTI1MjQ0ODcwMzpwcmVmaXgvLzEyNTI0NDg3MDMvcmFiYml0bGl1dGovKiJdfV0sInZlcnNpb24iOiAiMi4wIn0=

返回内容示例

{
    "codeDesc": "Success",
    "message": "",
    "data": {
        "expiredTime": 1494563462,
        "credentials": {
            "sessionToken": "sessionTokenXXXXX",
            "tmpSecretId": "tmpSecretIdXXXXX",
            "tmpSecretKey": "tmpSecretKeyXXXXX"
        }
    },
    "code": 0
}

通过 SDK 获取

以云 API 提供的 Java SDK 为例:

import com.qcloud.Utilities.Json.JSONObject;

public class Demo {
    public static void main(String[] args) {
        /* 如果是循环调用下面举例的接口,需要从此处开始你的循环语句。切记! */
        TreeMap<String, Object> config = new TreeMap<String, Object>();
        config.put("SecretId", "SecretIdAAAA");
        config.put("SecretKey", "SecretKeyZZZZ");

        /* 请求方法类型 POST、GET */
        config.put("RequestMethod", "GET");

        QcloudApiModuleCenter module = new QcloudApiModuleCenter(new Sts(),
                config);

        TreeMap<String, Object> params = new TreeMap<String, Object>();
        /* 将需要输入的参数都放入 params 里面,必选参数是必填的。 */
        /* DescribeInstances 接口的部分可选参数如下 */
        params.put("name", "sevenyou");
        String policy = "{\"statement\": [{\"action\": [\"name/cos:GetObject\",\"name/cos:PutObject\"],\"effect\": \"allow\",\"resource\":[\"qcs::cos:ap-beijing:uid/12345678910:prefix//12345678910/sevenyou/*\"]}],\"version\": \"2.0\"}";
        params.put("policy", policy);

        /* 在这里指定所要用的签名算法,不指定默认为 HmacSHA1*/
        //params.put("SignatureMethod", "HmacSHA256");

        /* generateUrl 方法生成请求串, 可用于调试使用 */
        System.out.println(module.generateUrl("GetFederationToken", params));
        String result = null;
        try {
            /* call 方法正式向指定的接口名发送请求,并把请求参数 params 传入,返回即是接口的请求结果。 */
            result = module.call("GetFederationToken", params);
            JSONObject json_result = new JSONObject(result);
            System.out.println(json_result);
        } catch (Exception e) {
            System.out.println("error..." + e.getMessage());
        }
    }
}

申请临时三元组时,需要描述策略 Policy,示例中以 IP 做限制的 Policy 可能如下:

{
"statement": [
    {
        "action": [
            "name/cos:GetObject",
            "name/cos:HeadObject"
        ],
        "condition": {
            "ip_equal": {
                "qcs:ip": [
                    "101.226.226.185/32"
                ]
            }
        },
        "effect": "allow",
        "resource": [
            "qcs::cos:cn-east:uid/12345678910:prefix//12345678910/sevenyou/*"
        ]
    }
],
"version": "2.0"
}

Policy 描述请参考 策略语法

注意: resource 字段中的 prefix 后跟//。uid后面跟的是appid,而不是UIN。

使用临时密钥访问 COS

COS 访问通过x-cos-security-token字段来传递临时 Token,而临时 SecretId 和 SecretKey 则用来生成密钥,以 Jave SDK 为例使用临时密钥访问 COS,示例如下:

从 Github 下载:Java SDK

注意: 下列代码,需要加入x-cos-security-token字段,传递 STS 的临时密钥。

public class Demo {
    public static void main(String[] args) throws Exception {
        // 用户基本信息
        String appid = "12345678910";
        String secret_id = "TmpSecretId";
        String secret_key = "TmpSecretKey";
        String sessionToken = "TmpToken";

        // 设置秘钥
        COSCredentials cred = new BasicCOSCredentials(appid, secret_id, secret_key);

        // 生成 cos 客户端对象
        COSClient cosClient = new COSClient(cred, clientConfig);

        // 创建 bucket
        // bucket 数量上限 200 个, bucket 是重操作, 一般不建议创建如此多的 bucket
        // 重复创建同名 bucket 会报错
        String bucketName = "rabbitliutj";
        // 上传 object, 建议 20M 以下的文件使用该接口
        File localFile = new File("D:\\test\\rabbit_test.txt");
        String key = "/upload_single_demo.txt";
        PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, localFile);
        ObjectMetadata objectMetadata = new ObjectMetadata();
        objectMetadata.setSecurityToken (sessionToken);
        putObjectRequest.setMetadata(objectMetadata);
        PutObjectResult putObjectResult = cosClient.putObject(putObjectRequest);
        System.out.println(putObjectResult);

        // 关闭客户端 (关闭后台线程)
        cosClient.shutdown();
    }
}