ajax - CORS: لا يمكن استخدام حرف البدل في Access-Control-Allow-Origin عندما يكون علامة بيانات الاعتماد صحيحة




django node.js (3)

لدي الإعداد الذي تنطوي عليه

خادم الواجهة الأمامية (Node.js ، النطاق: localhost: 3000) <---> Backend (Django، Ajax، domain: localhost: 8000)

المتصفح <- webapp <- Node.js (عرض التطبيق)

المتصفح (webapp) -> Ajax -> Django (سيرفر ajax POST)

الآن ، مشكلتي هنا مع إعداد CORS الذي يستخدمه webapp لإجراء مكالمات Ajax إلى الخادم الخلفي. في الكروم ، استمر في الحصول على

لا يمكن استخدام أحرف البدل في Access-Control-Allow-Origin عندما تكون علامة بيانات الاعتماد صحيحة.

لا يعمل على فايرفوكس سواء.

إعداد My Node.js هو:

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();
};

وفي Django أستخدم هذه الوسيطة مع هذا

يجعل تطبيق الويب Webapp الطلبات على هذا النحو:

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

لذا ، تبدو رؤوس الطلبات التي يرسلها تطبيق webapp على النحو التالي:

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="***"

وإليك عنوان الرد:

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

هل أنا على خطأ؟!

التعديل 1: كنت أستخدم chrome --disable-web-security ، ولكننا نريد الآن أن تعمل الأشياء بالفعل.

تحرير 2: الجواب:

لذا ، الحل بالنسبة لي 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/
)

إذا كنت تستخدم express يمكنك استخدام حزمة cors للسماح لـ CORS مثل ذلك بدلاً من كتابة البرامج الوسيطة الخاصة بك؛

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

app.use(cors());

app.get(function(req,res){ 
  res.send('hello');
});

إذا كنت تستخدم برامج وسيطة من CORS وترغب في إرسالها مع withCredential منطقية حقيقية ، يمكنك تكوين CORS على withCredential :

var cors = require('cors');    
app.use(cors({credentials: true, origin: 'http://localhost:3000'}));

هذا جزء من الأمان ، لا يمكنك فعل ذلك. إذا كنت تريد السماح ببيانات الاعتماد Access-Control-Allow-Origin فيجب ألا يستخدم Access-Control-Allow-Origin * . سيكون عليك تحديد بروتوكول + نطاق + البروتوكول الدقيق. للإشارة ، راجع هذه الأسئلة:

  1. Access-Control-Allow-Origin بدل النطاقات الفرعية والمنافذ والبروتوكولات
  2. عبر الموارد تقاسم الموارد مع بيانات الاعتماد

الى جانب ذلك * هو متساهل جدا وسوف هزيمة استخدام أوراق الاعتماد. لذلك ، اضبط http://localhost:3000 أو http://localhost:8000 باعتباره رأس أصل السماح.





django-cors-headers