Saya memiliki pengaturan yang melibatkan
Server frontend (Node.js, domain: localhost: 3000) <---> Backend (Django, Ajax, domain: localhost: 8000)
Browser <- webapp <- Node.js (Melayani aplikasi)
Browser (webapp) -> Ajax -> Django (Melayani permintaan POST ajax)
Sekarang, masalah saya di sini adalah dengan pengaturan CORS yang digunakan webapp untuk melakukan panggilan Ajax ke server backend. Di chrome, saya terus mendapatkan
Tidak dapat menggunakan wildcard di Access-Control-Allow-Origin ketika flag kredensial benar.
juga tidak berfungsi pada firefox.
Pengaturan Node.js saya adalah:
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();
};
Dan di Django saya menggunakan middleware ini bersamaan dengan ini
Webapp membuat permintaan seperti itu:
$.ajax({
type: "POST",
url: 'http://localhost:8000/blah',
data: {},
xhrFields: {
withCredentials: true
},
crossDomain: true,
dataType: 'json',
success: successHandler
});
Jadi, header permintaan yang dikirim webapp terlihat seperti:
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="***"
Dan inilah tajuk respons:
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
Di mana saya salah ?!
Sunting 1: Saya telah menggunakan chrome --disable-web-security
, tetapi sekarang ingin semuanya benar-benar berfungsi.
Sunting 2: Jawab:
Jadi, solusi untuk saya django-cors-headers
konfigurasi:
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/
)
http
, itu /
pada akhirnya. Saya kira menghilangkan http bisa berhasil, tetapi saya tidak benar-benar mengerjakan hal ini selama beberapa tahun, jadi tidak benar-benar tahu apa yang berhasil sekarang!