Tengo una aplicación web creada con AWS Amplify y Cognito que se usa para la autenticación/autorización. Los grupos de usuarios de Cognito son el proveedor de identidad.
Los usuarios se agrupan en grupos de grupos de usuarios de Cognito en función de los permisos que deberían tener.
Quiero que algunos usuarios formen parte de varios grupos (por ejemplo, usuarios administradores) que deberían tener la suma de los permisos de estos grupos. Pero dado que el usuario solo puede asumir un rol, necesito poder cambiar los roles en la aplicación.
Intenté lograr esto usando 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); });Al invocar el código anterior, falla con NotAuthorizedException: el acceso a la identidad '`some_identity' está prohibido.
¿Qué debo hacer para que funcione?
Después de incluir la propiedad Logins en los parámetros de getCredentialsForIdentity , funcionó:
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; }); }