কর্স: শংসাপত্রের পতাকাটি সত্য হলে অ্যাক্সেস-কন্ট্রোল-মঞ্জুরি-উত্সে ওয়াইল্ডকার্ড ব্যবহার করতে পারে না


295

আমি জড়িত একটি সেটআপ আছে

সম্মুখভাগের সার্ভার (নোড.জেএস, ডোমেন: লোকালহোস্ট: 3000) <---> ব্যাকএন্ড (জাজানো, অ্যাজাক্স, ডোমেন: লোকালহোস্ট: 8000)

ব্রাউজার <- ওয়েব অ্যাপ <- নোড.জেএস (অ্যাপ্লিকেশন পরিবেশন করুন)

ব্রাউজার (ওয়েব অ্যাপ্লিকেশন) -> অ্যাজাক্স -> জ্যাঙ্গো (এজাক্স পোস্টের অনুরোধগুলি পরিবেশন করুন)

এখন, এখানে আমার সমস্যাটি সিওআরএস সেটআপের সাথে রয়েছে যা ওয়েব অ্যাপ ব্যাকএন্ড সার্ভারে অ্যাজাক্স কলগুলি করতে ব্যবহার করে। ক্রোমে, আমি পেতে থাকি

শংসাপত্রের পতাকাটি সত্য হলে অ্যাক্সেস-কন্ট্রোল-মঞ্জুরি-উত্সে ওয়াইল্ডকার্ড ব্যবহার করতে পারবেন না।

ফায়ারফক্সেও কাজ করে না।

আমার নোড.জেএস সেটআপটি হ'ল:

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

এবং জ্যাঙ্গোতে আমি এই মিডলওয়্যারগুলিও সাথে ব্যবহার করছি

ওয়েব অ্যাপ্লিকেশন অনুরোধ করে:

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

সুতরাং, ওয়েব অ্যাপ্লিকেশন প্রেরণের অনুরোধ শিরোনামগুলি দেখে মনে হচ্ছে:

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কনফিগার সমাধান :

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/
)

1
আমার জন্য এটি লোকালহোস্ট: 3000 পোস্ট ছাড়াই, এর মতো: CORS_ORIGIN_WHITELIST = ('লোকালহোস্ট: 3000',)
আন্দ্রে

আপনি কি বলতে চান যে আপনি একটি পিসিতে ফ্রন্টএন্ড এবং ব্যাকএন্ড বিকাশ করছেন?
fanhualuojin154873

কীভাবে বিভিন্ন পিসিতে ফ্রন্টএন্ড এবং ব্যাকএন্ড সম্পর্কে?
fanhualuojin154873

@ixaxaar আপনি কেন http ব্যবহার করে বলছেন আপনার জন্য কাজ করে? আমরা সবাই কেবল local 'লোকালহোস্ট: 3000'` কাজ করি।
244boy

@ 244boy হ্যাঁ, বিন্দুটি এটি নয় http, এটি /শেষে রয়েছে। আমি মনে করি যে এইচটিপি ছাড়াই কাজ করতে পারে তবে আমি কয়েক বছর ধরে এই জিনিসটিতে সত্যই কাজ করিনি, সুতরাং এখন কী কাজ করে তা সত্যিই জানেন না!
ixaxaar

উত্তর:


247

এটি সুরক্ষার একটি অংশ, আপনি এটি করতে পারবেন না। আপনি যদি শংসাপত্রের অনুমতি দিতে চান তবে আপনার Access-Control-Allow-Originঅবশ্যই ব্যবহার করা উচিত নয় *। আপনাকে সঠিক প্রোটোকল + ডোমেন + পোর্ট নির্দিষ্ট করতে হবে। রেফারেন্সের জন্য এই প্রশ্নগুলি দেখুন:

  1. অ্যাক্সেস-কন্ট্রোল-মঞ্জুরি-উত্সের ওয়াইল্ডকার্ড সাবডোমেন, পোর্ট এবং প্রোটোকল
  2. শংসাপত্রগুলির সাথে ক্রস অরিজিন রিসোর্স ভাগ করে নেওয়া

এছাড়াও *খুব অনুমতিযোগ্য এবং শংসাপত্রের ব্যবহারকে পরাস্ত করবে। সুতরাং সেট http://localhost:3000বা http://localhost:8000অনুমতি মেনু শিরোনাম হিসাবে।


45
তবে যদি একাধিক ডোমেন থাকে?
আরথ

13
@ আরথ আপনি ডোমেনের একটি তালিকা দিতে পারেন। সংশ্লিষ্ট প্রশ্ন: stackoverflow.com/questions/1653308/...
user568109

13
@ user568109 আপনি কি ব্যাখ্যা করতে পারবেন "এছাড়াও *খুব অনুমতিপ্রাপ্ত এবং শংসাপত্রের ব্যবহারকে পরাস্ত করবেন?"
হুগো উড

12
অনুরোধটি যদি মোবাইল ডিভাইস থেকে আসে, যেমন কর্ডোভার সাথে এটি ঘটতে পারে তবে কী?
খ্রিস্টান

8
@ খ্রিস্টিয়ান ধরণের পুরাতন, তবে এখনও যদি কেউ আগ্রহী হন তবে এই সমস্যাটি কেবল ব্রাউজারগুলিতে চলমান অ্যাপ্লিকেশনগুলির জন্যই ঘটে কারণ সুরক্ষার কারণে এই ত্রুটিটি ব্রাউজারটি ফেলেছে। অনুরোধ করার জন্য HTTP ক্লায়েন্ট ব্যবহার করে একটি মোবাইল অ্যাপ, পোস্টম্যান বা অন্য কোনও ব্যাকএন্ড কোডের মতো অন্য ক্লায়েন্টদের এই সমস্যা হবে না, তাই আপনাকে উত্স এবং সঠিক ডোমেন সম্পর্কে চিন্তা করতে হবে না ।
অ্যালিসন

32

আপনি যদি CORS মিডলওয়্যার ব্যবহার করছেন এবং আপনি withCredentialবুলিয়ান সত্য প্রেরণ করতে চান , আপনি CORS এর মতো কনফিগার করতে পারেন:

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

16

আপনি ব্যবহার করে থাকেন expressআপনি ব্যবহার করতে পারেন Cors আপনার মিডলওয়্যার লেখার তাই পরিবর্তে মত CORS করার অনুমতি প্যাকেজ;

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

app.use(cors());

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

12
আহ, এখন এটি আরও সুবিধাজনক, তবে ফলাফলটি একই :( app.use(cors({credentials: true}));
বিটিডাব্লু

1
আপনি পরীক্ষা করতে পারেন এই জ্যাঙ্গো করস মিডলওয়্যারটি সন্ধান করতে পারেন ।
বুলকান

1
সুতরাং আপনি দুটি Jango মিডলওয়্যার আছে? আমি কেবল django-cors-headerঅ্যাপ ব্যবহার করব । আপনি সেটিংসে লোকালহোস্ট যুক্ত করেছেন CORS_ORIGIN_WHITELISTএবং সেট CORS_ALLOW_CREDENTIALSকরেছেনTrue
বুলকান

1
হ্যাঁ, আগে চেষ্টা CORS_ORIGIN_ALLOW_ALL = TrueCORS_ORIGIN_WHITELIST = ( 'localhost' )CORS_ALLOW_CREDENTIALS = TrueAccess-Control-Allow-Credentials: true Access-Control-Allow-Origin: http://localhost:3000/ Access-Control-Allow-Methods: POST,GET,OPTIONS,PUT,DELETE Content-Type: application/json
করেও

5
এই ডকুমেন্টেশনটি পড়ার পরে: github.com/expressjs/corsuse আমি এই কনফিগারটি ব্যবহার করছি: app.use (কর্স ({শংসাপত্র: সত্য, উত্স: ' লোকালহোস্ট: 3001 '})); আমার জন্য কাজ করছে।
এলিল


6

আপনি যদি সমস্ত উত্সের অনুমতি দিতে চান এবং শংসাপত্রগুলি সত্য রাখতে চান তবে এটি আমার পক্ষে কাজ করেছে:

app.use(cors({
  origin: function(origin, callback){
    return callback(null, true);
  },
  optionsSuccessStatus: 200,
  credentials: true
}));

ইম্ম এটি বেশ খারাপ লোল প্রায় অনেকটা একই *: ডি
টিস্লেগাইটিস

@ স্ট্লেগাইটিস হাহ হ্যাঁ এ কারণেই এটি সমস্ত উত্সের জন্য কাজ করে তবে শংসাপত্র রাখে। আমি এটি সুরক্ষার জন্য প্রস্তাব দেব না তবে এটি কার্যকর হয়।
স্কুইরেল

2

(সম্পাদনা) পূর্বে পুনরুদ্ধার করা অ্যাড-অন আর উপলভ্য নয়, আপনি এটি অন্য একটি চেষ্টা করতে পারেন


ক্রোমে বিকাশের উদ্দেশ্যে, এই অ্যাডটি ইনস্টল করা সেই নির্দিষ্ট ত্রুটি থেকে মুক্তি পাবে:

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.

ইনস্টল করার পরে, আপনি আপনার URL প্যাটার্ন যোগ নিশ্চিত Intercepted URLsaddon এর (ক্লিক করে CORS , সবুজ বা লাল) আইকন এবং উপযুক্ত পাঠ্যবাক্স ভর্তি। এখানে যুক্ত করার একটি উদাহরণ URL প্যাটার্ন যা এর সাথে কাজ করবে http://localhost:8080তা হ'ল:*://*


আমি এটি ইনস্টল করার পরে পেয়েছি, কোন ধারণা?
জলিল

এটা আমার জন্য কাজ করেছে। সতর্কতা আপনার যদি অন্য অনুরূপ অ্যাড-অন থাকে তবে এটি চেষ্টা করার আগে আপনাকে এটি আনইনস্টল করতে হবে।
ফিলিপগো

দয়া করে ভাঙা লিঙ্কটি ঠিক করুন
লুক আরন

দেখে মনে হচ্ছে আসল
অ্যাডটি

1

এটি আমার পক্ষে উন্নয়নের ক্ষেত্রে কাজ করে তবে আমি পরামর্শ দিতে পারি না যে উত্পাদনে, এটি কাজটি করার একটি ভিন্ন উপায় যা এখনও উল্লেখ করা হয়নি তবে সম্ভবত সেরা নয় not যাইহোক এখানে যায়:

আপনি অনুরোধটি থেকে উত্সটি পেতে পারেন, তারপরে প্রতিক্রিয়া শিরোনামে এটি ব্যবহার করুন। এক্সপ্রেসে এটি কেমন দেখাচ্ছে:

app.use(function(req, res, next) {
  res.header('Access-Control-Allow-Origin', req.header('origin') );
  next();
});

আপনার অজগর সেটআপটির সাথে এটি দেখতে কেমন তা আমি জানি না তবে এটি অনুবাদ করা সহজ হওয়া উচিত।


মজিলা দেব ডক্স অনুরোধ থেকে একটিকে অনুমোদিত উত্সটি পরিবর্তনের ধারণার উপর প্রসারিত করুন। এটি একটি 'বিভিন্ন: মূল' এইচটিটিপি প্রতিক্রিয়া শিরোনাম এবং শ্বেতলিস্ট অনুমতিপ্রাপ্ত ডোমেন যোগ করার পরামর্শ দেওয়া হয়।
রামজিস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.