web-dev-qa-db-fra.com

Comment fonctionnent les systèmes CORS et Access-Control-Allow-Headers?

J'essaie de faire une demande CORS POST de domain.com à a.domain.com.

Mon javascript ressemble à ceci

$('#fileupload').fileupload({
  xhrFields: {
    withCredentials: true
  },
  dataType: 'json',
  url: $('#fileupload').data('path'),
  singleFileUploads: true,
  add: function(e, data){
    data.submit();
  }
});

Au début, je vois la route OPTIONS appelée comme suit:

Request URL: https://a.domain.com/some/route
Request Method:OPTIONS
Status Code:200 OK

DEMANDE D'OPTIONS:

Access-Control-Request-Headers:Origin, content-type, accept
Access-Control-Request-Method:POST
Host:a.domain.com
Origin:http://domain.com:3000
Referer:http://domain.com:3000/home

RÉPONSE AUX OPTIONS

Access-Control-Allow-Credentials:true
Access-Control-Allow-Methods:POST
Access-Control-Allow-Origin:http://domain.com:3000
Connection:keep-alive
Content-Length:0
Content-Type:text/html;charset=utf-8

Cette demande revient avec un 200 comme indiqué. Sur mon serveur, j’ai le même itinéraire avec la méthode POST et c’est ce que j’obtiens en retour après le OPTIONS

Request URL:https://a.domain.com/some/route

DEMANDE DE POST

Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryjwr5Pk7WBcfzMdbO
Origin:http://domain.com:3000
Referer:http://domain.com:3000/home

et la demande POST est annulée/échoue.

Ma question est la suivante: dois-je également avoir le contrôle d'accès-autoriser-origine sur le contrôleur POST)?

J'ai un cookie pour l'autorisation qui a le domaine .domain.com ce cookie a été envoyé une fois dans une demande et il n’est pas envoyé pour le moment. Une idée de pourquoi ça arriverait?

62
Leo Correa

Oui, vous devez avoir l'en-tête Access-Control-Allow-Origin: http://domain.com:3000 ou Access-Control-Allow-Origin: * à la fois dans la réponse OPTIONS et dans la réponse POST. Vous devez inclure l'en-tête Access-Control-Allow-Credentials: true sur la réponse POST également).

Votre réponse à OPTIONS doit également inclure l’en-tête Access-Control-Allow-Headers: Origin, content-type, accept pour correspondre à l'en-tête demandé.

81
monsur