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

通过Cognito身份池获取AWS临时凭证返回undefined的问题排查

问题排查与修复方案

以下是几个常见的遗漏点和解决步骤:

1. 显式声明未认证用户身份

虽然未认证用户不需要令牌,但建议在初始化CognitoIdentityCredentials时显式设置Logins为空对象,避免SDK对身份类型判断模糊:

AWS.config.credentials = new AWS.CognitoIdentityCredentials({
    IdentityPoolId: 'your_pool_id',
    Logins: {} // 明确标记为未认证用户
});

2. 检查身份池与未认证角色的关联

确认你的身份池确实绑定了Cognito_TestIdentityPoolUnauth_Role-New这个未认证角色:

  • 打开AWS控制台,进入Cognito身份池页面,点击「编辑身份池」,查看「未认证身份的IAM角色」选项是否选中了正确的角色。

3. 验证IAM角色的信任策略

未认证角色的信任策略必须允许Cognito身份池调用sts:AssumeRoleWithWebIdentity操作,且限定未认证用户:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "cognito-identity.amazonaws.com"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "cognito-identity.amazonaws.com:aud": "你的身份池ID"
        },
        "ForAnyValue:StringLike": {
          "cognito-identity.amazonaws.com:amr": "unauthenticated"
        }
      }
    }
  ]
}

如果信任策略缺失或配置错误,Cognito无法为你颁发临时凭证。

4. 添加错误捕获排查问题

你的代码没有处理get()方法的错误,可能请求已经失败但你没看到。修改代码加入错误处理:

AWS.config.credentials.get(function(err) {
  if (err) {
    console.error('获取凭证出错:', err);
    return;
  }
  accessKeyId = AWS.config.credentials.accessKeyId;
  secretAccessKey = AWS.config.credentials.secretAccessKey;
  sessionToken = AWS.config.credentials.sessionToken;
  console.log('data', accessKeyId, secretAccessKey, sessionToken);
});

错误信息会直接告诉你问题所在——比如身份池ID写错、区域不匹配、权限不足等。

5. 检查AWS SDK版本

如果用的是旧版AWS SDK,可能存在CognitoIdentityCredentials的API兼容问题,升级到最新版试试:

npm install aws-sdk@latest

6. 前端环境需配置CORS

如果代码跑在浏览器里,要确保Cognito所在区域的CORS规则允许你的域名访问,否则浏览器会拦截请求导致获取凭证失败。


内容的提问来源于stack exchange,提问作者Yash

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 19:36:32