如何为属于多个用户池组的AWS Cognito用户切换IAM角色?

时间:2020-02-12 10:44:25

标签: javascript amazon-web-services amazon-cognito amazon-iam aws-amplify

我有一个使用AWS Amplify和Cognito构建的Web应用程序用于身份验证/授权。 Cognito用户池是身份提供者。

根据用户应具有的权限将其分为“ Cognito用户池”组。

我希望某些用户成为多个组的一部分(例如Admin用户),这些组应具有这些组的总和 组的权限。但是由于用户只能承担一个角色,所以我需要能够在应用程序中切换角色。

我尝试通过使用getCredentialsForIdentity

  const cognito_identity = new AWS.CognitoIdentity({ apiVersion: '2014-06-30', region: 'eu-central-1' });
  var params = {
    IdentityId: 'some_identity',
    CustomRoleArn: 'arn:aws:iam::<account_id>:role/editors',
  };
  cognito_identity.getCredentialsForIdentity(params, function(err, data) {
    if (err) console.log(err, err.stack);
    else     console.log(data);
  });

调用上述代码时,它失败并显示 NotAuthorizedException:禁止访问标识“ some_identity”。

我需要做什么才能使其正常工作?

1 个答案:

答案 0 :(得分:1)

Logins的参数中包含getCredentialsForIdentity属性后,它起作用了:

async function switchRoles(region, identityId, roleArn, cognitoArn) {
  const user = await Auth.currentUserPoolUser();
  const cognitoidentity = new AWS.CognitoIdentity({ apiVersion: '2014-06-30', region });
  const params = {
    IdentityId: identityId,
    CustomRoleArn: roleArn,
    Logins: {
      [cognitoArn]: user
        .getSignInUserSession()
        .getIdToken()
        .getJwtToken(),
    },
  };
  return cognitoidentity
    .getCredentialsForIdentity(params)
    .promise()
    .then(data => {
      return {
        accessKeyId: data.Credentials.AccessKeyId,
        sessionToken: data.Credentials.SessionToken,
        secretAccessKey: data.Credentials.SecretKey,
        expireTime: data.Credentials.Expiration,
        expired: false,
      };
    })
    .catch(err => {
      console.log(err, err.stack);
      return null;
    });
}