You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:46:05