wake-up-neo.net

AWS API Gateway Es ist kein Header 'Access-Control-Allow-Origin' vorhanden

Ich habe ein Problem mit dem API-Gateway und ich habe alle anderen SO -Antworten in diesen AWS-Foren durchgegangen und habe ihre Dokumente durchlaufen, aber immer noch keine Freude.

Ich versuche, eine API mit einem AWS-API-Gateway einzurichten, das eine Lambda-Funktion aufruft, die eine Tabelle in DynamoDB liest/schreibt.

Die Lambda-Funktion für DynamoDB funktioniert. Ich habe in AWS eine API erstellt und dafür eine Methode GET und OPTIONS erstellt. Ich habe gelesen, dass AWS die OPTIONS nicht nur für GET/POST erzwingt, aber ich habe einen Preflight-Fehler in meinem Ajax-Aufruf erhalten, als es keine OPTIONS-Methode gab. Ich fügte einen hinzu.

Um jetzt nur Fortschritte zu erzielen, verwende ich keinen API-Schlüssel oder keine Autorisierung. Ich kann meine GET-Methode erfolgreich mit POSTMAN aufrufen, das den Inhalt der DynamoDB-Tabelle zurückgibt.

Aber wenn ich versuche, einen JQuery-Ajax-Anruf zu verwenden, bekomme ich

No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.

Ich kann mit Chrome-Entwicklertools unter der Registerkarte "Netzwerk" sehen, dass die OPTIONS-Methode den Status 200 zurückgibt und der GET-Status 200, jedoch mit dem obigen Fehler.

Ich habe versucht, CORS sowohl für die Methoden OPTIONS als auch für GET zu aktivieren, habe die API nach jeder Änderung erneut bereitgestellt, habe Folgendes versucht ( http://enable-cors.org/server_awsapigateway.html ), bekomme aber immer die gleicher Fehler in der Konsole.

Ich führe den Ajax-Aufruf von einer Datei auf meinem Desktop aus. Daher ist Origin null, da die Seite in S3 als einzige Webseitenanwendung in JS implementiert wird.

Wenn ich CORS für mein GET und OPTIONEN aktiviert habe, kann ich sehen, dass Access-Control-Allow-Header 'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token' ist und Access-Control-Allow-Origin * '*' ist.

Mein Ajax-Anruf sieht wie folgt aus. Ich habe auch versucht, die genauen Kopfzeilen zu kopieren, die POSTMAN verwendet, wobei die Kopfzeile für die Autorisierung festgelegt ist (die ich jetzt in AWS deaktiviert habe), aber ich bekomme immer den gleichen Fehler oben 

var awsHeaders = {};
awsHeaders['X-Amz-Date'] = '20161127T171734';

$('#add, #cloud').click(function() {

    $.ajax({

        type: 'GET',
        headers: awsHeaders,
        dataType : "json",
        url: '...',
        success: function (res) {

            console.log('response in GET:');
            console.log(res);

        },
        error: function(data) {
            console.log('in error');
            console.log(data);
        }

    });

});

Kann jemand ein Licht auf das geben, was mir fehlt?

Danke vielmals

Update Siehe unten, wie ich dieses Problem gemäß den DigitalKapteain-Kommentaren gelöst habe - indem Sie in der Antwort meiner Lambda-Funktion den Header 'Access-Control-Allow-Origin': '*' setzen. Ich habe dies in den AWS-Dokumenten gesucht, konnte es aber nicht finden. Dieser Link beschreibt den Unterschied zwischen Lambda und Lambda Proxy und erläutert, was bei der Verwendung von CORS zu tun ist https://serverless.com/framework/docs/providers/aws/events/apigateway/

21
user12345

Die Antwort auf die GET-Anforderung an die Lambda-Funktion muss auch den Access-Control-Allow-Origin-Header enthalten.

43
Digitalkapitaen

Die Antwort von Digitalkapitaen ist richtig. Hier ist der Code, um jemandem die Mühe zu ersparen, nachzusehen wie man einen HTTP-Antwortheader in Lambda setzt:

exports.handler = function(event, context, callback) {
    callback(null, {
        "statusCode": 200,
        "headers": { 
            "Access-Control-Allow-Origin": "*" 
        }
    });
};
21

Wenn dies immer noch nicht funktioniert, stellen Sie sicher, dass JSON.stringify () Ihr Json-Objekt verwendet, wenn Sie $ .ajax verwenden. Wenn nicht, wird immer noch ein Fehler zurückgegeben, der behauptet, ein Fehler im Zusammenhang mit CORS zu sein. Wenn Sie jedoch dasselbe Json-Objekt mit Postman senden, ist die Anforderung erfolgreich. Versuch es...

5
rickfarina

Nachfolgend finden Sie den Code für jemanden, der die Lösung von @ Digitalkapitaen in Flask integrieren möchte:

app = Flask(__name__)
cors = CORS(app, resources={r"/*": {"origins": "*"}})

@app.route("/")
def helloWorld():
  return "Hello, cross-Origin-world!"

Installieren Sie das Flask-Cors-Modul wie folgt:

pip install -U flask-cors
0
captainblack