2017-07-24 6 views
1

Ich beginne mit serverless bei AWS und verwende AWS Cognito für die Benutzerauthentifizierung und -autorisierung. Was ich in der Dokumentation und den Beispielen dort gesehen habe, können Sie Gruppen erstellen, die bestimmten Benutzern ermöglichen, einen Api Gateway-Endpunkt zu verwenden, indem Sie dieser Gruppe eine Rolle und eine Richtlinie zuweisen. Ich versuche das, und dann einen einfachen Client und versuche es mit zwei verschiedenen Benutzern, und beide sind in der Lage, einen 200 Statuscode zu erhalten, anstatt dass einer von ihnen bekommt, dass er unautorisiert wird. Zum Erstellen der Rolle bin ich zu IAM gegangen, habe eine Rolle, eine Rolle für den Identity-Provider-Zugriff erstellt, gewähre Zugriff auf Web-Identity-Provider und wähle dann Amazon Cognito und wähle meinen Benutzerpool von Cognito. Vertrauensbeziehung:AWS Cognito Groups und 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" 
     } 
     } 
    } 
    ] 
} 

Politik:

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

Dann zugewiesen ich diese Rolle mein Admin-Gruppe und fügen Sie einen Benutzer zu dieser Gruppe, die durch das Anbringen dieser Politik den Zugang zu dieser API-Gateway-Ressource ermöglichen sollte, für den Benutzer, wenn es sich anmeldet. Aber wenn ich mit einem Benutzer nicht in dieser Gruppe versuche, funktioniert es noch. Übrigens, auf meiner API-Gateway-Ressource in der Anfrage stelle ich zur Autorisierung meinen Cognito-Pool.

Vielen Dank!

Antwort

1

Ok endlich habe ich es perfekt funktionieren! Das Problem war in meiner IAM Rolle, in der Vertrauensbeziehung Dokument

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

In diesem Teil statt meine Identität Pool Id zu verwenden, war ich mit meinem User-Pool Id. Sobald das behoben war, habe ich die Anmeldeinformationen zurück und versuchte in Postman diese Anmeldeinformationen zu verwenden und es funktionierte perfekt. Dann ändere ich denselben Benutzer in eine andere Rolle und der Zugriff wurde wie geplant verweigert! Der wichtigste Teil für die Verwendung der Rollenautorisierung auf einem einfachen Weg ist, wie Agent420 gesagt hat, die Methode AWS_IAM zu verwenden, um die API zu sichern, dann wird der Rest von aws behandelt.

0

Sie müssten stattdessen die AWS_IAM-Methode für Ihren Anwendungsfall verwenden. Außerdem müssten in diesem Fall alle Ihre API-Anfragen SIGv4-signiert sein. Sie können Postman (Chrome-Erweiterung) zum Testen verwenden. Es enthält eine Option für AWS-Anmeldeinformationen.

+0

Danke! Ich werde es versuchen und lassen Sie wissen, wie es geht! –

0

Ich versuche, was Sie gesagt haben! Ich denke, dass ich in der richtigen Weise bin, aber AWS.config.credentials gibt sessionToken und accessKeyId beide mit null zurück. Dies ist der Code Ich verwende:

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) => { 
 

 
     } 
 
    });

Das Ergebnis aus der authenticateUser gibt die erwarteten Token. Das Problem, das ich denke, ist beim Abrufen der CognitoIdentityCredentials.

Vielen Dank!