使用本地SSO令牌通过Go SDK v2访问AWS时STS请求报错
AWS Go SDK v2使用SSO时STS请求403错误排查
问题描述
编写了如下AWS Go SDK v2程序,调用STS GetCallerIdentity接口:
package main import ( "context" "encoding/json" "os" "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/service/sts" ) func main() { ctx := context.Background() cfg, err := config.LoadDefaultConfig(ctx) if err != nil { panic(err) } stsCli := sts.NewFromConfig(cfg) resp, err := stsCli.GetCallerIdentity(ctx, &sts.GetCallerIdentityInput{}) if err != nil { panic(err) } _ = json.NewEncoder(os.Stdout).Encode(resp) }
运行后报错:
sobug % go run ./test.go panic: operation error STS: GetCallerIdentity, https response error StatusCode: 403, RequestID: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXX, api error InvalidClientTokenId: The security token included in the request is invalid. goroutine 1 [running]: main.main() /tmp/sobug/test.go:49 +0x158 exit status 2
但执行aws sso login(默认配置文件)后,通过CLI调用aws sts get-caller-identity可正常返回结果:
sobug % aws sts get-caller-identity { "UserId": "****", "Account": "****", "Arn": "arn:aws:sts::****:assumed-role/****/****" }
~/.aws/config配置如下:
[default] region = **** sso_session = **** sso_account_id = **** sso_role_name = **** output = **** [sso-session ****] sso_start_url = **** sso_region = **** sso_registration_scopes = ****
原因及解决方案
核心原因
AWS Go SDK v2对ssosession类型的配置支持需要依赖最新的SDK组件,且默认加载逻辑可能未优先读取SSO会话凭证,或存在旧凭证干扰。
解决步骤
更新AWS Go SDK v2依赖到最新版本
早期版本的SDK对SSO会话配置的支持不完善,执行以下命令更新:go get github.com/aws/aws-sdk-go-v2/config@latest go get github.com/aws/aws-sdk-go-v2/service/sts@latest go mod tidy显式指定加载默认配置文件
修改代码中加载配置的逻辑,确保明确读取default配置段,避免环境变量或其他配置干扰:cfg, err := config.LoadDefaultConfig(ctx, config.WithSharedConfigProfile("default"), )检查并清理旧凭证文件
如果~/.aws/credentials文件中存在default段的Access Key/Secret,SDK会优先加载这些静态凭证,导致SSO凭证无法生效。删除该文件中的default段即可。验证SSO令牌有效性
SSO令牌存储在~/.aws/sso/cache目录下,若令牌过期或损坏,可删除该目录下的所有文件,重新执行aws sso login刷新令牌。
内容的提问来源于stack exchange,提问作者Matt Wlazlo
相关产品推荐
相关产品推荐

