2017-07-24 1 views
1

Je commence avec serveur sans serveur sur AWS et j'utilise AWS Cognito pour l'authentification et l'autorisation de l'utilisateur. Pour ce que j'ai vu sur la documentation et les exemples, vous pouvez créer des groupes pour permettre à certains utilisateurs d'utiliser un point de terminaison Api Gateway, en attachant un rôle et une stratégie à ce groupe. J'essaye ceci, et puis ai fait un client simple et essaye avec deux utilisateurs différents, et tous les deux sont capables d'obtenir un code de statut de 200 au lieu de l'un d'entre eux obtenant qu'il soit non autorisé. Pour créer le rôle, je suis allé à IAM, créer un rôle, un rôle pour l'accès du fournisseur d'identité, accorder l'accès aux fournisseurs d'identité Web, puis j'ai choisi Amazon Cognito et choisi mon pool d'utilisateurs de Cognito. relation de confiance:Groupes AWS Cognito et AWS Api Gateway

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
    { 
     "Effect": "Allow", 
     "Principal": { 
     "Federated": "cognito-identity.amazonaws.com" 
     }, 
     "Action": "sts:AssumeRoleWithWebIdentity", 
     "Condition": { 
     "StringEquals": { 
      "cognito-identity.amazonaws.com:aud": "us-east-1_8TAUVKbGP" 
     } 
     } 
    } 
    ] 
} 

Politique:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
     { 
      "Effect": "Allow", 
      "Action": [ 
       "execute-api:Invoke" 
      ], 
      "Resource": [ 
       "my-arn-resourse-from-api-gateway" 
      ] 
     } 
    ] 
} 

Je de ce rôle à mon groupe admin et ajouter un utilisateur à ce groupe, ce qui devrait permettre l'accès à qu'API ressource passerelle en attachant que la politique à l'utilisateur quand il se connecte. Mais quand j'essaye avec un utilisateur qui n'est pas dans ce groupe ça marche toujours. En passant, sur ma ressource Api Gateway dans la requête je mets pour autorisation mon pool cognito.

Merci beaucoup!

Répondre

1

Ok enfin je l'ai eu pour fonctionner parfaitement! Le problème était dans mon rôle IAM, dans le document de relation de confiance

"Condition": { 
 
     "StringEquals": { 
 
      "cognito-identity.amazonaws.com:aud": "identity_pool_id" 
 
     },

Dans cette partie au lieu d'utiliser mon identité piscine Id, j'utilisais mon utilisateur piscine Id. Une fois que cela a été corrigé, j'ai récupéré les informations d'identification et j'ai essayé dans Postman d'utiliser ces informations d'identification et cela a fonctionné parfaitement. Ensuite, je change le même utilisateur pour un autre rôle, et l'accès a été refusé comme prévu! La partie la plus importante pour l'utilisation facile de l'autorisation de rôle est que l'agent420 utilise la méthode AWS_IAM pour sécuriser l'API, alors que le reste est géré par aws.

0

Vous devrez utiliser la méthode AWS_IAM à la place pour votre cas d'utilisation. En outre, dans ce cas, toutes vos demandes d'API doivent être signées SIGv4. Vous pouvez utiliser Postman (extension chrome) pour tester. Il inclut une option pour les informations d'identification AWS.

+0

Merci! Je vais essayer et vous dire comment ça se passe! –

0

J'ai essayé ce que vous avez dit! Je pense que je suis dans la bonne voie, mais AWS.config.credentials retourne sessionToken, et accessKeyId à la fois avec null. Voici le code que je utilise:

let poolData = { 
 
     UserPoolId : 'my_user_pool_id', 
 
     ClientId : 'my_app_client_id' 
 
    }; 
 

 
    let authenticationData = { 
 
     Username : 'username', 
 
     Password : 'password', 
 
    }; 
 

 
    let userPool = new CognitoUserPool(poolData); 
 

 
    let userData = { 
 
     Username : 'username', 
 
     Pool : userPool 
 
    }; 
 

 
    let authenticationDetails = new AuthenticationDetails(authenticationData); 
 

 
    let cognitoUser = new CognitoUser(userData); 
 

 
    cognitoUser.authenticateUser(authenticationDetails, { 
 
     onSuccess: (result) => { 
 
     console.log(result); 
 

 
     AWS.config.region = 'my_region'; 
 

 
     AWS.config.credentials = new AWS.CognitoIdentityCredentials({ 
 
      IdentityPoolId : 'my_identity_pool_id', 
 
      Logins : { 
 
      'cognito-idp.my_region.amazonaws.com/my_user_pool_id' : result.getIdToken().getJwtToken() 
 
      } 
 
     }); 
 

 
     console.log(AWS.config.credentials); 
 
     }, 
 
     onFailure: (error) => { 
 

 
     } 
 
    });

Le résultat de la authenticateUser renvoie les jetons attendus. Le problème que je pense est lors de la récupération de CognitoIdentityCredentials.

Merci beaucoup!