You need to enable JavaScript to run this app.
导航

使用临时凭证访问TOS

最近更新时间2024.01.03 10:40:12

首次发布时间2022.04.12 09:57:05

本文介绍使用临时凭证(STS Token)访问 TOS。

前言

在客户端上传文件到对象存储的使用场景中,可以将AK/SK写入客户端代码,然后进行上传,但出于安全考虑,并不建议将永久AK/SK放到客户端代码中,此时可以使用服务端STS生成临时凭证并设置有效期,然后客户端使用临时凭证进行上传,临时凭证过期便失效。

关于实验
  • 预计部署时间:30分钟
  • 级别:初级
  • 相关产品:TOS
  • 受众: 通用
实验说明
  • 点击此链接登录控制台。

  • 如果您还没有账户,请点击此链接注册账户。

实验步骤

总体步骤如下:

  • 新建角色
  • 通过STS AssumeRole生成临时凭证
  • 客户端使用临时凭证进行上传

具体操作步骤:
一、新建角色

首先调用iam:CreateRole接口,并指定TrustPolicy,授权IAM用户可以使用该角色。

本示例使用Postman+OpenAPI来新建角色,您可以使用其他工具或语言完成OpenAPI的请求,Postman使用时,需要将签名算法写到Pre-request Sscript中。

关于OpenAPI调用方法,您可以参考此链接,然后自行构造签名的http请求。

请求方式为HTTP GET请求,必填参数如下:

参数类型描述
ActionStringCreateRole
VersionString2018-01-01
TrustPolicyDocumentString角色的信任策略
RoleNameString角色名
DisplayNameString展示名称

Postman 请求参数配置如下:
alt

其中host为: open.volcengineapi.com
TrustPolicyDocument如下:

{
    "Statement":[
        {
            "Effect":"Allow",
            "Action":[
                "sts:AssumeRole"
            ],
            "Principal":{
                "IAM":[
                    "trn:iam::账户ID:user/wanyix"
                ]
            }
        }
    ]
}

Headers 配置如下:
alt
其中AccessKey/SecretKey 更换为您环境的秘钥对。

创建完成后,控制台显示如下:
alt

二、给上面创建的角色附加策略,以允许改角色操作TOS,本示例附加TOS全部权限,您可以根据需求调整此权限。

附加策略完成后,如下:
alt

三、使用sts:AssumeRole来获取临时凭证。

关于AssumeRole调用,您可以参考此链接

Postman配置如下:

alt
可以看到成功获取了临时凭证,临时凭证由AccessKeyId、SecretAccessKey、SessionToken构成(此处获取的AccessKeyId对应第四部分示例代码accessKey变量;SecretAccessKey对应第四部分示例代码secretKey变量;SessionToken对应第四部分示例代码sessiontoken变量)。

四、使用临时凭证访问TOS。

获取到临时凭证后,使用TOS SDK来访问TOS,本示例以TOS GO SDK,关于TOS GO SDK,您可以参考此链接,代码如下:

package main

import (
	"context"
	"fmt"
	"github.com/volcengine/ve-tos-golang-sdk/tos"
	"os"
)


var(
	endpoint = "https://tos-cn-beijing.volces.com"
	accessKey = "xxxx"
	secretKey = "xxxx"
	sessiontoken = "xxxxx"
	region = "cn-beijing"
)


func check(err error, message string) {
	if err != nil {
		fmt.Printf("%s err: %s\n", message, err.Error())
		os.Exit(1)
	}
}

func main(){
	
	staticcredentials := tos.NewStaticCredentials(accessKey,secretKey)
	staticcredentials.WithSecurityToken(sessiontoken)
	client, err := tos.NewClient(endpoint, tos.WithRegion(region),
		tos.WithCredentials(staticcredentials))

	check(err,"NewClient")

	handle, err := client.Bucket("xxxxx")
	check(err,"Bucket")

	file,_ := os.Open("/xxxx/xxxxx/testpolicy.json")

	head,err :=    handle.PutObject(context.Background(),"xxxxx",file)
	check(err,"Have error")
	fmt.Println(head)
}

参考文档:
[1] TOS Go SDK
[2] API 调用指南
如果您有其他问题,欢迎您联系火山引擎技术支持服务