2017-10-08 14 views
1

J'essaye de faire une requête HTTP depuis une application angularjs vers une fonction lambda que j'ai configurée en utilisant serverless.Serverless AWS Lambda CORS Erreur

Voici ma fonction serverless.yaml

functions: 
    createcustomer: 
    handler: handler.createcustomer 
    events: 
     - http: post /createcustomer 
     cors: true 

Créer une fonction client

module.exports.createcustomer = (event, context, callback) => { 

    let customer = JSON.parse(event.body).customer; 

    service.create(customer, function(result) { 
     let response = { 
      statusCode: 200, 
      headers: { 
       "Access-Control-Allow-Credentials": true, 
       "Access-Control-Allow-Origin": "*", 
       "Content-Type": "application/json", 
      }, 
      body: JSON.stringify({ 
       result: 'Created Customer Successfully', 
       message: 'The account has been created!', 
       type: 'success', 
       customer: result 
      }) 
     }; 
     callback(null, response); 
    }); 
}; 

De mon app AngularJS Je l'appelle comme ça

app.factory('MyFactory', ['$http', function($http) { 
    return { 
     CreateCustomer: function(customer) {$http.post('<apipath>/createcustomer', {customer:customer})} 
    } 
}]); 

Cependant, je continue à obtenir cette erreur:

Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin ' http://localhost:5000 ' is therefore not allowed access. The response had HTTP status code 403.

J'ai essayé d'activer CORS dans la passerelle API sur la méthode POST, mais cela n'a pas changé le résultat.

J'ai aussi essayé d'installer CORS dans le fichier YAML explicitement

functions: 
    createcustomer: 
    handler: handler.createcustomer 
    events: 
     - http: post /createcustomer 
     cors: 
      origin: '*' 

Toujours pas de chance.

Est-ce que quelqu'un sait ce que je fais mal ici?

Une chose étrange est que je pourrais obtenir le poste fonctionne très bien via PostMan, mais si je l'essaie à travers mon application, il se brise.

Merci

MISE À JOUR

enter image description here

Quand je fais serverless deploy il apparaît dans AWS comme l'image ci-dessus et la méthode ressemble à ceci

enter image description here

Comme je l'ai dit avant, j'ai essayé d'activer CORS directement à partir de la console API Gateway, mais Il n'y avait pas de différence quand j'ai essayé d'appeler la méthode.

+0

Essayez en ajoutant l'en-tête Access-Control-Allow-Headers dans la réponse lambda. –

+0

@KaustubhKhare essayé, toujours pas de chance. – DevShadow

+0

On dirait bien sur ce que vous avez posté. Je vérifie la console API Gateway et la console Lambda pour vérifier si ces paramètres sont réellement reflétés et déployés correctement. – dashmug

Répondre

1

Votre mise à jour avec des captures d'écran montre que la méthode OPTIONS est pas configuré pour l'une de ces ressources. Lorsque vous activez CORS pour une ressource API Gateway dans la console, AWS configure automatiquement cette ressource.

Vous pouvez voir cela se produire dans la console AWS lorsque vous activez CORS pour une ressource, mais, bien sûr, votre serverless deploy remplace cette configuration. Pour que la ressource /createcustomer soit correctement configurée dans AWS par le déploiement sans serveur, vous pouvez réécrire cette partie de votre serveur sans serveur.YAML:

events: 
    - http: post /createcustomer 
    cors: true 

Pour ressembler à ceci:

events: 
    - http: 
     path: /createcustomer 
     method: post 
     cors: true 

Je ne suis pas un expert dans la syntaxe .yml du cadre, donc je ne peux pas expliquer exactement pourquoi.

Néanmoins, je l'ai confirmé qu'un fichier comme ceci:

functions: 
    deletecustomer: 
    handler: handler.deletecustomer 
    events: 
     - http: 
      path: /deletecustomer 
      method: post 
      cors: true 
    createcustomer: 
    handler: handler.createcustomer 
    events: 
     - http: post /createcustomer 
     cors: true 

va créer deux ressources dans l'API AWS Gateway, un correctement configuré pour CORS, et un manque la méthode OPTIONS:

Two resources, one correct and one missing OPTIONS

+0

Cela a fonctionné comme un charme, merci! – DevShadow

1

Voici la configuration qui pourrait aider. S'il vous plaît noter qu'il est toujours sûr d'être spécifique en permettant les origines de CORS. Il est donc préférable de verrouiller l'origine à localhost: {port-number}. En outre, vous pouvez également activer les informations d'identification sur les paramètres CORS. S'il vous plaît voir la config suivante Serverless comme exemple:

cors: 
 
    origin: 'http://localhost:4200' 
 
    headers: 
 
    - Content-Type 
 
    - X-Amz-Date 
 
    - Authorization 
 
    - X-Api-Key 
 
    - X-Amz-Security-Token 
 
    - X-Amz-User-Agent 
 
    allowCredentials: true