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!Jawaban:
Ini adalah bagian dari keamanan, Anda tidak dapat melakukan itu. Jika Anda ingin mengizinkan kredensial maka Anda
Access-Control-Allow-Origin
tidak boleh menggunakannya*
. Anda harus menentukan protokol + domain + port yang tepat. Untuk referensi, lihat pertanyaan-pertanyaan ini:Selain
*
itu terlalu permisif dan akan mengalahkan penggunaan kredensial. Jadi aturhttp://localhost:3000
atauhttp://localhost:8000
sebagai header boleh asal.sumber
*
itu terlalu permisif dan akan mengalahkan penggunaan kredensial."?Jika Anda menggunakan CORS middleware dan Anda ingin mengirim
withCredential
boolean true, Anda dapat mengkonfigurasi CORS seperti ini:sumber
Jika Anda menggunakan,
express
Anda dapat menggunakan paket kor untuk memungkinkan CORS seperti itu alih-alih menulis middleware Anda;sumber
app.use(cors({credentials: true}));
django-cors-header
aplikasi. Pastikan Anda menambahkan localhost keCORS_ORIGIN_WHITELIST
pengaturan dan setCORS_ALLOW_CREDENTIALS
keTrue
CORS_ORIGIN_ALLOW_ALL = True
,CORS_ORIGIN_WHITELIST = ( 'localhost' )
danCORS_ALLOW_CREDENTIALS = True
saya mendapatkan header ini:Access-Control-Allow-Credentials: true Access-Control-Allow-Origin: http://localhost:3000/ Access-Control-Allow-Methods: POST,GET,OPTIONS,PUT,DELETE Content-Type: application/json
Cobalah:
sumber
Jika Anda ingin mengizinkan semua asal dan menjaga kredensial tetap benar, ini bekerja untuk saya:
sumber
(Sunting) Add-on yang direkomendasikan sebelumnya tidak tersedia lagi, Anda dapat mencoba yang lain ini
Untuk tujuan pengembangan di Chrome, menginstal pengaya ini akan menghilangkan kesalahan khusus itu:
Setelah menginstal, pastikan Anda menambahkan pola url Anda
Intercepted URLs
dengan mengklik ikon AddOn ( CORS , hijau atau merah) dan mengisi kotak teks yang sesuai. Contoh pola URL untuk ditambahkan di sini yang akan berfungsihttp://localhost:8080
adalah:*://*
sumber
Ini bekerja untuk saya dalam pengembangan tetapi saya tidak dapat menyarankan bahwa dalam produksi, itu hanya cara berbeda untuk menyelesaikan pekerjaan yang belum disebutkan tetapi mungkin bukan yang terbaik. Pokoknya begini:
Anda bisa mendapatkan asal dari permintaan, lalu menggunakannya di tajuk respons. Begini tampilannya di express:
Saya tidak tahu apa yang akan terlihat dengan pengaturan python Anda tetapi itu harus mudah diterjemahkan.
sumber