Saya memiliki sebuah penataan yang melibatkan
Frontend server (Node.js domain: localhost:3000) <---> Backend (Django, Ajax, domain: localhost:8000)
Browser <-- webapp <-- Node.js (Melayani aplikasi)
Browser (webapp) --> Ajax --> Django(Melayani ajax POST permintaan)
Sekarang, masalah saya di sini adalah dengan CORS setup yang webapp digunakan untuk membuat panggilan Ajax ke backend server. Di chrome, saya terus mendapatkan
Tidak dapat menggunakan wildcard di Access-Control-Allow-Origin ketika kredensial bendera adalah benar.
doesn't bekerja pada firefox baik.
Saya Node.js setup:
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 I'm menggunakan ini middleware seiring dengan ini
Webapp membuat permintaan seperti:
$.ajax({
type: "POST",
url: 'http://localhost:8000/blah',
data: {},
xhrFields: {
withCredentials: true
},
crossDomain: true,
dataType: 'json',
success: successHandler
});
Jadi, header permintaan yang webapp mengirimkan 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 berikut's respon header:
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 aku pergi salah?!
Edit 1: I've telah menggunakan chrome --disable-web-keamanan
, tapi sekarang ingin hal-hal yang benar-benar bekerja.
Edit 2: Jawaban:
Jadi, solusi untuk saya django-cors-header
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/
)
Ini adalah bagian dari keamanan, anda tidak dapat melakukan itu. Jika anda ingin memungkinkan kredensial kemudian anda Access-Control-Allow-Origin
tidak harus menggunakan *
. Anda akan memiliki untuk menentukan tepat protokol + domain + port. Untuk referensi lihat pertanyaan-pertanyaan ini :
Selain *
terlalu permisif dan akan mengalahkan gunakan kredensial. Jadi set http://localhost:3000
atau http://localhost:8000
karena memungkinkan asal header.
Jika anda menggunakan CORS middleware dan anda ingin mengirim withCredential
boolean true, anda dapat mengkonfigurasi CORS seperti ini:
var cors = require('cors');
app.use(cors({credentials: true, origin: 'http://localhost:3000'}));
Jika anda menggunakan express
anda dapat menggunakan cors paket untuk memungkinkan CORS suka jadi, bukannya menulis middleware;
var express = require('express')
, cors = require('cors')
, app = express();
app.use(cors());
app.get(function(req,res){
res.send('hello');
});
coba ini:
const cors = require('cors')
const corsOptions = {
origin: 'http://localhost:4200',
credentials: true,
}
app.use(cors(corsOptions));
Untuk kepentingan pembangunan di Chrome, menginstal add on akan menyingkirkan kesalahan tertentu:
Access to XMLHttpRequest at 'http://192.168.1.42:8080/sockjs-node/info?t=1546163388687'
from origin 'http://localhost:8080' has been blocked by CORS policy: The value of the
'Access-Control-Allow-Origin' header in the response must not be the wildcard '*'
when the request's credentials mode is 'include'. The credentials mode of requests
initiated by the XMLHttpRequest is controlled by the withCredentials attribute.
Setelah menginstal, pastikan anda menambahkan url pola untuk Dicegat Url
dengan mengklik pada AddOn's (CORS, hijau atau merah) ikon dan mengisi sesuai textbox. Contoh pola URL untuk menambahkan di sini bahwa akan bekerja dengan http://localhost:8080
akan sama: *://*
Ini bekerja untuk saya dalam pengembangan tapi aku bisa't menyarankan bahwa dalam produksi, it's hanya cara yang berbeda untuk mendapatkan pekerjaan yang dilakukan yang belum't telah disebutkan, namun mungkin bukan yang terbaik. Pokoknya here goes:
Anda bisa mendapatkan asal dari permintaan, maka gunakan yang di respon header. Berikut ini's bagaimana tampilannya di check:
aplikasi.menggunakan(function(req, res, next) { res.header('Access-Control-Allow-Origin', req.header('asal') ); next(); });
Saya don't tahu apa yang akan terlihat seperti dengan python setup tapi itu harus mudah untuk menerjemahkan.