আমার জাভাস্ক্রিপ্ট কোডটি করলে পোস্টম্যান কেন অনুরোধকৃত উত্সটিতে "না 'অ্যাক্সেস-কন্ট্রোল-অলজিন-অরিজিন' শিরোনাম উপস্থিত হয় না?


2499

মোড দ্রষ্টব্য : পোস্টম্যান কেন XMLHttpRequest একইভাবে সিওআরএস বিধিনিষেধের অধীন নয় এই প্রশ্নটি is এখানেই প্রশ্ন উঠেছে না কিভাবে "না অ্যাক্সেস-নিয়ন্ত্রণ-মঞ্জুর করুন বংশোদ্ভূত '..." ত্রুটি ফিক্স সম্পর্কে।

পোস্ট করা বন্ধ করুন :

  • সূর্যের নীচে প্রতিটি ভাষা / কাঠামোর জন্য CORS কনফিগারেশন। পরিবর্তে আপনার প্রাসঙ্গিক ভাষা / কাঠামোর প্রশ্নটি সন্ধান করুন
  • তৃতীয় পক্ষের পরিষেবাগুলি যা কোনও অনুরোধকে সিওআরএসকে অবরুদ্ধ করার অনুমতি দেয়
  • বিভিন্ন ব্রাউজারের জন্য সিওআরএস বন্ধ করার জন্য কমান্ড লাইন বিকল্প

আমি ব্যবহার অনুমোদন না করার চেষ্টা করছি জাভাস্ক্রিপ্ট এ সংযুক্ত হয়ে RESTful এপিআই বিল্ট-ইন বোতল । তবে, আমি যখন অনুরোধটি করি তখন আমি নিম্নলিখিত ত্রুটিটি পাই:

এক্সএমএলএইচটিপিআরকোয়েস্ট http: // myApiUrl / লগইন লোড করতে পারে না । অনুরোধকৃত উত্সটিতে কোনও 'অ্যাক্সেস-কন্ট্রোল-অলজন-অরিজিন' শিরোনাম উপস্থিত নেই। মূল 'নাল' এর ফলে অ্যাক্সেসের অনুমতি নেই।

আমি জানি যে এপিআই বা রিমোট রিসোর্সটি অবশ্যই শিরোনাম সেট করবে, কিন্তু আমি যখন ক্রোম এক্সটেনশান পোস্টম্যানের মাধ্যমে অনুরোধ করেছি তখন কেন এটি কাজ করেছিল ?

এই অনুরোধ কোড:

$.ajax({
    type: "POST",
    dataType: 'text',
    url: api,
    username: 'user',
    password: 'pass',
    crossDomain : true,
    xhrFields: {
        withCredentials: true
    }
})
    .done(function( data ) {
        console.log("done");
    })
    .fail( function(xhr, textStatus, errorThrown) {
        alert(xhr.responseText);
        alert(textStatus);
    });

32
আপনি কি লোকালহোস্টের কাছ থেকে অনুরোধটি করছেন বা এইচটিএমএলকে সরাসরি পরিচালনা করছেন?
এমডি সাহেব বিন মাহবুব

@ এমডি.সাহিববিনমাহবুব যদি আমি আপনার প্রশ্নটি বুঝতে পারি তবে আমি লোকালহোস্টের কাছ থেকে অনুরোধ করছি - আমার কম্পিউটারে আমার পৃষ্ঠা আছে এবং কেবল এটি চালাচ্ছি। আমি হোস্টিংয়ে সাইট স্থাপন করি যখন এটি একই ফলাফল দেয়।
মিঃ জেদী

6
অনেক সম্পর্কিত: stackoverflow.com/questions/10143093/...
cregox

8
যে কেউ আরও পড়ার সন্ধান করছেন, এমডিএন-এর এজাক্স এবং ক্রস অরিজিন অনুরোধ সম্পর্কিত একটি ভাল নিবন্ধ রয়েছে: বিকাশকারী.মোজিলা.আর.ইন
স্যাম ইটন

1
নোড জেএস এ ধরণের ত্রুটির জন্য একটি গুরুত্বপূর্ণ নোট। আপনার রুটগুলি সেট আপ করার আগে আপনার সার্ভার.জেএস ফাইলের শুরুতে আপনার অ্যাক্সেস শিরোনামগুলি সেট করা উচিত। অন্যথায়, সবকিছু দুর্দান্ত চলবে তবে আপনি যখন আপনার অ্যাপ্লিকেশন থেকে অনুরোধ করবেন তখন আপনি এই ত্রুটিটি পেয়ে যাবেন।
অ্যালেক্স জে

উত্তর:


1343

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

আপনি যখন পোস্টম্যান ব্যবহার করছেন তখন তারা এই নীতি দ্বারা সীমাবদ্ধ নয়। ক্রস-অরিজিন এক্সএমএল এইচটিপিআরকেস্ট থেকে উদ্ধৃত :

নিয়মিত ওয়েব পৃষ্ঠাগুলি দূরবর্তী সার্ভারগুলি থেকে ডেটা প্রেরণ ও গ্রহণ করতে XMLHttpRequest অবজেক্টটি ব্যবহার করতে পারে তবে সেগুলি একই উত্স নীতি দ্বারা সীমাবদ্ধ। এক্সটেনশনগুলি এত সীমাবদ্ধ নয়। কোনও এক্সটেনশানটি এটির উত্সের বাইরে দূরবর্তী সার্ভারের সাথে কথা বলতে পারে, যতক্ষণ না এটি প্রথম ক্রস-অরিজিন অনুমতিের অনুরোধ করে।


7
তুমি ঠিক বলছো. আমি আমার পৃষ্ঠার চেয়ে ভিন্ন ডোমেনের কাছে অনুরোধ করছি। এপিআই সার্ভারে রয়েছে এবং আমি লোকালহোস্টের অনুরোধটি চালাচ্ছি। আমি উত্তর গ্রহণ করার আগে আপনি আমাকে "অনুরোধটি সরাসরি কার্যকর করতে" এর অর্থ কী তা আমাকে ব্যাখ্যা করতে পারেন? পোষ্টমান ডোমেন ব্যবহার করে না?
মিঃ জেদী

180
ব্রাউজারটি অনুরোধটিকে অবরুদ্ধ করছে না। কেবলমাত্র ব্রাউজারগুলি ক্রস-অরিজিন এজ্যাক্স অনুরোধগুলি সম্পূর্ণরূপে ব্লক করে আইআই 7 বা তার চেয়ে বেশি পুরানো। আই 7 এবং তার চেয়ে বেশি বয়সী সমস্ত ব্রাউজারগুলি সিওআরএস স্পেক প্রয়োগ করে (আই 8 এবং আই 99 আংশিকভাবে)। আপনাকে যা করতে হবে তা হ'ল অনুরোধের ভিত্তিতে যথাযথ শিরোনামগুলি ফিরিয়ে আপনার API সার্ভারে CORS অনুরোধগুলি বেছে নেওয়া। আপনার mzl.la/VOFrSz এ CORS ধারণাটি পড়তে হবে । পোস্টম্যান এক্সএইচআর এর মাধ্যমে অনুরোধও প্রেরণ করে। পোস্টম্যান ব্যবহার করার সময় আপনি যদি একই সমস্যাটি না দেখেন তবে এর অর্থ হ'ল আপনি অজান্তে পোস্টম্যানের মাধ্যমে একই অনুরোধটি পাঠাচ্ছেন না।
রায় নিকোলাস

10
@ এমডি.সাহিববিনমাহবুব পোস্টম্যান "আপনার জাভা / পাইথন" কোড থেকে একটি অনুরোধ প্রেরণ করছেন না। এটি সরাসরি ব্রাউজার থেকে অনুরোধ পাঠাচ্ছে। ক্রোম এক্সটেনশনের এক্সএইচআর কিছুটা আলাদাভাবে কাজ করে, বিশেষত যখন ক্রস-অরিজিন অনুরোধগুলি জড়িত থাকে
রায় নিকোলাস

249

সতর্কতা: ব্যবহার করা Access-Control-Allow-Origin: *আপনার API / ওয়েবসাইটকে ক্রস-সাইট অনুরোধ জালিয়াতি (সিএসআরএফ) আক্রমণে ঝুঁকিপূর্ণ করে তুলতে পারে । এই কোডটি ব্যবহার করার আগে আপনি ঝুঁকিগুলি বুঝতে পেরেছেন তা নিশ্চিত করুন ।

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

<?php header('Access-Control-Allow-Origin: *'); ?>

আপনি যদি নোড-রেড ব্যবহার করছেন তবে আপনাকে নিম্নলিখিত লাইনগুলিতে মন্তব্য না করে ফাইলটিতে সিওআরএসকে অনুমতি দিতে হবে node-red/settings.js:

// The following property can be used to configure cross-origin resource sharing
// in the HTTP nodes.
// See https://github.com/troygoode/node-cors#configuration-options for
// details on its contents. The following is a basic permissive set of options:
httpNodeCors: {
 origin: "*",
 methods: "GET,PUT,POST,DELETE"
},

আপনি যদি প্রশ্নটির মতো ফ্লাস্ক ব্যবহার করেন ; আপনি ইনস্টল করতে হবেflask-cors

$ pip install -U flask-cors

তারপরে আপনার আবেদনে ফ্লাস্ক কর্স অন্তর্ভুক্ত করুন।

from flask_cors import CORS

একটি সাধারণ অ্যাপ্লিকেশনটি দেখতে পাবেন:

from flask import Flask
from flask_cors import CORS

app = Flask(__name__)
CORS(app)

@app.route("/")
def helloWorld():
  return "Hello, cross-origin-world!"

আরও তথ্যের জন্য, আপনি ফ্লাস্ক ডকুমেন্টেশন চেক করতে পারেন ।


93
এবং এটি সুরক্ষিত নয়
llazzaro

153
আপনার CORS বন্ধ করা উচিত নয় কারণ এর জন্য কী তা আপনি জানেন না। এটি একটি ভয়ানক উত্তর।
মেগার

123
যদিও এটি সুরক্ষিত নাও হতে পারে, প্রশ্নটি সুরক্ষা সম্পর্কিত নয়, তবে কীভাবে কার্য সম্পাদন করবেন। ক্রস-ডোমেন এজেএক্স অনুরোধগুলির সাথে ডিল করার সময় এটি কোনও বিকল্প যা বিকাশকারীকে বেছে নিতে পারে। এটি আমাকে সমস্যার সমাধান করতে সহায়তা করেছে এবং আমার অ্যাপ্লিকেশনটির জন্য, ডেটা কোথা থেকে এসেছে তা আমি যত্ন করে না। আমি গন্তব্য ডোমেনে পিএইচপি দিয়ে সমস্ত ইনপুট স্যানিটাইজ করি, সুতরাং কেউ যদি এতে কিছুটা জাঙ্ক পোস্ট করতে চায় তবে তাদের চেষ্টা করুন। এখানে মূল বক্তব্যটি হ'ল গন্তব্য ডোমেন থেকে ক্রস-ডোমেন এজেএক্স অনুমোদিত হতে পারে। উত্তরের জন্য +1।
জুরাব ওয়েব

23
যদিও আমি পিয়েরো যে সাধারণ বার্তা দিচ্ছি তার সাথে আমি একমত, যদিও এটি বিশেষত সুরক্ষা সম্পর্কিত নয়, তবে সুরক্ষা উদ্বেগজনক। আমি মনে করি এটিতে কমপক্ষে কিছু বলা উচিত ছিল "এটি সাধারণত খারাপ হয়! আপনি কী করছেন তা যদি না জানেন তবে এটি করবেন না! এখানে আরও ডকুমেন্টেশন এখানে দেওয়া হয়েছে ... ..." এবং সম্ভবত এটি কেন সংক্ষেপে ব্যাখ্যা করবেন। কেউ এখানে আসার জন্য আমি ঘৃণা করব এবং কেবল "ওহ, আমি এই শিরোনামটি যুক্ত / সামঞ্জস্য করতে পারি এবং আমি ভাল!" এবং সম্পূর্ণ বিভাজনগুলি জানেন না। আমি বলতে চাইছি, গবেষণা এবং সমস্ত কিছু তাদের কাছে একরকম, তবে এখনও রয়েছে।
থমাস এফ।

4
আমি এই উত্তরটি পছন্দ করি ... আমারও একই সমস্যা রয়েছে এবং এটি সমাধান করে দেয় ... তিনি ব্যাখ্যা করেছিলেন যে এখানে কিছু সুরক্ষা সমস্যা রয়েছে তবে এটি অন্য একটি সমস্যা এবং প্রত্যেককে স্বতন্ত্রভাবেই এই সমস্যাটি ভাবতে এবং সমাধান করতে দিন ...
আরি ওয়েসবার্গ

63

কারণ
aj .জ্যাক্স ({প্রকার: "পোষ্ট" - কল করে অপশন
$ .পোস্ট ( - পোস্ট করুন কল

দুটোই আলাদা। পোস্টম্যান "POST" কে সঠিকভাবে কল করে তবে আমরা যখন এটি কল করব তখন এটি "বিকল্প" হবে।

সি # ওয়েব পরিষেবার জন্য - ওয়েব এপিআই

আপনার নিম্নলিখিত কোড যোগ করুন web.config <system.webServer> ট্যাগ অধীনে ফাইল। এটি কাজ করবে:

<httpProtocol>
    <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
    </customHeaders>
</httpProtocol>

দয়া করে নিশ্চিত হয়ে নিন যে আপনি আজাক্স কলটিতে কোনও ভুল করছেন না

jQuery এর

$.ajax({
    url: 'http://mysite.microsoft.sample.xyz.com/api/mycall',
    headers: {
        'Content-Type': 'application/x-www-form-urlencoded'
    },
    type: "POST", /* or type:"GET" or type:"PUT" */
    dataType: "json",
    data: {
    },
    success: function (result) {
        console.log(result);
    },
    error: function () {
        console.log("error");
    }
});

দ্রষ্টব্য: আপনি যদি কোনও তৃতীয় পক্ষের ওয়েবসাইট থেকে সামগ্রী ডাউনলোড করার সন্ধান করছেন তবে এটি আপনাকে সাহায্য করবে না । আপনি নিম্নলিখিত কোডটি চেষ্টা করতে পারেন, তবে জাভাস্ক্রিপ্ট নয়।

System.Net.WebClient wc = new System.Net.WebClient();
string str = wc.DownloadString("http://mysite.microsoft.sample.xyz.com/api/mycall");

এই কনফিগারেশনটি আজুর সার্ভিসে ওয়ার্ডপ্রেসে একই ত্রুটি সমাধান করেছে। ধন্যবাদ।
আন্দ্রে মেসকিটা

9
আমি বাহ্যিক ডোমেনগুলির অনুরোধগুলি এড়াতে একটি নির্দিষ্ট উত্স মানটি ব্যবহার করার পরামর্শ দেব। সুতরাং উদাহরণস্বরূপ *ব্যবহারের পরিবর্তেhttps://www.myotherdomain.com
পেচার


8

একটি সিওআরএস বিধিনিষেধ প্রয়োগ করা একটি সার্ভার দ্বারা সংজ্ঞায়িত এবং ব্রাউজার দ্বারা প্রয়োগ করা একটি সুরক্ষা বৈশিষ্ট্য ।

ব্রাউজারটি সার্ভারের সিওআরএস নীতি দেখে এবং তাকে সম্মান করে।

তবে পোস্টম্যান টুল সার্ভারের সিওআরএস নীতি সম্পর্কে মাথা ঘামায় না।

এজন্য সিওআরএস ত্রুটিটি ব্রাউজারে প্রদর্শিত হয় তবে পোস্টম্যানে নয়।


1
হ্যাঁ, আমি কেন এই সামান্য বিশদটি কিছুটা মনোযোগ প্রাপ্য তা যথেষ্ট চাপ দিতে পারি না। কখন নিরাপত্তা তার প্যারামাউন্ট কথা যে CORS হিসাবে শক্তিশালী হিসাবে শুধুমাত্র উল্লেখ ক্লায়েন্ট এটা বাস্তবায়ন। সুতরাং কল্পনা করুন যে আপনি একটি সাধারণ এইচটিপিপিএলিয়েন্ট (সার্ভার-সাইড কোড) নেন এবং একটি প্রক্সি তৈরি করেন, যার পরে আপনার অনুরোধগুলি ... সুরক্ষাটি পুরোপুরি নষ্ট হয়ে যেতে পারে, সত্যই CORS স্ট্যান্ডার্ডকে একটি দুর্বল সমাধান হিসাবে
ফেলেছে

7

নীচের তদন্তে API হিসাবে, আমি আপনার প্রশ্ন থেকে http: // myApiUrl / login এর পরিবর্তে http://example.com ব্যবহার করি , কারণ এই প্রথমটি কাজ করছে।

আমি ধরে নিচ্ছি যে আপনার পৃষ্ঠাটি http: //my-site.local: 8088 এ রয়েছে

আপনি বিভিন্ন ফলাফল দেখার কারণটি হ'ল পোস্টম্যান:

  • হেডার সেট করুন Host=example.com(আপনার এপিআই)
  • শিরোনাম সেট করা নেই Origin

এটি ব্রাউজারগুলির অনুরোধগুলি প্রেরণের পদ্ধতির অনুরূপ যখন সাইট এবং এপিআই-তে একই ডোমেন থাকে (ব্রাউজারগুলি শিরোনাম আইটেমটি সেট করে Referer=http://my-site.local:8088, তবে আমি এটি পোস্টম্যানে দেখি না)। যখন Originশিরোনাম সেট করা থাকে না , সাধারণত সার্ভারগুলি ডিফল্টরূপে অনুরোধগুলি মঞ্জুরি দেয়।

এখানে চিত্র বিবরণ লিখুন

পোস্টম্যান অনুরোধগুলি কীভাবে প্রেরণ করে এটি এটি way যখন আপনার সাইট এবং এপিআই-এর আলাদা আলাদা ডোমেন থাকে তখন কোনও ব্রাউজার আলাদা আলাদাভাবে অনুরোধ পাঠায় এবং তারপরে সিওআরএস ঘটে এবং ব্রাউজারটি স্বয়ংক্রিয়ভাবে:

  • শিরোনাম সেট করে Host=example.com(এপিআই হিসাবে আপনার)
  • শিরোনাম সেট করে Origin=http://my-site.local:8088(আপনার সাইট)

(শিরোনামটির Refererসমান মান রয়েছে Origin)। এবং এখন Chrome এর কনসোল ও নেটওয়ার্ক ট্যাবে আপনি দেখতে পাবেন:

এখানে চিত্র বিবরণ লিখুন

এখানে চিত্র বিবরণ লিখুন

যখন আপনার কাছে Host != Originএটি থাকে CORS, এবং যখন সার্ভারটি এই জাতীয় অনুরোধ সনাক্ত করে, এটি সাধারণত এটি ডিফল্টরূপে অবরুদ্ধ করে

Origin=nullআপনি কোনও স্থানীয় ডিরেক্টরি থেকে HTML সামগ্রী খুললে সেট করা থাকে এবং এটি একটি অনুরোধ প্রেরণ করে। একই অবস্থাটি যখন আপনি <iframe>নীচের স্নিপেটের মতো একটি এর ভিতরে একটি অনুরোধ প্রেরণ করেন (তবে এখানে শিরোনামটি Hostমোটেই সেট করা হয় না) - সাধারণভাবে, যেখানেই এইচটিএমএল স্পেসিফিকেশন অস্বচ্ছ উত্স বলে, আপনি এটি অনুবাদ করতে পারেন Origin=null। এই সম্পর্কে আরও তথ্য আপনি এখানে জানতে পারেন ।

fetch('http://example.com/api', {method: 'POST'});
Look on chrome-console > network tab

আপনি যদি কোনও সাধারণ সিওআরএস অনুরোধ ব্যবহার না করেন তবে সাধারণত প্রধান অনুরোধটি প্রেরণের আগে ব্রাউজার স্বয়ংক্রিয়ভাবে একটি অপ্টিশন অনুরোধও প্রেরণ করে - আরও তথ্য এখানে । নীচে স্নিপেট এটি দেখায়:

fetch('http://example.com/api', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json'}
});
Look in chrome-console -> network tab to 'api' request.
This is the OPTIONS request (the server does not allow sending a POST request)

আপনি সিওআরএস অনুরোধগুলি অনুমোদনের জন্য আপনার সার্ভারের কনফিগারেশনটি পরিবর্তন করতে পারেন।

এখানে একটি উদাহরণ কনফিগারেশন যার উপর পালাক্রমে হয় nginx উপর CORS সেটিং সঙ্গে খুব সতর্কতা অবলম্বন করা আবশ্যক - (ফাইল nginx.conf) always/"$http_origin"nginx এবং "*"অ্যাপাচি জন্য - এই কোন ডোমেইন থেকে CORS অবরোধ মুক্ত করবে।

এখানে একটি উদাহরণ কনফিগারেশন যা অ্যাপাচি (.htaccess ফাইল) এ সিওআরএস চালু করে is


2

বিভিন্ন ব্যবহারের ক্ষেত্রে একই ত্রুটি ঘটেছে।

কেস ব্যবহার করুন: ক্রোম যখন কৌণিক মধ্যে স্প্রিং REST শেষ পয়েন্ট কল করার চেষ্টা করা হয় ।

এখানে চিত্র বর্ণনা লিখুন

সমাধান: যোগ @CrossOrigin ( "*") নিজ নিজ কন্ট্রোলার ক্লাস উপরে টীকা।

এখানে চিত্র বর্ণনা লিখুন


আমি সুরক্ষার জন্য * এর পরিবর্তে লোকালহোস্ট ব্যবহার করি
neo7bf

-1

যদি আপনি .NET কে আপনার মাঝারি স্তর হিসাবে ব্যবহার করেন তবে রুটের বৈশিষ্ট্যটি স্পষ্টভাবে পরীক্ষা করুন, উদাহরণস্বরূপ,

আমার যখন সমস্যাটি ছিল তখন এটি ছিল,

[Route("something/{somethingLong: long}")] //Space.

এটি দ্বারা এটি স্থির,

[Route("something/{somethingLong:long}")] //No space

-1

কেবলমাত্র নেট নেট ওয়েব এপিআই প্রকল্পের জন্য, নিম্নলিখিত পরিবর্তনগুলি যুক্ত করুন:

  1. স্টার্টআপ.cs ফাইলের পদ্ধতিতে services.AddMvc()লাইনের পরে নিম্নলিখিত কোড যুক্ত ConfigureServices()করুন:
services.AddCors(allowsites=>{allowsites.AddPolicy("AllowOrigin", options => options.AllowAnyOrigin());
            });
  1. স্টার্টআপ.cs ফাইলের পদ্ধতিতে app.UseMvc()লাইনের পরে নিম্নলিখিত কোড যুক্ত Configure()করুন:
app.UseCors(options => options.AllowAnyOrigin());
  1. আপনি ডোমেনের বাইরে যে অ্যাক্সেস করতে চান সেটি নিয়ন্ত্রণ করুন এবং নিয়ামক স্তরে নিম্নলিখিত বৈশিষ্ট্য যুক্ত করুন:
[EnableCors("AllowOrigin")]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.