0

Ich benutze Aws APi Gateway und API-Gateway benutzerdefinierte Autorisierung. Der Code, den ich für api Gateway benutzerdefinierte authorizer haben, ist wie folgt:Kann nicht aws API Gateway über Ajax

console.log('Loading function'); 

exports.handler = (event, context, callback) => { 
var token = event.authorizationToken; 
// Call oauth provider, crack jwt token, etc. 
// In this example, the token is treated as the status for simplicity. 

switch (token.toLowerCase()) { 
    case 'allow': 
     callback(null, generatePolicy('user', 'Allow', event.methodArn)); 
     break; 
    case 'deny': 
     callback(null, generatePolicy('user', 'Deny', event.methodArn)); 
     break; 
    case 'unauthorized': 
     callback("Unauthorized"); // Return a 401 Unauthorized response 
     break; 
    default: 
     callback("Error: Invalid token"); 
} 
}; 

var generatePolicy = function(principalId, effect, resource) { 
var authResponse = {}; 

authResponse.principalId = principalId; 
if (effect && resource) { 
    var policyDocument = {}; 
    policyDocument.Version = '2012-10-17'; // default version 
    policyDocument.Statement = []; 
    var statementOne = {}; 
    statementOne.Action = 'execute-api:Invoke'; // default action 
    statementOne.Effect = effect; 
    statementOne.Resource = resource; 
    policyDocument.Statement[0] = statementOne; 
    authResponse.policyDocument = policyDocument; 
} 

// Can optionally return a context object of your choosing. 
authResponse.context = {}; 
authResponse.context.stringKey = "stringval"; 
authResponse.context.numberKey = 123; 
authResponse.context.booleanKey = true; 
return authResponse; 

wie Sie sehen können, ist es nur ein einfaches Mock-up Beispiel in aws Website zur Verfügung gestellt. Dann habe ich meine Methode get in API-Gateway mit diesem Autorisierungsprogramm konfiguriert. Auch bei der Methodenausführung habe ich einen benutzerdefinierten headear namens authorizationToken hinzugefügt, der vom Autor verwendet wird.

Wenn ich der Postbote alles verwenden ist gut:

enter image description here

Allerdings, wenn ich versuche es über Ajax zu nennen wie folgt ich die folgende Fehlermeldung erhalten:

XMLHttpRequest cannot load https://590vv3bkda.execute-api.us-east-1.amazonaws.com/hamedstg/tjresource/story. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8080' is therefore not allowed access. The response had HTTP status code 401. 

Hier ist meine Ajax call:

Auch ist es bemerkenswert, dass ich ena bluteten CORS auf der api in aws.

Kann jemand helfen?

+0

Ersetzen Sie beim Zugriff auf Ihre Testseite entweder "lvh.me: 8080" oder "www.127.0.0.1.xip.ip: 8080" anstelle von "localhost: 8080", um festzustellen, ob dies einen Unterschied macht. –

+0

@ Michael-sqlbot Wie kann ich diese Einrichtung in aws Api-Gateway tun? –

Antwort

1

Haben Sie seit dem Aktivieren von CORS irgendwelche Methoden oder Ressourcen hinzugefügt? Wenn dies der Fall ist, führen Sie den CORS-Assistenten erneut aus und implementieren Sie ihn erneut auf Ihrer Bühne.

Stellen Sie außerdem sicher, dass die OPTIONS-Methode für Ihre Ressource den Kundenautorizer nicht erfordert/verwendet. OPTIONEN müssen für alle offen sein, da der Browser sie in einigen Fällen für Vor-Flug-CORS-Prüfungen in Ihrem Namen aufrufen wird.

Es gibt auch ein bekanntes Problem, dass, wenn ein API-Gateway-Aufruf aus irgendeinem Grund fehlschlägt, die CORS-Header nicht festgelegt sind und Sie daher erhalten, dass "Nein 'Access-Control-Allow-Origin Header ist vorhanden" -Fehler , wenn die Ursache etwas völlig anderes ist. Versuchen Sie, die Entwicklerprotokollierung in Ihrem Browser zu aktivieren, holen Sie die genaue Anforderung an die API (möglicherweise eine OPTIONS-Methode), und versuchen Sie dieselbe Anforderung als Testaufruf über die API Gateway-Konsole. Dadurch können Sie die Ausgabe und die Protokolle anzeigen, um festzustellen, ob ein anderes Problem vorliegt.

+0

Danke dein Beitrag gab mir einen guten Hinweis zu starten. Was mir neben deinem Vorschlag gefehlt hat, war im Enable-Cors-Screen Ich habe den Custom-Header hinzugefügt, den ich so übergebe, dass ich den Empfang des genannten Headers erlaube –