আনতে এবং মোডে পাস করার চেষ্টা করছেন: নন-কর্স


166

http://catfacts-api.appspot.com/api/facts?number=99পোস্টম্যানের মাধ্যমে আমি এই শেষ পয়েন্টটি আঘাত করতে পারি এবং এটি ফিরে আসেJSON

অতিরিক্তভাবে আমি তৈরি-প্রতিক্রিয়া-অ্যাপ ব্যবহার করছি এবং কোনও সার্ভার কনফিগারেশন সেট আপ করা এড়াতে চাই।

আমার ক্লায়েন্ট কোডে আমি fetchএকই জিনিসটি ব্যবহার করার চেষ্টা করছি , তবে আমি ত্রুটি পেয়েছি:

অনুরোধকৃত উত্সটিতে কোনও 'অ্যাক্সেস-কন্ট্রোল-অলজন-অরিজিন' শিরোনাম উপস্থিত নেই। উত্স ' http: // লোকালহোস্ট: 3000 ' তাই অ্যাক্সেসের অনুমতি নেই। যদি কোনও অস্বচ্ছ প্রতিক্রিয়া আপনার প্রয়োজনগুলি সরবরাহ করে তবে অনুরোধের মোডটি 'নো-কর্স' এ সেট করুন CORS অক্ষম করে রিসোর্স আনতে।

সুতরাং আমি একটি বস্তুতে প্রবেশ করার চেষ্টা করছি, আমার আনতে যা CORS অক্ষম করবে, এর মতো:

fetch('http://catfacts-api.appspot.com/api/facts?number=99', { mode: 'no-cors'})
  .then(blob => blob.json())
  .then(data => {
    console.table(data);
    return data;
  })
  .catch(e => {
    console.log(e);
    return e;
  });

মজার বিষয় হচ্ছে যে ত্রুটিটি আমি পেয়েছি তা আসলে এই ফাংশনটির সাথে একটি বাক্য গঠন ত্রুটি। আমি নিশ্চিত না যে আমার আসলটি নষ্ট fetchহয়ে গেছে, কারণ যখন আমি {মোড: 'নো-কর্স'} অবজেক্টটি সরিয়ে ফেলি এবং এটি অন্যরকম ইউআরএল সরবরাহ করি এটি ঠিক কাজ করে।

আমি বস্তুটিতে পাস করার চেষ্টাও করেছি { mode: 'opaque'}, তবে এটি উপরে থেকে মূল ত্রুটিটি ফিরিয়ে দেয়।

আমি বিশ্বাস করি কর্স অক্ষম করা আমার যা করা দরকার তা .. আমি কী অনুপস্থিত?

উত্তর:


291

mode: 'no-cors'ম্যাজিকভাবে জিনিসগুলি কাজ করবে না। আসলে এটি বিষয়গুলিকে আরও খারাপ করে তোলে, কারণ এর একটি প্রভাবটি ব্রাউজারগুলিকে বলতে হয়, "আমার ফ্রন্টএন্ড জাভাস্ক্রিপ্ট কোডটি সমস্ত পরিস্থিতিতে প্রতিক্রিয়া বডি এবং শিরোনামের বিষয়বস্তুগুলি দেখার থেকে অবরুদ্ধ করুন” " অবশ্যই আপনি এটি কখনই চান না।

ফ্রন্টএন্ড জাভাস্ক্রিপ্টের ক্রস-অরিজিন অনুরোধগুলির সাথে কী ঘটে তা হ'ল ডিফল্টরূপে ব্রাউজারগুলি সংস্থান-উত্স অ্যাক্সেস করা থেকে সীমান্ত কোড অবরুদ্ধ করে। যদি Access-Control-Allow-Originকোনও প্রতিক্রিয়া হয় তবে ব্রাউজারগুলি সেই ব্লকিংটি শিথিল করবে এবং আপনার কোডটিকে প্রতিক্রিয়া অ্যাক্সেস করার অনুমতি দেবে।

তবে যদি কোনও সাইট Access-Control-Allow-Originতার প্রতিক্রিয়াগুলিতে কোনও প্রেরণ না করে তবে আপনার সীমানা কোডটি সরাসরি সেই সাইট থেকে প্রতিক্রিয়াগুলি অ্যাক্সেস করতে পারে না। বিশেষত, আপনি নির্দিষ্ট করে এটি ঠিক করতে পারবেন না mode: 'no-cors'(বাস্তবে নিশ্চিত হয়ে যাবে যে আপনার সীমান্ত কোড প্রতিক্রিয়ার সামগ্রীগুলিতে অ্যাক্সেস করতে পারে না)।

তবে, একটি জিনিস যা কাজ করবে : আপনি যদি কোনও অনুরোধটি একটি কর্স প্রক্সি মাধ্যমে প্রেরণ করেন তবে :

var proxyUrl = 'https://cors-anywhere.herokuapp.com/',
    targetUrl = 'http://catfacts-api.appspot.com/api/facts?number=99'
fetch(proxyUrl + targetUrl)
  .then(blob => blob.json())
  .then(data => {
    console.table(data);
    document.querySelector("pre").innerHTML = JSON.stringify(data, null, 2);
    return data;
  })
  .catch(e => {
    console.log(e);
    return e;
  });
<pre></pre>

দ্রষ্টব্য: আপনি যখন https://cors-anywhere.herokuapp.com ব্যবহার করার চেষ্টা করতে যান, আপনি এটি নীচে পেয়ে গেছেন , আপনি খুব সহজেই হরোকুকে নিজের প্রক্সিটি আক্ষরিক মাত্র ২-৩ মিনিটে 5 কমান্ডের সাহায্যে স্থাপন করতে পারেন:

git clone https://github.com/Rob--W/cors-anywhere.git
cd cors-anywhere/
npm install
heroku create
git push heroku master

এই কমান্ডগুলি চালনার পরে, আপনি আপনার নিজের সিওআরএস যে কোনও জায়গায় যে কোনও সার্ভারের সাথে চলমান সমাপ্ত করবেন, যেমন, https://cryptic-headland-94862.herokuapp.com/ । সুতরাং আপনার অনুরোধটি ইউআরএলটির সাথে https://cors-anywhere.herokuapp.comউপসর্গ করার পরিবর্তে এটি আপনার নিজের উদাহরণের জন্য ইউআরএলকে উপস্থাপন করুন; উদাহরণস্বরূপ, https://cryptic-headland-94862.herokuapp.com/https://example.com


http://catfacts-api.appspot.com/api/facts?number=99পোস্টম্যানের মাধ্যমে আমি এই শেষ পয়েন্টটি আঘাত করতে পারি

https://developer.mozilla.org/en-US/docs/Web/HTTP/Acecess_control_CORS কেন এটি ব্যাখ্যা করে যে আপনি পোস্টম্যানের মাধ্যমে প্রতিক্রিয়াটি অ্যাক্সেস করতে পারলেও ব্রাউজারগুলি আপনাকে সামনের দিক থেকে প্রতিক্রিয়াটিকে ক্রস-অ্যাসেসে প্রবেশ করতে দেয় না জাভাস্ক্রিপ্ট কোডটি কোনও ওয়েব অ্যাপে চলমান থাকে যদি না প্রতিক্রিয়াটিতে Access-Control-Allow-Originপ্রতিক্রিয়া শিরোনাম থাকে।

http://catfacts-api.appspot.com/api/facts?number=99 এর কোনও Access-Control-Allow-Originপ্রতিক্রিয়া শিরোনাম নেই, সুতরাং আপনার সীমানা কোড প্রতিক্রিয়া ক্রস-অরিজিন অ্যাক্সেস করতে পারে এমন কোনও উপায় নেই।

আপনার ব্রাউজারটি প্রতিক্রিয়াটি জরিমানা পেতে পারে এবং আপনি এটি পোস্টম্যান এবং এমনকি ব্রাউজার ডেভোলগুলিতে দেখতে পাবেন — তবে এর অর্থ ব্রাউজারগুলি আপনার কোডটিতে প্রকাশ করবে না। তারা করবে না, কারণ এর কোনও Access-Control-Allow-Originপ্রতিক্রিয়া শিরোনাম নেই। সুতরাং এটির পরিবর্তে আপনাকে অবশ্যই প্রক্সি ব্যবহার করতে হবে।

প্রক্সিটি সেই সাইটে অনুরোধ করে, প্রতিক্রিয়া পেয়েছে, Access-Control-Allow-Originপ্রতিক্রিয়া শিরোনাম এবং প্রয়োজনীয় যে কোনও সিওআরএস শিরোলেখ যোগ করে , তা আপনার অনুরোধ কোডটিতে ফিরে যায় passes এবং Access-Control-Allow-Originযোগ করা শিরোনামের সাথে সেই প্রতিক্রিয়াটি ব্রাউজারটি যা দেখায় তাই ব্রাউজারটি আপনার সীমান্ত কোডটি আসলে প্রতিক্রিয়াটি অ্যাক্সেস করতে দেয়।


তাই আমি কোনও বস্তুতে প্রবেশের চেষ্টা করছি, আমার আনতে যা CORS অক্ষম করবে

আপনি এটা করতে চান না। স্পষ্টতই, আপনি যখন বলছেন যে আপনি "সিওআরএস অক্ষম" করতে চান তখন মনে হয় আপনার আসলে বোঝানো হচ্ছে আপনি একই-উত্স নীতিটি অক্ষম করতে চান । সিআরএস নিজেই এটি করার একটি উপায় - সিওআরএস একই-উত্স নীতিটি আলগা করার একটি উপায়, এটি সীমাবদ্ধ করার উপায় নয়।

তবে যাইহোক, এটি সত্য যে আপনি করতে পারেন - কেবলমাত্র আপনার স্থানীয় পরিবেশে - সুরক্ষা অক্ষম করতে এবং নিরাপত্তাহীনভাবে চালানোর জন্য আপনার ব্রাউজারকে রানটাইম পতাকা দেওয়া বা একই-উত্স নীতিটি ঘুরে দেখার জন্য আপনি স্থানীয়ভাবে একটি ব্রাউজার এক্সটেনশান ইনস্টল করতে পারেন, তবে যা কিছু তা করে স্থানীয়ভাবে আপনার জন্য পরিস্থিতি পরিবর্তন করা।

আপনি স্থানীয়ভাবে যা বদলে যান না কেন, আপনার অ্যাপ্লিকেশনটি ব্যবহার করার চেষ্টা করা অন্য যে কেউ এখনও একই-উত্স নীতিতে চলতে চলেছে এবং আপনার অ্যাপ্লিকেশনটির অন্যান্য ব্যবহারকারীর পক্ষে এটি অক্ষম করার কোনও উপায় নেই।

আপনি সম্ভবত mode: 'no-cors'কয়েকটি সীমাবদ্ধ ক্ষেত্রে ব্যতীত অনুশীলনে কখনই ব্যবহার করতে চান না এবং তারপরেও যদি আপনি ঠিক কী জানেন এবং এর প্রভাবগুলি কী তা জানেন। কারণ সেটিংটি mode: 'no-cors'ব্রাউজারে আসলে যা বলে তা হ'ল, "আমার ফ্রন্টএন্ড জাভাস্ক্রিপ্ট কোডটি সমস্ত পরিস্থিতিতে প্রতিক্রিয়া বডি এবং শিরোনামের সামগ্রীগুলি অনুসন্ধান করা থেকে ব্লক করুন।" বেশিরভাগ ক্ষেত্রে এটি সম্ভবত আপনি যা চান তা সত্য নয়।


যতটা ক্ষেত্রে আপনি যখন ব্যবহারটি বিবেচনা করতে চান mode: 'no-cors', উত্তরটি অস্বচ্ছ প্রতিক্রিয়াগুলির ক্ষেত্রে কোন সীমাবদ্ধতা প্রযোজ্য তা দেখুন? বিশদ জন্য। এর সংক্ষিপ্তসারটি হ'ল কেসগুলি হ'ল:

  • সীমিত ক্ষেত্রে যখন আপনি একটি বিষয়বস্তু অন্য মূল থেকে একটি সম্পদ করতে জাভাস্ক্রিপ্ট ব্যবহার করছেন ইন <script>, <link rel=stylesheet>, <img>, <video>, <audio>, <object>, <embed>, অথবা <iframe>উপাদান (যা সম্পদের এম্বেডিং কারণ কাজ করে ক্রশ-অরিজিন তাদের জন্য অনুমতি দেওয়া হয়) - কিন্তু কিছু কারণে আপনি যে দস্তাবেজের মার্কআপ হ'ল সংস্থান URL hrefবা srcউপাদানটির জন্য বৈশিষ্ট্য হিসাবে ব্যবহার করতে পারেন তা করতে বা করতে চান না ।

  • আপনি যখন কেবল কোনও উত্সের সাথে যা করতে চান তা হ'ল ক্যাশে। উত্তরে বর্ণিত হিসাবে অস্বচ্ছ প্রতিক্রিয়ার ক্ষেত্রে কোন সীমাবদ্ধতা প্রযোজ্য? , বাস্তবে প্রযোজ্য দৃশ্যে আপনি যখন পরিষেবা কর্মীদের ব্যবহার করছেন তখন সেই ক্ষেত্রে প্রাসঙ্গিক যে API হ'ল ক্যাশে স্টোরেজ এপিআই

তবে সেই সীমিত ক্ষেত্রেও, সচেতন হওয়ার জন্য কয়েকটি গুরুত্বপূর্ণ গোটচ রয়েছে; উত্তরটি দেখুন অস্বচ্ছ প্রতিক্রিয়াগুলির ক্ষেত্রে কোন সীমাবদ্ধতা প্রযোজ্য? বিশদ জন্য।


আমিও বস্তুটিতে পাস করার চেষ্টা করেছি { mode: 'opaque'}

কোনও mode: 'opaque'অনুরোধ মোড নেই - opaqueপরিবর্তে প্রতিক্রিয়াটির একটি সম্পত্তি এবং ব্রাউজারগুলি no-corsমোডের সাথে প্রেরিত অনুরোধগুলির প্রতিক্রিয়াগুলিতে অস্বচ্ছ সম্পত্তি সেট করে।

তবে ঘটনাক্রমে অস্বচ্ছ শব্দটি আপনার প্রতিক্রিয়াটির প্রকৃতি সম্পর্কে একটি সুস্পষ্ট স্পষ্ট সংকেত: "অস্বচ্ছ" অর্থ আপনি এটি দেখতে পাচ্ছেন না।


4
Love cors-anywhereসহজ অ শঙ্কু ব্যবহার-ক্ষেত্রে কার্যসংক্রান্ত (অর্থাত আনার কিছু সার্বজনীনরূপে উপলব্ধ তথ্য)। এই উত্তরটি আমার সন্দেহের সত্যতা নিশ্চিত করে যে no-corsএটি সাধারণ নয় কারণ এর ওপাকেরেস্পোনস খুব কার্যকর নয়; অর্থাত্ "অত্যন্ত সীমাবদ্ধ মামলা"; কেউ কি আমাকে উদাহরণগুলি ব্যাখ্যা করতে পারে যেখানে no-corsদরকারী?
লাল মটরক্ষেত্র

1
@TheRedPea আমি এখানে উত্তরের জন্য করা আপডেটটি দেখুন (এবং আমি আপনার প্রশ্নের জন্য stackoverflow.com/questions/52569895/… এ মন্তব্য হিসাবে যুক্ত করেছি )
sideshowbarker

আমাকে আমার এক্সপ্রেস সার্ভারটি CORS.js প্যাকেজ - github.com/expressjs/cors - এর সাথে কনফিগার করতে হবে এবং তারপরে আমাকে mode: 'no-cors'আনার অনুরোধটি থেকে অপসারণ করতে হবে (অন্যথায় প্রতিক্রিয়াটি খালি হবে)
জেমস এল

CORS প্রক্সি দুর্দান্ত। আমি অবাক হয়েছি যে পাবলিক ফাইলগুলিতে একেবারেই অ্যাক্সেস আটকাতে এটি "সুরক্ষা" ব্যবস্থা হিসাবে বিবেচিত। এটি এতটা হ্যাকারের দৃষ্টিকোণ থেকে পাওয়া খুব সহজ এবং এটি ঠিক তাই করে। এটি সত্যিই ভাল অভিনেতাদের কেবল একটি ঝামেলা।
সেফ রিড

আমি একই এপিআই গ্রাসকারী বিভিন্ন ক্লায়েন্টের কোড উত্পন্ন করি। আমি এটি প্রশিক্ষণের জন্য ব্যবহার করি। আমি কোডটি সহজ রাখতে চাই এবং ব্যবহারকারীরা এটির সাথে খেলতে দিন। আমার নো ক্রস ব্যবহার করা দরকার
profimedica

6

সুতরাং আপনি যদি আমার মতো হয়ে থাকেন এবং লোকালহোস্টে এমন কোনও ওয়েবসাইট বিকাশ করছেন যেখানে আপনি লারাভেল এপিআই থেকে ডেটা আনার চেষ্টা করছেন এবং এটি আপনার ভ্রু ফ্রন্ট-এ ব্যবহার করছেন, এবং আপনি এই সমস্যাটি দেখেন, আমি এখানে এটি কীভাবে সমাধান করেছি:

  1. আপনার লারাভেল প্রকল্পে, কমান্ড চালান php artisan make:middleware Cors। এটি app/Http/Middleware/Cors.phpআপনার জন্য তৈরি করবে।
  2. এতে handlesফাংশনের ভিতরে নিম্নলিখিত কোড যুক্ত করুন Cors.php:

    return $next($request)
        ->header('Access-Control-Allow-Origin', '*')
        ->header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
  3. ইন app/Http/kernel.php, $routeMiddlewareঅ্যারেতে নিম্নলিখিত এন্ট্রি যুক্ত করুন :

    cors => \App\Http\Middleware\Cors::class

    (মত অ্যারের মধ্যে অন্যান্য এন্ট্রি হবে auth, guestইত্যাদি এছাড়াও নিশ্চিত করুন যে আপনি এই কাজ করছি করা app/Http/kernel.phpআরেকটি না থাকায় kernel.phpLaravel খুব)

  4. আপনি যে সমস্ত রুটে অ্যাক্সেসের অনুমতি দিতে চান সেখানে এই মিডলওয়্যারটিকে রুট রেজিস্ট্রেশনে যুক্ত করুন:

    Route::group(['middleware' => 'cors'], function () {
        Route::get('getData', 'v1\MyController@getData');
        Route::get('getData2', 'v1\MyController@getData2');
    });
  5. Vue ফ্রন্ট-এন্ড, আপনাকে এই API কল নিশ্চিত mounted()ফাংশন এবং নেই data()। আপনি নিশ্চিত হন যে আপনি http://বা https://আপনার fetch()কলটিতে ইউআরএল ব্যবহার করেছেন ।

পিট হিউস্টনের ব্লগ নিবন্ধের সম্পূর্ণ ক্রেডিট ।


3

সহজ সমাধান: আপনি যে পিএইচপি ফাইল থেকে ডেটা জন্য অনুরোধ করছেন তার একেবারে শীর্ষে নিম্নলিখিতটি যুক্ত করুন।

header("Access-Control-Allow-Origin: *");


7
আপনি যদি কমপক্ষে সুরক্ষার সম্ভাবনা চান তবে এটি খুব ভাল ধারণা :)
হেরেটিক বানর

চিত্র
হটলিংক

1

আমার জন্য সমাধানটি কেবল এটি সার্ভারের পক্ষে করা ছিল

আমি WebClientডেটা পেতে আমার # সি লাইব্রেরিটি ব্যবহার করেছি (আমার ক্ষেত্রে এটি চিত্রের ডেটা ছিল) এবং এটি ক্লায়েন্টের কাছে ফেরত পাঠাতে। আপনার নির্বাচিত সার্ভার-সাইড ভাষায় সম্ভবত খুব সামান্য কিছু রয়েছে।

//Server side, api controller

[Route("api/ItemImage/GetItemImageFromURL")]
public IActionResult GetItemImageFromURL([FromQuery] string url)
{
    ItemImage image = new ItemImage();

    using(WebClient client = new WebClient()){

        image.Bytes = client.DownloadData(url);

        return Ok(image);
    }
}

আপনার নিজের ব্যবহারের ক্ষেত্রে যা কিছু তা হ'ল আপনি এটি টুইট করতে পারেন। মূল পয়েন্টটি client.DownloadData()কোনও সিওআরএস ত্রুটি ছাড়াই কাজ করা হয় । সাধারণত CORS সমস্যাগুলি কেবল ওয়েবসাইটগুলির মধ্যে থাকে, সুতরাং আপনার সার্ভার থেকে 'ক্রস-সাইট' অনুরোধ করা ঠিক হচ্ছে।

তারপরে রিএ্যাক্ট আনার কলটি এত সহজ:

//React component

fetch(`api/ItemImage/GetItemImageFromURL?url=${imageURL}`, {            
        method: 'GET',
    })
    .then(resp => resp.json() as Promise<ItemImage>)
    .then(imgResponse => {

       // Do more stuff....
    )}

1

খুব সহজ সমাধান (কনফিগার করতে 2 মিনিট) হ'ল স্থানীয়-এসএসএল-প্রক্সি প্যাকেজটি ব্যবহার করাnpm

ব্যবহার সরাসরি সোজা এগিয়ে:
1. প্যাকেজ ইনস্টল করুন: npm install -g local-ssl-proxy
2. আপনার local-serverমুখোশটি চলমান সময়local-ssl-proxy --source 9001 --target 9000

পিএস:--target 9000 সাথে -- "number of your port"এবং --source 9001সাথে প্রতিস্থাপন করুন--source "number of your port +1"


1
রিয়েল ফোন ডিভাইসে আমার অ্যাপ্লিকেশনটি ব্যবহার করতে আমার সমস্যা হচ্ছে। আপনার সমাধান কি এই ক্ষেত্রে সহায়ক?
হামিদ আরাগি

@HamidAraghi আমি এখন যে অনুমান করা হবে, যেহেতু উন্নয়নশীল উদ্দেশ্যে প্রক্সি সার্ভার ডিভাইস যে আসলে দ্বারা ত্রুটি প্রভাবিত চলমান উচিত
volna
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.