2017-06-26 1 views
0

J'envoie une requête POST à ​​un serveur auquel je suis propriétaire et auquel j'ai accès.La requête POST avec contrôle en amont contient l'origine autorisée mais les erreurs d'origine ne sont pas autorisées

Cela déclenche une demande de contrôle en amont CORS avec la méthode OPTIONS et renvoie les en-têtes de réponse suivants:

HTTP/1.1 200 
Allow: HEAD,POST,GET,OPTIONS 
Last-modified: Mon, 26 Jun 2017 13:57:08 BST 
Access-Control-Allow-Origin: http://localhost:3000 
Access-Control-Allow-Credentials: true 
Access-Control-Allow-Methods: POST, GET 
Access-Control-Allow-Headers: origin, content-type, accept, authorization 
Access-Control-Expose-Headers: Set-Cookie 
Content-Type: application/vnd.sun.wadl+xml 
Content-Length: 1126 

La requête POST rapports ultérieurs puis

Fetch API cannot load http://localhost:8080/api/reservation. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:3000' is therefore not allowed access. The response had HTTP status code 500. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.

en utilisant javascript fetch.

Comme indiqué ci-dessus, un POST à ​​mon point de terminaison /reservation entraîne une telle erreur. Cependant, les requêtes POST vers d'autres points de terminaison sur mon serveur sont réussies et n'obtiennent aucun rapport indiquant que l'origine n'est pas autorisée. Les deux exécutent le même code fetch; émettre OPTIONS contrôle en amont, puis POST.

var RestRequest = { 

    post: function(endpoint, payload, callback, secondCallback) { 

     fetch('http://localhost:8080/api' + endpoint, { 
      headers: { 
       'Accept': 'application/json', 
       'Content-Type': 'application/json', 
      }, 
      method: 'post', 
      credentials: 'include', 
      body: payload 
     }) 
     .then(function (response) { 
      return response.json() 
     }) 
     .then(function (result) { 
      callback(result) 
      if (secondCallback != null) { 
       secondCallback() 
      } 
     }) 
    } 
}; 

Pourquoi mon navigateur que l'origine plaint faisant la demande ne peut avoir accès lorsqu'un prévol CORS clairement autorisé à accéder à cette origine spécifique?

La modification des filtres de réponse CORS de mon serveur pour permettre toutes les origines entraîne le même message d'erreur. Faire les mêmes demandes à partir du plugin Postman réussit.

Répondre

1

Il est indiqué que la réponse contenait le code d'état HTTP 500, c'est donc différent de la réponse que vous avez envoyée (HTTP 200).

Vous avez probablement une erreur de serveur qui empêche l'ajout des en-têtes CORS à la réponse.

+0

Le code d'état 200 provenait de la requête OPTIONS de contrôle en amont CORS. – Shiri

+0

Droit désolé je n'ai pas remarqué, mais le problème est toujours le même. S'il y a une erreur 500 sur votre serveur, les en-têtes ne seront pas envoyés. Donc, le problème que vous avez n'est pas avec CORS, mais un autre bug sur votre serveur. –

+0

Il n'y a pas de bug sur le serveur car l'utilisation de Postman pour émettre exactement la même requête réussit. Il semble que cela puisse être un problème avec l'API 'fetch' de javascript car l'utilisation de' unirest' pour gérer les requêtes REST réussit également. Le code 500 semble provenir d'une requête POST incomplète, provoquant le serveur à lancer un 500 après le fait car il attend un corps dans la requête POST et n'en a pas reçu un car le navigateur a coupé la procédure quand il a réalisé que l'origine n'était pas t autorisé. Dans ce cas, je ne suis pas sûr de savoir pourquoi un type de requête POST l'a fait au serveur si ce n'était pas autorisé. – Shiri