কীভাবে অক্ষর সহ অনুমোদনের শিরোনাম প্রেরণ করা যায়


99

আমি কীভাবে axios.js এর মাধ্যমে একটি টোকেন সহ একটি প্রমাণীকরণ শিরোনাম পাঠাতে পারি? আমি সফলতা ছাড়াই কয়েকটি জিনিস চেষ্টা করেছি, উদাহরণস্বরূপ:

const header = `Authorization: Bearer ${token}`;
return axios.get(URLConstants.USER_URL, { headers: { header } });

আমাকে এই ত্রুটি দেয়:

XMLHttpRequest cannot load http://localhost:8000/accounts/user/. Request header field header is not allowed by Access-Control-Allow-Headers in preflight response.

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

axios.defaults.headers.common['Authorization'] = `Bearer ${token}`;

হালনাগাদ :

কোলের উত্তর আমাকে সমস্যাটি খুঁজে পেতে সহায়তা করেছে। আমি জ্যাঙ্গো-কর্স-শিরোলেখ মিডলওয়্যার ব্যবহার করছি যা ইতিমধ্যে ডিফল্টরূপে অনুমোদনের শিরোনাম পরিচালনা করে।

তবে আমি ত্রুটি বার্তাটি বুঝতে সক্ষম হয়েছি এবং আমার অক্ষগুলির অনুরোধ কোডটিতে একটি ত্রুটি স্থির করেছিলাম, যা দেখতে এটি দেখতে হবে

return axios.get(URLConstants.USER_URL, { headers: { Authorization: `Bearer ${data.token}` } });

উত্তর:


89

সহজ-সরল HTTP অনুরোধের ভিত্তিতে আপনার ব্রাউজারটি প্রথমে একটি "প্রিফলাইট" অনুরোধ (একটি বিকল্প বিকল্প পদ্ধতি অনুরোধ) প্রেরণ করবে যাতে প্রশ্নে থাকা সাইটটি কী নিরাপদ তথ্য প্রেরণ করতে বিবেচনা করে তা নির্ধারণ করতে ( এটি সম্পর্কে ক্রস-অরিজিনান্স নীতি সম্পর্কে এখানে দেখুন )। হোস্ট একটি প্রিফ্লাইট প্রতিক্রিয়াতে সেট করতে পারে এমন প্রাসঙ্গিক শিরোনাম Access-Control-Allow-Headers। আপনি যে শিরোনামটি প্রেরণ করতে চান সেগুলির কোনওটি যদি শ্বেত তালিকাভুক্ত শিরোনামের তালিকা বা সার্ভারের প্রিফলাইট প্রতিক্রিয়াতে হয় না, তবে ব্রাউজারটি আপনার অনুরোধটি প্রেরণ করতে অস্বীকার করবে।

আপনার ক্ষেত্রে, আপনি একটি Authorizationশিরোনাম প্রেরণের চেষ্টা করছেন , যা শিরোনাম পাঠানোর জন্য সর্বজনীন সুরক্ষিত হিসাবে বিবেচিত নয়। তারপরে ব্রাউজারটি সার্ভারটিকে এটি হেডারটি প্রেরণ করা উচিত কিনা তা জিজ্ঞাসা করার জন্য একটি প্রিফ্লাইট অনুরোধ প্রেরণ করে। সার্ভারটি হয় ফাঁকা Access-Control-Allow-Headersশিরোলেখ পাঠাচ্ছে (যার অর্থ "কোনও অতিরিক্ত শিরোনামকে অনুমতি দেবেন না" বলে বোঝানো হয়) বা এটি এমন শিরোনাম প্রেরণ করছে যা Authorizationএর অনুমোদিত শিরোনামের তালিকায় অন্তর্ভুক্ত নেই । এর কারণে, ব্রাউজারটি আপনার অনুরোধটি প্রেরণ করবে না এবং পরিবর্তে একটি ত্রুটি ছুঁড়ে দিয়ে আপনাকে অবহিত করার জন্য পছন্দ করে।

আপনার যে কোনও জাভাস্ক্রিপ্টের কাজের সন্ধান পাওয়া যায় যা আপনাকে এই অনুরোধটি যেভাবেই প্রেরণ করতে দেয় সেটিকে একটি বাগ হিসাবে বিবেচনা করা উচিত কারণ এটি আপনার ব্রাউজারটি আপনার নিজের সুরক্ষার জন্য প্রয়োগ করার চেষ্টা করছে ক্রস অরিজিন অনুরোধ নীতিটির বিরুদ্ধে against

tl; dr - আপনি যদিAuthorizationশিরোনামপাঠাতে চান তবেআপনার সার্ভারটি এটির অনুমতি দেওয়ার জন্য আরও ভালভাবে কনফিগার করা উচিত। আপনার সার্ভারটি সেট আপ করুন যাতে এটিশিরোনামOPTIONSদিয়ে url এএকটিঅনুরোধেরপ্রতিক্রিয়া জানায়Access-Control-Allow-Headers: Authorization


11
ধন্যবাদ, কোল! আপনার উত্তর আমাকে সমস্যা খুঁজে পেতে সহায়তা করেছে। আমি জ্যাঙ্গো-কর্স-শিরোলেখ মিডলওয়্যার ব্যবহার করছি যা ইতিমধ্যে ডিফল্টরূপে অনুমোদনের শিরোনাম পরিচালনা করে। তবে আমি ত্রুটি বার্তাটি বুঝতে সক্ষম হয়েছি এবং আমার অক্ষগুলি রিকোয়েস্ট কোডে একটি ত্রুটি স্থির করেছিলাম, যা দেখতে এইরকম হওয়া উচিত return axios.get(URLConstants.USER_URL, { headers: { Authorization: `Bearer ${data.token}` } });
foobar

4
আপনাকে স্বাগতম! আমি সর্বদা আমার API গুলি দিয়ে এই ধরণের সমস্যার মধ্যে চলে আসি। আমি আপনাকে যে প্রক্রিয়াটি অতিক্রম করতে হবে তা বুঝতে সাহায্য করতে পেরে আনন্দিত।
কোল ইরিকসন

44

এটা চেষ্টা কর :

axios.get(
    url,
    {headers: {
        "name" : "value"
      }
    }
  )
  .then((response) => {
      var response = response.data;
    },
    (error) => {
      var status = error.response.status
    }
  );

4
সুতরাং শিরোনামের নাম হবে 'অ্যাক্সেস-নিয়ন্ত্রণ-মঞ্জুরি-শিরোনামগুলি' এবং মানটি যা আপনি চান তা।
মাতিজা čupančić

সুতরাং, আপনি বলতে চাচ্ছেন যে আমার কাছে এমন কিছু থাকবে: অক্ষরেখাগুলি (ইউআরএল,? শিরোনাম: Access 'অ্যাক্সেস-কন্ট্রোল-মঞ্জুরি-শিরোনামগুলি:' বাহক <আমার টোকেন> '}})? যে কাজ করে না।
foobar

11
আমি বিশ্বাস করি এটি 'অনুমোদন' হওয়া উচিত: 'বাহক <আমার টোকেন>'}
জন হার্ডিং

38

এটি আমার পক্ষে কাজ করেছে:

let webApiUrl = 'example.com/getStuff';
let tokenStr = 'xxyyzz';
axios.get(webApiUrl, { headers: {"Authorization" : `Bearer ${tokenStr}`} });

4
উপরের তুলনায় উত্তরে কম বিশদ আছে তবে গুগল অনুসন্ধান করার সময় প্রত্যেকে যা খুঁজছেন তা এই উত্তর।
কালো মাম্বা

33

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

axios.defaults.headers.common['Authorization'] = `Bearer ${access_token}` 

আপনি এই কনফিগারেশনটি কীভাবে রাখবেন? মূলটিতে (index.js, App.js)? নাকি আলাদা ফাইলে?
আইবুবি

8

আপনি প্রায় সঠিক, এইভাবে আপনার কোডটি সামঞ্জস্য করুন

const headers = { Authorization: `Bearer ${token}` };
return axios.get(URLConstants.USER_URL, { headers });

খেয়াল করুন যেখানে আমি ব্যাকটিকগুলি রেখেছি, আমি বেরের পরে '' যোগ করেছি, আপনি যদি সার্ভার-সাইডে হ্যান্ডেল করতে নিশ্চিত হন তবে আপনি বাদ দিতে পারেন


6
সাধারণত (স্পেস অনুসারে) -অথ স্কিম এবং টোকেনের মধ্যে একটি স্থান থাকে, ড্যাশ ( ) নয় । আমি দেখিনি যে কোনও ধরণের সার্ভারের জন্য কোনও ড্যাশ দরকার নেই, এবং বেশিরভাগ ক্ষেত্রে যদি না দেওয়া থাকে তবে ত্রুটি ফিরে পাঠায়।
রমন

6

অক্ষরেখা কল করার পরিবর্তে ফাংশনটি ব্যবহার করুন:

axios({ method: 'get', url: 'your URL', headers: { Authorization: `Bearer ${token}` } })

1

আপনি এটি চেষ্টা করতে পারেন।

axios.get(
    url,
    {headers: {
            "Access-Control-Allow-Origin" : "*",
            "Content-type": "Application/json",
            "Authorization": `Bearer ${your-token}`
            }   
        }
  )
  .then((response) => {
      var response = response.data;
    },
    (error) => {
      var status = error.response.status
    }
  );

0
res.setHeader('Access-Control-Allow-Headers',
            'Access-Control-Allow-Headers, Origin,OPTIONS,Accept,Authorization, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers');

ব্লককোট: আপনাকে সেটহেডারে অপশন এবং অনুমোদন যোগ করতে হবে ()

এই পরিবর্তনটি আমার সমস্যার সমাধান করেছে, একবার চেষ্টা করুন!


0

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

এটি এটিকে কাজ করে তোলে:

cors = require('cors')
app.use(cors());

আসল লিঙ্ক


4
এটি নোড সার্ভারের জন্য, অক্ষের জন্য নয়
মার্ক গার্সিয়া

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