CORS: ne peut pas utiliser de Joker dans Access-Control-Allow-Origin lorsque le drapeau de vérification des références est true

j'ai une installation mettant en cause la

Interface serveur (Nœud.js, domaine: localhost:3000) Backend (Django, Ajax, domaine: localhost:8000)

Navigateur <-- webapp <-- Nœud.js (Servir de l'application)

Navigateur (webapp) --> Ajax --> Django(Servir ajax requêtes POST)

maintenant, mon problème ici est avec la configuration de CORS que le webapp utilise pour faire des appels Ajax vers le serveur d'arrière-plan. Dans chrome, je reçois

ne peut pas utiliser de Joker dans Access-Control-Allow-Origin lorsque le drapeau de vérification des références est true.

ne marche pas sur firefox non plus.

Mon Noeud.js setup est:

var allowCrossDomain = function(req, res, next) {
    res.header('Access-Control-Allow-Origin', 'http://localhost:8000/');
    res.header('Access-Control-Allow-Credentials', true);
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    next();
};

et dans Django j'utilise ce middleware avec ce

La webapp fait des demandes en tant que tel:

$.ajax({
    type: "POST",
    url: 'http://localhost:8000/blah',
    data: {},
    xhrFields: {
        withCredentials: true
    },
    crossDomain: true,
    dataType: 'json',
    success: successHandler
});

ainsi, les en-têtes de demande que le webapp envoie ressemble à:

Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: "Origin, X-Requested-With, Content-Type, Accept"
Access-Control-Allow-Methods: 'GET,PUT,POST,DELETE'
Content-Type: application/json 
Accept: */*
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Cookie: csrftoken=***; sessionid="***"

et voici l'en-tête de réponse:

Access-Control-Allow-Headers: Content-Type,*
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST,GET,OPTIONS,PUT,DELETE
Content-Type: application/json

Où est-ce que je vais mal?!

Edit 1: j'ai utilisé chrome --disable-web-security , mais maintenant je veux que les choses fonctionnent réellement.

Edit 2: Réponse:

Donc, pour moi, la solution django-cors-headers config:

CORS_ORIGIN_ALLOW_ALL = False
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_WHITELIST = (
    'http://localhost:3000' # Here was the problem indeed and it has to be http://localhost:3000, not http://localhost:3000/
)
194
demandé sur ixaxaar 2013-11-02 19:18:28

4 réponses

C'est une partie de la sécurité, vous ne pouvez pas le faire. Si vous voulez autoriser les justificatifs d'identité, alors votre Access-Control-Allow-Origin ne doit pas utiliser * . Vous devrez spécifier le protocole exact + domaine + port. Pour référence, voir ces questions:

  1. Access-Control-Allow-Origin wildcard sous-domaines, ports et protocoles
  2. Origine de la Croix de Partage de Ressources avec des informations d'Identification

en plus de * est trop permissif et irait à l'encontre de l'utilisation des justificatifs d'identité. Ainsi, définissez http://localhost:3000 ou http://localhost:8000 comme l'en-tête allow origin.

171
répondu user568109 2017-05-23 12:26:10

si vous utilisez express vous pouvez utiliser le paquet cors pour autoriser les CORS comme ça au lieu d'écrire votre middleware;

var express = require('express')
, cors = require('cors')
, app = express();

app.use(cors());

app.get(function(req,res){ 
  res.send('hello');
});
11
répondu Bulkan 2013-11-02 15:22:58

si vous utilisez CORS middleware et que vous voulez envoyer withCredential boolean true, vous pouvez configurer CORS comme ceci:

var cors = require('cors');    
app.use(cors({credentials: true, origin: 'http://localhost:3000'}));
10
répondu Hamid 2017-09-18 02:43:40

l'essayer:

const cors = require('cors')

const corsOptions = {
    origin: 'http://localhost:4200',
    credentials: true,

}
app.use(cors(corsOptions));
2
répondu Iron shield 2017-12-24 11:38:46