如何获取aws-sdk-go/service/cognitoidentity令牌?请求返回无效安全令牌
解决Cognito Go SDK调用报错及令牌获取问题
你遇到的The security token included in the request is invalid错误,通常有两个核心原因:要么你用的IAM凭证(access key/secret key)无效或没有对应权限,要么你混淆了IAM管理凭证和Cognito用户身份令牌的使用场景。下面分情况帮你解决:
一、先解决ListUserPools的调用错误
如果你只是想调用Cognito的管理类API(比如列出用户池),需要确保你的IAM用户配置正确:
- 检查IAM权限:给你的IAM用户附加包含
cognito-idp:ListUserPools权限的策略,示例策略如下:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "cognito-idp:ListUserPools", "Resource": "*" } ] } - 验证凭证有效性:确认你的access key和secret key没有过期、被禁用,并且属于上面配置了权限的IAM用户。
二、如果你的实际需求是获取Cognito用户令牌(ID/Access Token)
用IAM静态凭证是拿不到用户令牌的——用户令牌是给终端用户使用的,需要通过用户的用户名密码(或其他认证方式)调用InitiateAuth API来获取,示例代码如下:
package main import ( "log" "crypto/hmac" "crypto/sha256" "encoding/base64" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/cognitoidentityprovider" ) // 如果你的用户池客户端设置了密钥,需要生成SECRET_HASH func generateSecretHash(username, clientID, clientSecret string) string { mac := hmac.New(sha256.New, []byte(clientSecret)) mac.Write([]byte(username + clientID)) return base64.StdEncoding.EncodeToString(mac.Sum(nil)) } func main() { // 创建Session,这里不需要静态IAM凭证(除非你的客户端特殊配置要求) sess := session.Must(session.NewSession(&aws.Config{ Region: aws.String("us-east-1"), })) svc := cognitoidentityprovider.New(sess) authParams := map[string]*string{ "USERNAME": aws.String("你的用户名"), "PASSWORD": aws.String("你的用户密码"), } // 如果客户端有密钥,添加SECRET_HASH参数 // authParams["SECRET_HASH"] = aws.String(generateSecretHash("你的用户名", "客户端ID", "客户端密钥")) input := &cognitoidentityprovider.InitiateAuthInput{ AuthFlow: aws.String("USER_PASSWORD_AUTH"), ClientId: aws.String("你的用户池客户端ID"), AuthParameters: authParams, } result, err := svc.InitiateAuth(input) if err != nil { log.Fatalf("获取令牌失败: %v", err) } // 拿到所需的令牌 log.Println("ID Token:", *result.AuthenticationResult.IdToken) log.Println("Access Token:", *result.AuthenticationResult.AccessToken) log.Println("Refresh Token:", *result.AuthenticationResult.RefreshToken) }
额外注意事项:
USER_PASSWORD_AUTH认证流默认是关闭的,你需要在AWS控制台的Cognito用户池客户端配置中,找到“允许的认证流”选项,启用该认证方式。- 如果你的用户池客户端生成了密钥,必须添加
SECRET_HASH参数,否则会调用失败。
内容的提问来源于stack exchange,提问作者OneOfOne
相关产品推荐
相关产品推荐

