কুকির সাথে এপিআই আনুন


199

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

এটি কারণ কারণ আনয়ন এখনও প্রস্তুত নয় বা ফেচ কুকিজের সাথে কাজ করে না?

আমি ওয়েবপ্যাক দিয়ে আমার অ্যাপটি তৈরি করি। আমি প্রতিক্রিয়া নেটিভ আনতেও ব্যবহার করি, যার একই সমস্যা নেই।

উত্তর:


279

আনয়ন ডিফল্টরূপে কুকি ব্যবহার করে না। কুকি সক্ষম করতে, এটি করুন:

fetch(url, {
  credentials: "same-origin"
}).then(...).catch(...);

55
একই-উত্সটি আর কাজ করে না, অন্তর্ভুক্ত করে (@ জেরির উত্তর দেখুন): developers.google.com/web/updates/2015/03/intrration-to-fetch
jpic

7
@jpic: 'অন্তর্ভুক্ত' কেবল ক্রস-অরিজিন অনুরোধের জন্য কাজ করে তবে একই-উত্সের অনুরোধগুলির জন্য নয়। অফিশিয়াল ডক্স: github.com/github/fetch#sending-cookies
হোল্ডঅফহ্যাঞ্জার

যদি আনার সাথে জেএস-তে পাঠযোগ্য হয় তবে কেবলমাত্র কুকিগুলির পোষ্ট রাখার কারণ কী?
মার্টিন বাজকার

4
আমি বিশ্বাস করি same-origin(যা আছে এখনো কর্মস্থল) মানে যে আরো হেডার (কুকিজ, ইত্যাদি) সম্মানিত করা হবে কিন্তু আপনার কোড প্রতিক্রিয়া সীমিত অ্যাক্সেস থাকবে।
কোডার

2
@JohnBalvinAriasThx। আমি পরে বুঝতে পেরেছি, কুকি httponly থাকার অর্থ হ'ল এটি পাঠযোগ্য নয় document.cookie, তবে এটি আজাক্স বা আনার অনুরোধগুলির জন্য উপলব্ধ।
মার্টিন বাজকার

184

@ খেনিটরের উত্তর ছাড়াও, যারা ক্রস-অরিজিন অনুরোধ নিয়ে কাজ করছেন: credentials: 'include'

নমুনা JSON আনার অনুরোধ:

fetch(url, {
  method: 'GET',
  credentials: 'include'
})
  .then((response) => response.json())
  .then((json) => {
    console.log('Gotcha');
  }).catch((err) => {
    console.log(err);
});

https://developer.mozilla.org/en-US/docs/Web/API/Request/credentials


9
আপনি কিভাবে কুকি সেট করবেন?
পোমো

2
কুকি সার্ভার-সাইড থেকে সেট করা আছে। আমার ক্ষেত্রে আমি httponly কুকি ব্যবহার করছিলাম।
খানেটর

3
@ খানেটর আমি জাভাস্ক্রিপ্ট দ্বারা ডকুমেন্ট.কুকি ব্যবহার করে কুকি সেট করতে পারি এবং তারপরে অনুরোধটি পাঠাতে পারি?
অ্যাসপাইডার

@ স্পাইডার আপনি এটি হেডারে প্রেরণ করতে পারেন।
10101010

2
@ স্পাইডার আমি দেখতে পেলাম যে document.cookieঅনুরোধগুলিতে অন্তর্ভুক্ত করার জন্য কেবল মান নির্ধারণই যথেষ্ট ছিল।
skwidbreth

35

সবেমাত্র সমাধান করেছেন। মাত্র দুটি চ। বর্বর শক্তি দিন

আমার কাছে গোপন কথাটি ছিল:

  1. আমি POST / api / auth কল করেছি এবং দেখুন কুকিজ সফলভাবে প্রাপ্ত হয়েছে।

  2. তারপরে জিইটি / এপিআই / ব্যবহারকারী / সাথে কল করে credentials: 'include'401 জন অ্যালৌথ পেয়েছেন, কারণ অনুরোধের সাথে কোনও কুকিজ প্রেরণ করা হয়নি।

KEY credentials: 'include'প্রথম /api/authকলের জন্যও সেট করতে হবে।


1
আমার ঠিক আপনার সমস্যা আছে। জিইটি ডেটা অনুরোধে সেশন কুকি কখনই প্রেরণ করা হয় না। তাই 401. আমি এক্সিস এবং আনার চেষ্টা করেছি। একই ফল। 2 সম্ভাবনা: লগইন পোষ্ট প্রাপ্ত কুকি সংরক্ষণ করতে পারে না বা নিম্নলিখিত জিইটি ডেটা সংরক্ষণকৃত কুকি প্রেরণ করে না
রবারবার 65

@ Rhubarb65, এই জয় তোমার দর্শন লগ করা উল্লেখ করা উচিত credentials: 'include'প্রথমPOST /api/auth
user1671599

হ্যাঁ, আমার কাছে এটি ছিল তবে এটি যথেষ্ট চায়। আমি একটি ডেভেনভার প্রক্সি (ক্লায়েন্ট
এইচটিটিপি

হ্যাঁ, আমার কাছে শংসাপত্র ছিল কিন্তু এটি যথেষ্ট ছিল না। আমি অতীতের সিওআরএস পেতে (ক্লায়েন্ট এইচটিসি) - প্রক্সি - (সার্ভার https) পাওয়ার জন্য একটি ডেভেনভার প্রক্সি ব্যবহার করছিলাম। আমি বিশ্বাস করি এর অর্থ এই যে সার্ভার থেকে সেশনিড কুকি ব্রাউজারে সেট করা হয়নি কারণ সুরক্ষিত কুকিগুলির জন্য https প্রয়োজন। সুতরাং আমি পতাকাটি https: ডিভারার প্রক্সিতে সত্য এবং এটি সংশোধন করেছিলাম
রবারবার 65

1
ভাল চিয়ার্স। আপনার উত্তরটির অর্থ হ'ল আমাকে কেবল 1 দিনের ব্রুটফোর্স নিয়েছে। :)
মাইকেল

16

আপনি যদি 2019 এ এটি পড়েন credentials: "same-origin"তবে এটি ডিফল্ট মান।

fetch(url).then

1
তবে মনে রাখবেন যে প্রত্যেকে যথেষ্ট পরিমাণে আপডেট হওয়া ব্রাউজার ব্যবহার করছে না। আমি এই প্রশ্নটি জুড়ে এসেছি কারণ আমার নিজের ফায়ারফক্সের সংস্করণ (60.x, ডেবিয়ান স্ট্রেচের সবচেয়ে সাম্প্রতিকতম) সেটি ডিফল্টরূপে সেট করে নি।
ফিলহ

2

এখানে .net webapi2ব্যবহারকারীদের জন্য সঠিক উত্তর যুক্ত করুন ।

যদি আপনি ব্যবহার করছেন corsকারণ আপনার ক্লায়েন্ট সাইটটি অন্য কোনও ঠিকানা থেকে আপনার হিসাবে পরিবেশিত হয়েছে webapiতবে আপনাকে SupportsCredentials=trueসার্ভার সাইড কনফিগারেশনেও অন্তর্ভুক্ত করতে হবে ।

        // Access-Control-Allow-Origin
        // https://docs.microsoft.com/en-us/aspnet/web-api/overview/security/enabling-cross-origin-requests-in-web-api
        var cors = new EnableCorsAttribute(Settings.CORSSites,"*", "*");
        cors.SupportsCredentials = true;
        config.EnableCors(cors);

0

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

import Cookies from 'universal-cookie';
const cookies = new Cookies();

function headers(set_cookie=false) {
  let headers = {
    'Accept':       'application/json',
    'Content-Type': 'application/json',
    'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')
};
if (set_cookie) {
    headers['Authorization'] = "Bearer " + cookies.get('remember_user_token');
}
return headers;
}

তারপরে আপনার কলটি তৈরি করুন:

export function fetchTests(user_id) {
  return function (dispatch) {
   let data = {
    method:      'POST',
    credentials: 'same-origin',
    mode:        'same-origin',
    body:        JSON.stringify({
                     user_id: user_id
                }),
    headers:     headers(true)
   };
   return fetch('/api/v1/tests/listing/', data)
      .then(response => response.json())
      .then(json => dispatch(receiveTests(json)));
    };
  }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.