临时密钥生成及使用指引
最近更新时间: 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();
}
}