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获取。
你当前代码的问题
- 错误地用
区域+Username构造了IdentityId,这完全不符合IdentityId的生成规则; - 你只创建了用户池的用户,但这个用户还没和你的Identity Pool建立关联,所以
getCredentialsForIdentity找不到这个手动编造的ID。
正确的流程与修正代码
要拿到合法的IdentityId和AWS凭证,你需要走完整的“用户池认证→关联身份池→获取凭证”流程:
步骤说明
- 先完成用户池的认证(刚创建的临时密码用户需要先通过认证拿到ID Token);
- 用ID Token调用
getIdAPI,让Identity Pool为该用户生成/返回对应的IdentityId; - 再用这个合法的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
相关产品推荐
相关产品推荐

