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/
)
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:
- Access-Control-Allow-Origin wildcard sous-domaines, ports et protocoles
- 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.
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');
});
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'}));
l'essayer:
const cors = require('cors')
const corsOptions = {
origin: 'http://localhost:4200',
credentials: true,
}
app.use(cors(corsOptions));