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

AWS Cognito IdentityId定义及创建用户后获取凭证失败求助

问题根源:混淆了Cognito User Pool的用户ID与Identity Pool的IdentityId

兄弟,你遇到的报错核心原因很明确——你手动拼接的us-east-1:xxx根本不是合法的Cognito IdentityId!这俩ID完全是两个系统里的东西,不能随便凑出来。

先搞懂两个ID的区别

  • User Pool的用户sub:这是用户在你的Cognito用户池里的唯一标识,存在于创建用户返回的data.User.Attributes里,字段名是sub(不是Username!你代码里还错用了Username,这也是个小问题)。但这个ID只在用户池内部有效,和Identity Pool没关系。
  • Cognito IdentityId:这是用户在**Cognito身份池(Identity Pool)**里的唯一ID,是由Identity Pool服务生成的,用来关联用户池用户与AWS资源访问权限。它的格式确实是区域:随机字符串,但绝对不是你把区域+用户sub/Username拼出来的,必须通过Identity Pool的API获取。

你当前代码的问题

  1. 错误地用区域+Username构造了IdentityId,这完全不符合IdentityId的生成规则;
  2. 你只创建了用户池的用户,但这个用户还没和你的Identity Pool建立关联,所以getCredentialsForIdentity找不到这个手动编造的ID。

正确的流程与修正代码

要拿到合法的IdentityId和AWS凭证,你需要走完整的“用户池认证→关联身份池→获取凭证”流程:

步骤说明

  1. 先完成用户池的认证(刚创建的临时密码用户需要先通过认证拿到ID Token);
  2. 用ID Token调用getId API,让Identity Pool为该用户生成/返回对应的IdentityId;
  3. 再用这个合法的IdentityId调用getCredentialsForIdentity获取临时AWS凭证。

修正后的代码示例

var params = { 
  UserPoolId: process.env.USER_POOL_ID, 
  Username: 'xxx@gmail.com', 
  TemporaryPassword: 'Passw0rd!' 
}; 
var cognitoidentityserviceprovider = new AWS.CognitoIdentityServiceProvider();

cognitoidentityserviceprovider.adminCreateUser(params, function(err, data) {
  if (err) {
    callback(null, failure(err));
    return;
  }

  // 第一步:完成用户认证,获取ID Token(针对临时密码用户,用ADMIN_USER_PASSWORD_AUTH流程)
  const authParams = {
    UserPoolId: process.env.USER_POOL_ID,
    ClientId: process.env.USER_POOL_CLIENT_ID, // 你需要提前创建用户池客户端
    AuthFlow: 'ADMIN_USER_PASSWORD_AUTH',
    AuthParameters: {
      USERNAME: 'xxx@gmail.com',
      PASSWORD: 'Passw0rd!'
    }
  };

  cognitoidentityserviceprovider.adminInitiateAuth(authParams, (authErr, authData) => {
    if (authErr) {
      // 如果返回NEW_PASSWORD_REQUIRED,需要调用adminRespondToAuthChallenge设置新密码
      if (authErr.code === 'NEW_PASSWORD_REQUIRED') {
        callback(null, failure('需要设置新密码'));
      } else {
        callback(null, failure(authErr));
      }
      return;
    }

    const idToken = authData.AuthenticationResult.IdToken;

    // 第二步:调用getId获取合法的IdentityId
    const cognitoidentity = new AWS.CognitoIdentity();
    const getIdParams = {
      IdentityPoolId: process.env.IDENTITY_POOL_ID, // 你的身份池ID
      Logins: {
        // 格式固定为:cognito-idp.<区域>.amazonaws.com/<用户池ID>
        [`cognito-idp.${process.env.AWS_REGION}.amazonaws.com/${process.env.USER_POOL_ID}`]: idToken
      }
    };

    cognitoidentity.getId(getIdParams, (getIdErr, getIdData) => {
      if (getIdErr) {
        callback(null, failure(getIdErr));
        return;
      }

      const correctIdentityId = getIdData.IdentityId;

      // 第三步:用合法的IdentityId获取AWS凭证
      cognitoidentity.getCredentialsForIdentity({ IdentityId: correctIdentityId }, (credErr, credResult) => {
        if (credErr) {
          callback(null, failure(credErr));
        } else {
          callback(null, success(credResult));
        }
      });
    });
  });
});

额外注意点

  • 你必须提前创建一个Cognito Identity Pool,并在其身份提供者设置中添加你的User Pool;
  • 如果你的用户池设置了“强制首次登录修改密码”,那么adminInitiateAuth会返回NEW_PASSWORD_REQUIRED错误,这时候需要调用adminRespondToAuthChallenge来设置用户的新密码后才能继续;
  • IdentityId是和用户绑定的,同一个用户再次调用getId会返回相同的ID。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:28:48