কেন jquery এর .ajax () পদ্ধতিটি আমার সেশন কুকি প্রেরণ করছে না?


338

$.ajax()কোনও সাইটে লগ ইন করার পরে , আমি $.ajax()সেই সাইটে দ্বিতীয় অনুরোধটি প্রেরণ করার চেষ্টা করছি - তবে যখন আমি ফায়ারব্যাগ ব্যবহার করে প্রেরিত শিরোনামগুলি পরীক্ষা করি তখন অনুরোধের সাথে সেশন কুকি অন্তর্ভুক্ত করা হয় না।

আমি কি ভুল করছি?


2
ওয়েব কুকি এবং ফায়ারব্যাগ প্রথম পৃষ্ঠা কুকি ধরার পরে এজাক্সের কুকি আসতে পারে।
ক্রিস

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

সুতরাং, আমি মনে করি
আজাক্স

আপনি কী কোডটি ব্যবহার করছেন?
ডিন হার্ডিং

ব্রাউজার এখনও একটি এজাক্স অনুরোধ, জকিউয়েরি বা অন্যথায় সার্ভারের দ্বারা সেট কুকিজ তৈরি করবে। আপনি কি এজ্যাক্সের অনুরোধের প্রতিক্রিয়াটি পরীক্ষা করে দেখেছেন এবং ঠিক করেছেন সার্ভার থেকে কুকিজ ফিরে এসেছে? সার্ভার কোডে এমন কোনও সমস্যা হতে পারে যে এটি এমনকি কুকিও সেট করে না etc. ইত্যাদি
ডেভিড

উত্তর:


218

আপনি যে ইউআরএল কল করছেন তা যদি আপনার কলিং স্ক্রিপ্টের মতো একই ডোমেনে থাকে তবে এজ্যাক্স কেবলমাত্র কুকিজ প্রেরণ কল করে।

এটি ক্রস ডোমেন সমস্যা হতে পারে।

www.domain-a.comআপনার কলিং স্ক্রিপ্টটি চালু থাকাকালীন থেকে আপনি url কল করার চেষ্টা করেছিলেন www.domain-b.com(অন্য কথায়: আপনি একটি ক্রস ডোমেন কল করেছেন যাতে ব্রাউজার আপনার গোপনীয়তা সুরক্ষার জন্য কোনও কুকিজ প্রেরণ করে না)।

এক্ষেত্রে আপনার বিকল্পগুলি হ'ল:

  • একটি ছোট প্রক্সি লিখুন যা ডোমেন-বিতে থাকে এবং আপনার অনুরোধগুলি ডোমেন-এ-তে প্রেরণ করে। আপনার ব্রাউজারটি আপনাকে প্রক্সি কল করতে অনুমতি দেবে কারণ এটি কলিং স্ক্রিপ্টের মতো একই সার্ভারে রয়েছে।
    এই প্রক্সিটি তখন আপনার দ্বারা কোনও কুকির নাম এবং মান পরামিতি গ্রহণ করতে কনফিগার করা যেতে পারে যা এটি ডোমেন-এ প্রেরণ করতে পারে। তবে এটি কাজ করার জন্য আপনাকে কুকির নাম জানতে হবে এবং আপনার ডোমেন-এ প্রমাণীকরণের জন্য সার্ভারকে মূল্য দিতে হবে।
  • আপনি যদি JSON অবজেক্টগুলি আনছেন তবে পরিবর্তে একটি JSONP অনুরোধ ব্যবহার করার চেষ্টা করুন । jQuery এগুলিকে সমর্থন করে। তবে আপনাকে ডোমেন-এ আপনার পরিষেবা পরিবর্তন করতে হবে যাতে এটি বৈধ JSONP সাড়া দেয়।

খুশী যদি এটি আরও কিছুটা সহায়তা করে।


19
এটিও লক্ষণীয় যে কুকিগুলি একটি নির্দিষ্ট পথে সেট করা যেতে পারে তাই আপনি যদি কুকিটি সেট করে path=/somethingরেখেছিলেন এবং আপনি পৃষ্ঠাটির জন্য অনুরোধ করছেন /anotherতবে কুকি প্রেরণ হবে না। আপনি পৃষ্ঠাটি অনুরোধ করার /somethingসময় কুকি প্রত্যাশিত হিসাবে প্রেরণ করা হবে। সুতরাং কোডটি যা কুকি সেট করে তাও পরীক্ষা করে দেখুন।
30flafle

2
একটি জন্সপ অনুরোধ কোকিজ প্রেরণ করে?
আলবেনেক্স

1
@ আলবানেক্স হ্যাঁ, যদি আমি উল্লেখ করা প্রয়োজনীয়তাগুলি সেট করা থাকে। এটি অন্য যে কোনও সাধারণ অনুরোধ এবং যেমন কুকিগুলি প্রেরণ করে।
ফ্লু 15

1
@ আলবানেক্স এই অন্যান্য সম্পর্কিত প্রশ্নের মধ্যে কাস্টম কুকিজের সাথে জেএসওএনপি অনুরোধটি কীভাবে করা যায় তার একটি উদাহরণ রয়েছে
আন্তোনিওহেরাইজস

4
উইকিপিডিয়া> জেএসএনপি-এর মতে এই পন্থাটি সিওআরএসের পক্ষে ছেড়ে দেওয়া হয়েছিল
পিটার ডটচেভ

388

আমি ক্রস-ডোমেন দৃশ্যে পরিচালনা করছি। লগইন চলাকালীন রিমোট সার্ভার সেট- Access-Control-Allow-Credentialsসত্যের সাথে সেট -কুকির শিরোনামটি ফিরিয়ে দিচ্ছে।

রিমোট সার্ভারে পরবর্তী এজাক্স কলটিতে এই কুকিটি ব্যবহার করা উচিত।

Access-Control-Allow-Credentialsক্রস-ডোমেন লগিংয়ের অনুমতি দেওয়ার জন্য সিওআরএস রয়েছে। উদাহরণের জন্য https://developer.mozilla.org/En/HTTP_access_control দেখুন ।

আমার কাছে এটি JQuery (বা অন্তত পরবর্তী সংস্করণে বৈশিষ্ট্যযুক্ত হতে হবে) এর মতো বাগের মতো মনে হচ্ছে।

হালনাগাদ:

  1. AJAX প্রতিক্রিয়া থেকে কুকিজ স্বয়ংক্রিয়ভাবে সেট করা হয় না (উদ্ধৃতি: http://aleembawany.com/2006/11/14/anatomy-of-a-well-designed-ajax-login- অভিজ্ঞতা / )

    কেন?

  2. ম্যানুয়ালি সেট করার প্রতিক্রিয়া থেকে আপনি কুকির মান পেতে পারবেন না ( http://www.w3.org/TR/XMLHttpRequest/#dom-xMLhttprequest-getresponseheader )

    আমি বিভ্রান্ত ..

    প্যারামিটার jquery.ajax()সেট করতে বলার উপায় থাকতে পারে XMLHttpRequest.withCredentials = "true"

উত্তর: আপনার http://api.jquery.com/jQuery.ajax/xhrFields এর প্যারাম ব্যবহার করা উচিত

ডকুমেন্টেশনের উদাহরণটি হ'ল:

$.ajax({
   url: a_cross_domain_url,
   xhrFields: {
      withCredentials: true
   }
});

সার্ভার এই অনুরোধটির সঠিক উত্তর দেয় তাও গুরুত্বপূর্ণ। @ ফ্রিডরিক এবং @ পেবলের দুর্দান্ত মন্তব্যগুলি এখানে অনুলিপি করা হচ্ছে:

Important note: when responding to a credentialed request, server must specify a domain, and cannot use wild carding. The above example would fail if the header was wildcarded as: Access-Control-Allow-Origin: *

তাই যখন অনুরোধটি হয়:

Origin: http://foo.example
Cookie: pageAccess=2

সার্ভারের সাথে প্রতিক্রিয়া জানানো উচিত:

Access-Control-Allow-Origin: http://foo.example
Access-Control-Allow-Credentials: true

[payload]

অন্যথায় পে-লোড স্ক্রিপ্টে ফিরে আসবে না। দেখুন: https://developer.mozilla.org/en-US/docs/Web/HTTP/Acecess_control_CORS# রিকুইয়েস্টস_সামান্য শংসাপত্র


8
দুর্দান্ত! আমি এই + সেটটি অ্যাক্সেস-কন্ট্রোল-অনুমোদনের শংসাপত্রগুলির শিরোনামটি সার্ভারের পাশে সত্য হিসাবে ব্যবহার করতে যোগ করব
ফ্রেডেরিক

এবং আমি শংসাপত্রগুলি কোথায় সেট করব?, শিরোনাম অটোরিয়েশনে?, অনুরোধ সংস্থায়?
ফ্রান্সিসকো

3
উত্তরের জন্য ধন্যবাদ :) মাত্র একটি দ্রুত সংযোজন, এটি উল্লেখযোগ্য হতে পারে Important note: when responding to a credentialed request, server must specify a domain, and cannot use wild carding. The above example would fail if the header was wildcarded as: Access-Control-Allow-Origin: * ডেভেলপার.মোজিলা.আর.ইন-
ইউএস

দুর্ভাগ্যক্রমে এগুলির কোনওটিই আমার পক্ষে কাজ করেনি। যদি আমি AngularJS থেকে একই অনুরোধটি চালনা করি তবে এটি jQuery থেকে, এমনকি এই পরামর্শগুলির সাথে সেশন কুকিটি পাস হয় নি। (jQuery v2.1.1)
জিওএইডিসিক

(ওও) আপনি আমাকে বিভিন্ন বেদনাদায়ক ঘন্টা থেকে বাঁচিয়েছেন। কি নিখুঁত উত্তর! ধন্যবাদ! আমি আমার ওয়েবসাইট এর সর্বজনীন রুট .htaccess এই যোগ করার জন্য প্রয়োজন: <IfModule mod_headers.c> শিরোলেখ সেট অ্যাক্সেস-নিয়ন্ত্রণ-মঞ্জুর করুন বংশোদ্ভূত " স্থানীয় হোস্ট " হেডারের সেট অ্যাক্সেস-নিয়ন্ত্রণ-মঞ্জুর করুন-শংসাপত্রের "সত্যিকারের" </ IfModule>
বিনয় বিশ

48

ব্যবহার

xhrFields: { withCredentials:true }

আমার jQuery এর অংশ হিসাবে এজ্যাক্স কলটি কেবল সমাধানের অংশ ছিল। আমার সংস্থান থেকে বিকল্পগুলি প্রতিক্রিয়াতে আমার শিরোনামগুলি ফিরে আসা দরকার:

Access-Control-Allow-Origin : http://www.wombling.com
Access-Control-Allow-Credentials : true

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

আমি ভেবেছিলাম এটি কেবলমাত্র একটি উত্সের প্রয়োজনীয়তার জন্য স্পষ্টভাবে উল্লেখ করা উপযুক্ত, কারণ ডাব্লু 3 সি স্ট্যান্ডার্ড কোনও স্থান পৃথকীকরণের তালিকার জন্য অনুমতি দেয় - তবে ক্রোম দেয় না! http://www.w3.org/TR/cors/#access-control-allow-origin-response-header NB "অনুশীলনে" বিট করুন।


41

এটি আপনার init ফাংশনে রাখুন:

$.ajaxSetup({
  xhrFields: {
    withCredentials: true
  }
});

এটা কাজ করবে।


1
তুমি আমার দিন বাঁচিয়েছ! ক্রেডিটেন্সিয়াল সহ পদ্ধতি স্তরে আমার পক্ষে কাজ হয়নি। তবে বিশ্বব্যাপী এটি শেষ পর্যন্ত কাজ করে! ধন্যবাদ।
পলিয়াস ম্যাটুলিওনিস

এটির সাথে সাবধান থাকুন, কারণ এটি অন্য ডোমেনগুলির জন্য ইথার সমস্ত অনুরোধগুলিতে কুকিজ প্রেরণ করবে (যা অ্যাক্সেস-কন্ট্রোল-অনুমতি-শংসাপত্রের প্রয়োজনের দ্বারা অনুরোধটি ব্যর্থ করে)
gdbdable

12

এই প্রশ্নের ইতিমধ্যে অনেক ভাল প্রতিক্রিয়া রয়েছে, তবে আমি ভেবেছিলাম যে আপনি যেখানে সেশন কুকি প্রেরণের প্রত্যাশা করবেন সে ক্ষেত্রে এটি পরিষ্কার করা সহায়ক হতে পারে কারণ কুকি ডোমেন মেলে তবে এটি প্রেরণ হচ্ছে না কারণ এজেএক্স অনুরোধটি একটি ভিন্ন সাবডোমেন তৈরি করা হচ্ছে। এই ক্ষেত্রে, আমার কাছে একটি কুকি রয়েছে যা * .mydomain.com ডোমেইনে অর্পণ করা হয়েছে , এবং আমি এটি আলাদা . mydomain.com "এজেএক্স অনুরোধে অন্তর্ভুক্ত করতে চাই ।" ডিফল্টরূপে, কুকিটি প্রেরণ হয় না। এই সমস্যাটি সমাধান করার জন্য আপনার সেশন কুকিতে HTTPONLY নিষ্ক্রিয় করার দরকার নেই omb গর্ভগর্ভের পরামর্শ অনুসারে আপনাকে কেবল এটি করতে হবে ( https://stackoverflow.com/a/23660618/545223 ) এবং নিম্নলিখিতগুলি করুন।

1) আপনার এজ্যাক্স অনুরোধে নিম্নলিখিতগুলি যুক্ত করুন।

xhrFields: { withCredentials:true }

2) বিভিন্ন সাবডোমেনের সংস্থানগুলির জন্য আপনার প্রতিক্রিয়া শিরোনামগুলিতে নিম্নলিখিতগুলি যুক্ত করুন।

Access-Control-Allow-Origin : http://original.mydomain.com
Access-Control-Allow-Credentials : true

7

অন্যান্য সমাধানগুলি চেষ্টা করার পরেও এটি কাজ না করার পরে, আমি আমার ক্ষেত্রে সমস্যাটি কী তা খুঁজে পেয়েছি। আমি "অ্যাপ্লিকেশন / জসন" থেকে কন্টেন্টটাইপকে "পাঠ্য / প্লেইন" এ পরিবর্তন করেছি।

$.ajax(fullUrl, {
    type: "GET",
    contentType: "text/plain",
    xhrFields: {
         withCredentials: true
    },
    crossDomain: true
});

4

আমার একই সমস্যা ছিল এবং আমার স্ক্রিপ্টটি পরীক্ষা করা কেবল সেশনড কুকি পাচ্ছিল না।

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

এটির সমাধানের জন্য আমি একটি সেটিংস পরিবর্তন করেছি (SESSION_COOKIE_HTTPONLY = মিথ্যা) তবে অন্য ক্ষেত্রে এটি কুকির পথে একটি "এইচটিটিপি ওলি" পতাকা হতে পারে


2
এটা করো না. এটি ক্লায়েন্ট সাইড স্ক্রিপ্টটি সেশন কুকিতে অ্যাক্সেসের অনুমতি দেয় যা সর্বাধিক সাধারণ এক্সএসএস আক্রমণ ভেক্টর। owasp.org/index.php/HttpOnly
জেসন এলকিন

1

যদি আপনি উপরের উত্তরগুলিতে বর্ণিত পদক্ষেপগুলি ছাড়াও localhostলোকালহোস্টের কোনও বন্দর বা বন্দর বিকাশ করছেন তবে আপনাকেও localhost:8080নিশ্চিত করতে হবে যে আপনি সেট-কুকি শিরোনামে কোনও ডোমেন মান পাস করছেন না।
আপনি localhostসেট-কুকি শিরোনামে ডোমেন সেট করতে পারবেন না - এটি ভুল - কেবলমাত্র ডোমেন বাদ দিন।

স্পষ্ট ডোমেন সহ লোকালহোস্টের কুকিগুলি দেখুন এবং কেন এ্যাসপনেটার লোকালহোস্টে কুকিজ তৈরি করবে না?


0

লোকালহোস্ট এবং ডেভ পরিবেশের অধীনে থাকাকালীন PHPSESSID কুকি ইস্যু সেট করতে আমার কেবল 2 সেন্ট। আমি লোকাহোস্টে আমার REST API এর শেষ পয়েন্টে AJAX কল করি। বলুন এর ঠিকানাটি mysite.localhost/api/member/login/(আমার দেব পরিবেশে কার্যত হোস্ট)।

  • আমি পোস্টম্যানের কাছে যখন এই অনুরোধটি করি তখন জিনিসগুলি ঠিকঠাক হয় এবং প্রতিক্রিয়াটির সাথে PHPSESSID সেট করা হয়।

  • আমি যখন ব্রাউজারসিন্সি প্রক্সাইড পৃষ্ঠা থেকে এজেএক্সের মাধ্যমে এই শেষ পয়েন্টটির জন্য অনুরোধ করি (উদাহরণস্বরূপ 122.133.1.110:3000/test/api/login.phpআমার ব্রাউজারের ঠিকানা লাইন থেকে, ডোমেনটি ভিন্ন বনাম দেখুন mysite.localhost) পিএইচপিএসইএসআইডি কুকিজের মধ্যে উপস্থিত হয় না।

  • আমি যখন একই ডোমেনে পৃষ্ঠাটি থেকে সরাসরি এই অনুরোধটি করি (যেমন mysite.localhost/test/api/login.php) পিএইচপিএসইএসআইডি ঠিক ঠিক সেট করা থাকে।

সুতরাং এটি উপরে ক্রুস-উত্সের অনুরোধ কুকিজ ইস্যু যা উপরে @ ফ্লু উত্তরে উল্লিখিত হয়েছে


0

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

ওয়েব সার্ভার - মাইডোমাইন / ওয়েবপেজ /abc.html

ব্যবহৃত abc.js যা কুকিটির নাম মাইকুকি সেট করে

অ্যাপ সার্ভার - মায়ডোমেন / ওয়েবপিস / সার্ভিসনেম en

যা এপিআই কল করা হয়েছিল

আমি মাইডোমাইন / ওয়েবপিস / সার্ভিসনেমে কুকিটি আশা করছিলাম এবং এটি পড়ার চেষ্টা করেছি তবে এটি প্রেরণ করা হয়নি। উত্তরটি থেকে মন্তব্য পড়ার পরে, আমি ব্রাউজারের বিকাশের সরঞ্জামটি চেক করেছিলাম যে মাইকির পথটি "/ ওয়েবপৃষ্ঠাগুলি " তে সেট করা আছে এবং তাই পরিষেবা কলটিতে উপলভ্য নয়

mydomain / webapis / SERVICENAME

সুতরাং jquery থেকে কুকি সেট করার সময়, আমি এটিই করেছি -

$.cookie("mycookie","mayvalue",{**path:'/'**});

-5

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

var flashUpload = false;   

asset.php এ) এবং লাইটগুলি আবার জ্বলতে শুরু করে।

এই সমস্যাগুলি ডিবাগ করা খুব কঠিন হতে পারে যে আমি খুঁজে পেয়েছি যে আপলোড হ্যান্ডলারের মধ্যে নীচের মতো কিছু স্থাপন করা আপনাকে সঠিক ট্র্যাকের উপর সেট করবে (ভাল, আমি এই ক্ষেত্রে):

$sn=session_name();
error_log("session_name: $sn ");

if(isset($_GET[$sn])) error_log("session as GET param");
if(isset($_POST[$sn])) error_log("session as POST param");
if(isset($_COOKIE[$sn])) error_log("session as Cookie");
if(isset($PHPSESSID)) error_log("session as Global");

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


আমি মনে করি না উপরের উদাহরণটি কাজ করবে, কারণ যখন কোনও সেশন কুকি নেই, তখন $ sn এর মান কত হবে? (একটি এলোমেলো, বা সম্ভবত নাল), বিকল্প হিসাবে ব্যবহারকারীরা উদাহরণস্বরূপ session_name(isset($_GET['sess']) ? $_GET['sess'] : null);session_start();এইভাবে একটি জিইটি মান থেকে সেশন_নাম সেট করতে পারে , তারা একটি কাজের জিনিস পেতে চাইবে
ইস্পাত ব্রেইন

ঠিক তেমনই আমি সমস্যাটি পেয়েছি: এই ফ্ল্যাশ আপলোডার জিনিসটি পোস্ট করার সময় কোনও সেশন নেই। জিইটি ভেরিয়েবল সেশন শনাক্তকারী ব্যবহার করা একটি খারাপ ধারণা, এবং কুকি কাজ করছে না, তাই আমি এটিকে ফেলে দিয়েছি। কে পাত্তা দেয়, ফ্ল্যাশ যাইহোক অতীতের জিনিস।
এলার্ট ভ্যান কোপেরেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.