0

Ich habe Setup ein Identity-Pool und mit Python und boto3 Ich bin in der Lage einen Zugriffsschlüssel, geheimen Schlüssel und Session-Token abzurufen, die ich für einen nicht authentifizierten Benutzer davon ausgehen, ist:Wie sichere ich ein AWS API Gateway mit Cognito?

import boto3 
boto3.setup_default_session(region_name='us-east-1') 
identity = boto3.client('cognito-identity', 
         region_name='us-east-1') 

response = identity.get_id(AccountId='12344566', IdentityPoolId='us-east-1:XXXXXX') 
identity_id = response['IdentityId'] 
print ("Identity ID: %s"%identity_id) 

response = identity.get_open_id_token(IdentityId=identity_id) 
token = response['Token'] 
print ("\nToken: %s"%(token)) 

resp = identity.get_credentials_for_identity(IdentityId=identity_id) 
secretKey = resp['Credentials']['SecretKey'] 
accessKey = resp['Credentials']['AccessKeyId'] 

print ("\nSecret Key: %s"%(secretKey)) 
print ("\nAccess Key %s"%(accessKey)) 

Sobald ich diese haben Details Ich versuche dann, das API-Gateway aufzurufen. Ich benutze Javascript für diese Aufgabe, da ich nicht einen einfachen Weg gefunden habe, das Ergebnis, das ich in Python erreichen will:

var apigClient = apigClientFactory.newClient({ 
    accessKey: 'aaaaaaaa', 
    secretKey: 'kkkkkkkk', 
    sessionToken: 'ssssss', 
    region: 'us-east-1' 
}); 

    apigClient.helloworldGet({},'') 
    .then(function(result){ 
     console.log("success!: " + result); 
    }).catch(function(result){ 
     console.log("FAIL: " + result); 
    }); 

Dies schlägt mit der Antwort:

No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access. The response had HTTP status code 403 

. 

Ich habe Setup CORS richtig wenn die OPTIONS-Anfrage erfolgreich ist. Wenn ich meinen Hauptzugriffsschlüssel und mein Geheimnis verwende, um das Skript zu authentifizieren, funktioniert es. Wenn ich die IAM-Anmeldeinformationen für die get/helloworld-Methode deaktivieren, wird das JavaScript erfolgreich ausgeführt. Ich habe eine Politik gebunden sowohl an der Auth und unauth Rollen, die Cognito Setup für die Identität Pool, diese Politik wie folgt aussieht:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
     { 
      "Sid": "dsfdsafasfdsfasdf", 
      "Effect": "Allow", 
      "Action": [ 
       "execute-api:Invoke" 
      ], 
      "Resource": [ 
       "arn:aws:execute-api:us-east-1:123456787:dsfsdfsdfs/dev/GET/helloworld" 
      ] 
     } 
    ] 
} 

Ich habe versucht, dies sowohl als Managed Politik Befestigung und eine Inline-Politik.

Was fehlt mir hier? Hat das etwas mit dem Versuch zu tun, auf einen nicht authentifizierten Benutzer zuzugreifen (obwohl der Rolle, die diesem Benutzertyp zugewiesen ist, eine Richtlinie beigefügt ist, die ihm den Zugriff auf die API ermöglichen sollte)?

Beachten Sie, dass hier keine Lamda beteiligt ist, nur eine einfache Taskdefinition in einer ECS-Autoscale-Gruppe, die das API-Gateway aufruft, wenn die Helloworld-Methode aufgerufen wird. Wie hier beschrieben: https://aws.amazon.com/blogs/compute/using-amazon-api-gateway-with-microservices-deployed-on-amazon-ecs/

Antwort

0

Es stellte sich heraus, dass es die Art war, wie ich das Token abrief. Ich war mit

sessionToken = identity.get_open_id_token(IdentityId=identity_id) 

Ich hätte das Token aus der Antwort bekam, wenn ich Anmeldeinformationen angefordert:

resp = identity.get_credentials_for_identity(IdentityId=identity_id) 
secretKey = resp['Credentials']['SecretKey'] 
accessKey = resp['Credentials']['AccessKeyId'] 
sessionToken = resp['Credentials']['SessionToken']