ক্রস উত্স অনুরোধের জন্য কুকি সেট করুন


97

কিভাবে কুকিজ ক্রস উত্স ভাগ করবেন? আরও সুনির্দিষ্টভাবে, Set-Cookieশিরোনামের সাথে মিশ্রনে হেডারটি কীভাবে ব্যবহার করবেন Access-Control-Allow-Origin?

এখানে আমার পরিস্থিতির ব্যাখ্যা:

আমি localhost:4000হোস্ট করা একটি ওয়েব অ্যাপে চলমান এমন একটি API এর জন্য একটি কুকি সেট করার চেষ্টা করছি localhost:3000

দেখে মনে হচ্ছে আমি ব্রাউজারে সঠিক প্রতিক্রিয়া শিরোনাম পেয়েছি, তবে দুর্ভাগ্যক্রমে তাদের কোনও প্রভাব নেই। এগুলি প্রতিক্রিয়া শিরোনাম:

HTTP / 1.1 200 ঠিক আছে
অ্যাক্সেস-কন্ট্রোল-মঞ্জুরি-উত্স: http: // লোকালহোস্ট: 3000
বৈচিত্র্য: উত্স, গ্রহণ-এনকোডিং
সেট-কুকি: টোকেন = 0d522ba17e130d6d19eb9c25b7ac58387b798639f81ffe75bd449afbc3cc715d6b038e426adeac3316f0511dc7fae3f7; সর্বাধিক বয়স = 86400; ডোমেন = লোকালহোস্ট: 4000; পথ = /; মেয়াদ শেষ হবে = মঙ্গল, 19 সেপ্টেম্বর 2017 21:11:36 GMT; HttpOnly
বিষয়বস্তুর ধরণ: অ্যাপ্লিকেশন / জেসন; চরসেট = utf-8
সামগ্রী-দৈর্ঘ্য: 180
ইটাগ: W / "b4-VNrmF4xNeHGeLrGehNZTQNwAaUQ"
তারিখ: সোমবার, 18 সেপ্টেম্বর 2017 21:11:36 GMT
সংযোগ: বাঁচিয়ে রাখুন

তদতিরিক্ত, আমি Response Cookiesযখন Chrome এর বিকাশকারী সরঞ্জামগুলির নেটওয়ার্ক ট্যাব ব্যবহার করে ট্র্যাফিকটি পরীক্ষা করি তখন আমি কুকির নীচে দেখতে পাব । তবুও, আমি দেখতে পাচ্ছি না কুকিটি নীচে অ্যাপ্লিকেশন ট্যাবটিতে সেট করা আছে Storage/Cookies। আমি কোনও সিওআরএস ত্রুটি দেখতে পাচ্ছি না, তাই আমি ধরে নিচ্ছি যে আমি অন্য কিছু মিস করছি।

কোনও পরামর্শ?

আপডেট আমি:

আমি সার্ভারের একটি শেষ পয়েন্টে অনুরোধ জানাতে একটি প্রতিক্রিয়া-রেডাক্স অ্যাপ্লিকেশনটিতে অনুরোধ মডিউলটি ব্যবহার করছি /signin। সার্ভারের জন্য আমি এক্সপ্রেস ব্যবহার করি।

এক্সপ্রেস সার্ভার:

রেসকুকি ('টোকেন', 'এক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্স, xx ম্যাক্সএজ: 86400000, HTTP কেবল: সত্য, ডোমেন:' লোকালহোস্ট: 3000 '})

ব্রাউজারে অনুরোধ:

অনুরোধ.পোস্ট ({uri: '/ signin', json: {userName: 'userOne', পাসওয়ার্ড: '123456'}}, (ভুল, প্রতিক্রিয়া, বডি) => {
    // স্টাফ করছেন
})

আপডেট দ্বিতীয়:

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

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


4
@PimHeijden take a look to this: developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/… maybe the use of withCredentials is what you need?
Kalamarico

2
Ok you are using request and i think this is not the best choice, take a look to this post and the answer, axios i think could be usefull to you. stackoverflow.com/questions/39794895/…
Kalamarico

ধন্যবাদ! আমি লক্ষ্য করতে ব্যর্থ হয়েছি যে requestমডিউলটি ব্রাউজারে ব্যবহারের জন্য নয়। অক্ষটি এখন পর্যন্ত দুর্দান্ত কাজ করেছে বলে মনে হচ্ছে। আমি এখন উভয়ই শিরোলেখ পেয়েছি: Access-Control-Allow-Credentials:trueএবং Access-Control-Allow-Origin:http://localhost:3000(সিওআরএস সক্ষম করতে ব্যবহৃত)। এটি ঠিক মনে হচ্ছে তবে Set-Cookieশিরোনাম কিছুই করতে পারে না ...
পিম হিজডেন

একই সমস্যা, তবে সরাসরি অক্ষ ব্যবহার: স্ট্যাকওভারফ্লো . com / q / 43002444 / 488666 । যদিও { withCredentials: true }প্রকৃতপক্ষে Axios পাশে প্রয়োজন বোধ করা হয়, সার্ভার হেডার সাবধানে পাশাপাশি চেক করা আছে (দেখুন stackoverflow.com/a/48231372/488666 )
তুহিন জেড

কি সার্ভার শিরোনাম?
পিম হিজডেন

উত্তর:


155

তোমাকে যা করতে হবে

কোনও সিওআরএস অনুরোধের মাধ্যমে কুকিজ গ্রহণ ও প্রেরণে সাফল্যের জন্য, নিম্নলিখিতটি করুন।

ব্যাক-এন্ড (সার্ভার): HTTP শিরোনাম Access-Control-Allow-Credentialsমান এতে সেট করুন true। এছাড়াও, নিশ্চিত করুন HTTP- র হেডার Access-Control-Allow-Originএবং Access-Control-Allow-Headersনির্ধারণ করা হয় এবং একটি ওয়াইল্ড কার্ড না*

এক্সপ্রেস জেএস-এ সিওআর সেট করার বিষয়ে আরও তথ্যের জন্য ডক্সটি এখানে পড়ুন

ফ্রন্ট-এন্ড (ক্লায়েন্ট):XMLHttpRequest.withCredentials পতাকাটি সেট করুন এতে trueব্যবহৃত অনুরোধ-প্রতিক্রিয়া গ্রন্থাগারের উপর নির্ভর করে এটি বিভিন্ন উপায়ে অর্জন করা যেতে পারে:

বা

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

আপনি যদি কোনও কারণে এটি এড়াবেন না। সমাধান উপরে।

It turned out that Chrome won't set the cookie if the domain contains a port. Setting it for localhost (without port) is not a problem. Many thanks to Erwin for this tip!


2
I think you have this problem just because of the localhost check this here: stackoverflow.com/a/1188145 and also this may help your case (stackoverflow.com/questions/50966861/…)
Edwin

5
This answer helped me so much! Took a long time to find it. But I think the answer should mention that setting Access-Control-Allow-Origin to an explicit domain, not just "*" is also required. Then it would be the perfect answer
e.dan

6
this is good answer, and all setup for CORS, headers, backend and front end, and avoiding localhost with override /etc/hosts locally with a real subdomain, still I see postman shows a SET-COOKIE in response headers but chrome debug does not show this in response headers and also the cookie isn't actually set in chrome. Any other ideas to check?
bjm88

1
@ bjm88 আপনি কি এইটা খুঁজে পেয়েছেন? আমি ঠিক একই পরিস্থিতিতে আছি লোকালহোস্ট: 3010 থেকে লোকালহোস্ট: 5001 এর সাথে সংযোগ করার সময় কুকিটি সঠিকভাবে সেট করা থাকে তবে লোকালহোস্ট: 3010 থেকে ফেক্রেমোট: 5001 (যা আমার হোস্ট ফাইলে 127.0.0.1 এ নির্দেশ করে) কাজ করে না। যখন আমি আমার সার্ভারটিকে একটি কাস্টম ডোমেন (লোকালহোস্ট থেকে: 3010 মাইডোমেন.কম এ সংযুক্ত করছি) এর সাথে সত্যিকারের সার্ভারে হোস্ট করি তখন ঠিক এটি একই। আমি এই উত্তরে প্রস্তাবিত যা কিছু করেছি এবং আমি প্রচুর অন্যান্য বিষয়ও চেষ্টা করেছি।
ফর্ম

4
কৌণিকর ক্ষেত্রে প্রয়োজনীয় ক্লায়েন্টের পার্শ্ব পরিবর্তনটি হ'ল প্রত্যাহারগুলি যুক্ত করা: HttpClient.post, .get, বিকল্পগুলি ইত্যাদিতে পাস করা বিকল্পগুলির ক্ষেত্রে সত্য
মার্ভিন ১৯

11

2020 এ প্রকাশিত ক্রোম ব্রাউজারের জন্য নোট।

ভবিষ্যতের ক্রোমের প্রকাশ কেবল ক্রস-সাইট অনুরোধের সাথে কুকিজ বিতরণ করবে যদি সেগুলি সেট করা থাকে SameSite=Noneএবং Secure

সুতরাং যদি আপনার ব্যাকএন্ড সার্ভার সেমসাইট = কোনওটি সেট না করে, ক্রোম ডিফল্টরূপে সেমসাইট = লক্ষ ব্যবহার করবে এবং এই কুকিটি red উইথড্রেনডিয়েন্টালস: সত্য} অনুরোধগুলির সাথে ব্যবহার করবে না।

আরও তথ্য https://www.chromium.org/updates/same-site

ফায়ারফক্স এবং এজ বিকাশকারীরা ভবিষ্যতে এই বৈশিষ্ট্যটি প্রকাশ করতে চান।

স্পেস এখানে পাওয়া গেছে: https://tools.ietf.org/html/draft-west-cookie- সংশ্লেষবাদ 0-0# পৃষ্ঠা-8


4
একই সাইট = কোনওটি সরবরাহ করা এবং সুরক্ষিত পতাকাটি HTTPS প্রয়োজন। এইচটিটিপিএস বিকল্প নয় এমন একটি স্থানীয় সিস্টেমে কীভাবে এটি অর্জন করবেন? আমরা কি কোনওভাবে বাইপাস করতে পারি?
নির্মল পটেল

@ নীর্মালপেটেল কেবল চেম দেব কনসোলে "লক্ষ" মানটি সরিয়ে ফেলুন।
লেনিলিপ

3

ক্রস-উত্স অনুরোধগুলি থেকে ক্লায়েন্ট কুকিগুলি পড়তে সক্ষম হওয়ার জন্য, আপনার প্রয়োজন:

  1. সার্ভারের সমস্ত প্রতিক্রিয়াগুলির তাদের শিরোনামে নিম্নলিখিত হওয়া দরকার:

    Access-Control-Allow-Credentials: true

  2. ক্লায়েন্টকে withCredentials: trueবিকল্প সহ সমস্ত অনুরোধগুলি প্রেরণ করতে হবে

কৌণিক 7 এবং স্প্রিং বুট দিয়ে আমার বাস্তবায়নে, আমি নিম্নলিখিতটি দিয়ে তা অর্জন করেছি:


সার্ভার-সাইড:

@CrossOrigin(origins = "http://my-cross-origin-url.com", allowCredentials = "true")
@Controller
@RequestMapping(path = "/something")
public class SomethingController {
  ...
}

origins = "http://my-cross-origin-url.com"অংশ যোগ হবে Access-Control-Allow-Origin: http://my-cross-origin-url.comযে সার্ভারের প্রতিক্রিয়া হেডার

allowCredentials = "true"অংশ যোগ হবে Access-Control-Allow-Credentials: trueক্লায়েন্ট কুকিজ পড়ার জন্য অনুক্রমে যে সার্ভারের প্রতিক্রিয়া শীর্ষক, যা আমরা কি প্রয়োজন


মক্কেলের পক্ষে:

import { HttpInterceptor, HttpXsrfTokenExtractor, HttpRequest, HttpHandler, HttpEvent } from "@angular/common/http";
import { Injectable } from "@angular/core";
import { Observable } from 'rxjs';

@Injectable()
export class CustomHttpInterceptor implements HttpInterceptor {

    constructor(private tokenExtractor: HttpXsrfTokenExtractor) {
    }

    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        // send request with credential options in order to be able to read cross-origin cookies
        req = req.clone({ withCredentials: true });

        // return XSRF-TOKEN in each request's header (anti-CSRF security)
        const headerName = 'X-XSRF-TOKEN';
        let token = this.tokenExtractor.getToken() as string;
        if (token !== null && !req.headers.has(headerName)) {
            req = req.clone({ headers: req.headers.set(headerName, token) });
        }
        return next.handle(req);
    }
}

এই শ্রেণীর সাহায্যে আপনি আপনার সমস্ত অনুরোধে অতিরিক্ত জিনিস ইনজেক্ট করেন।

প্রথম অংশটি req = req.clone({ withCredentials: true });হ'ল withCredentials: trueবিকল্পটির সাথে প্রতিটি অনুরোধ প্রেরণের জন্য আপনার যা প্রয়োজন । এর ব্যবহারিকভাবে এর অর্থ হ'ল প্রথমে একটি বিকল্প অনুরোধটি প্রেরণ করা হবে, যাতে আপনি প্রকৃত POST / PUT / DELETE অনুরোধগুলি প্রেরণের আগে তাদের মধ্যে আপনার কুকিজ এবং অনুমোদনের টোকেন পান, যাতে তাদের (শিরোনামে) সাথে এই টোকেন সংযুক্ত করা দরকার in অনুরোধটি যাচাই করতে এবং কার্যকর করতে সার্ভারের আদেশ করুন।

দ্বিতীয় অংশটি হ'ল বিশেষভাবে সমস্ত অনুরোধগুলির জন্য একটি অ্যান্টি-সিএসআরএফ টোকেন পরিচালনা করে। প্রয়োজনমতো এটি কুকি থেকে পড়ে এবং প্রতিটি অনুরোধের শিরোনামে এটি লিখে দেয়।

কাঙ্ক্ষিত ফলাফলটি এরকম কিছু:

প্রতিক্রিয়া অনুরোধ


এই উত্তরটি বিদ্যমানটির সাথে কী যুক্ত করে?
পিম হিজডেন

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

দেখানো সেটিংটি allowCredentials = "true"মধ্যে @CrossOriginটীকা আমাকে সাহায্য করেছে।
30-30

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

0

পিমের উত্তরটি খুব সহায়ক। আমার ক্ষেত্রে, আমি ব্যবহার করতে হবে

Expires / Max-Age: "Session"

এটি যদি ডেটটাইম হয়, এমনকি এটির মেয়াদও শেষ হয় না, এটি এখনও কুকিকে ব্যাকএন্ডে পাঠায় না:

Expires / Max-Age: "Thu, 21 May 2020 09:00:34 GMT"

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


0

এক্সপ্রেসের জন্য, আপনার এক্সপ্রেস লাইব্রেরিটি 4.17.1সর্বশেষতম স্থিতিশীল সংস্করণে আপগ্রেড করুন । তারপরে;

CorsOption ইন: সেট originআপনার স্থানীয় হোস্ট URL বা আপনার ফ্রন্টএন্ড প্রকাশনা URL- এ এবং credentialsকরতে true উদাঃ

  const corsOptions = {
    origin: config.get("origin"),
    credentials: true,
  };

আমি কনফিগার এনপিএম মডিউলটি ব্যবহার করে আমার উত্স গতিশীলভাবে সেট করেছি ।

তারপরে, রেজ-কুকিতে:

লোকালহোস্টের জন্য: আপনার কোনও ক্ষেত্রেই একই সাইট এবং সুরক্ষিত বিকল্প সেট httpOnlyকরার দরকার নেই , আপনার ব্যবহারের ক্ষেত্রে নির্ভর করে trueএক্সএসএস আক্রমণ এবং অন্যান্য দরকারী বিকল্পগুলি রোধ করতে আপনি HTTP কুকির জন্য সেট করতে পারেন ।

উত্পাদনের পরিবেশের জন্য, আপনাকে ক্রস-অরিজিন অনুরোধ এবং এর জন্য সেট sameSiteকরতে হবে । মনে রাখবেন কেবলমাত্র এখনকার মতো এক্সপ্রেস সর্বশেষ সংস্করণে কাজ করে এবং সর্বশেষ ক্রোম সংস্করণটি কেবল কুকি সেট করে , সুতরাং নিরাপদ বিকল্পের প্রয়োজন।nonesecuretruesameSitehttps

এখানে আমি খনিকে গতিশীল করে তুলেছি

 res
    .cookie("access_token", token, {
      httpOnly: true,
      sameSite: app.get("env") === "development" ? true : "none",
      secure: app.get("env") === "development" ? false : true,
    })
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.