2013-01-08 18 views
33

के माध्यम से अजाक्स अनुरोध के साथ ब्राउज़र पर सेट-कुकी एक AJAX लॉगिन/साइनअप प्रक्रिया को लागू करने का प्रयास (प्रमाणीकरण के साथ कोई ताज़ा साइट नहीं)। राज्य संरक्षण के लिए कुकीज़ का उपयोग करना। मैंने सोचा कि मुझे अभी तक यह अधिकार होगा लेकिन किसी कारण से ब्राउजर सर्वर से वापस आने के बाद कुकीज़ सेट नहीं करता है। क्या कोई मदद कर सकता है? यहाँ अनुरोध और प्रतिक्रिया हेडर हैं:सीओआरएस

Request URL:http://api.site.dev/v1/login 
Request Method:POST 
Status Code:200 OK 

अनुरोध हेडर

Accept:application/json, text/plain, */* 
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3 
Accept-Encoding:gzip,deflate,sdch 
Accept-Language:en-US,en;q=0.8 
Connection:keep-alive 
Content-Length:57 
Content-Type:application/json;charset=UTF-8 
Host:api.site.dev 
Origin:http://site.dev 
Referer:http://site.dev/ 
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.101 Safari/537.11 
withCredentials:true 
X-Requested-With:XMLHttpRequest 
Request Payload 
{"email":"[email protected]","password":"foobar"} 

प्रतिक्रिया हेडर

Access-Control-Allow-Credentials:true 
Access-Control-Allow-Headers:X-Requested-With, Content-Type, withCredentials 
Access-Control-Allow-Methods:GET, POST, PUT, DELETE, OPTIONS 
Access-Control-Allow-Origin:http://site.dev 
Connection:Keep-Alive 
Content-Length:19 
Content-Type:application/json 
Date:Tue, 08 Jan 2013 18:23:14 GMT 
Keep-Alive:timeout=5, max=99 
Server:Apache/2.2.22 (Unix) DAV/2 PHP/5.4.7 mod_ssl/2.2.22 OpenSSL/0.9.8r 
Set-Cookie:site=%2B1THQQ%2BbZkEwTYFvXFVV5fxi00l2K%2B6fvt9SuHACTNsEwUGzDSUckt38ZeDsNbZSsqzHmPMWRLc84eDLZzh8%2Fw%3D%3D; expires=Thu, 10-Jan-2013 18:23:14 GMT; path=/; domain=.site.dev; httponly 
X-Powered-By:PHP/5.4.7 

मैं भी, क्रोम नेटवर्क उपकरणों में कुकी को देखने के रूप में से लौटे सर्वर:

रिस्पांस कुकीज़

Name: site 
Value: %2B1THQQ%2BbZkEwTYFvXFVV5fxi00l2K%2B6fvt9SuHACTNsEwUGzDSUckt38ZeDsNbZSsqzHmPMWRLc84eDLZzh8%2Fw%3D%3D 
Domain: .site.dev 
Path:/
Expires: Session 
Size: 196 
Http: ✓ 
+0

क्या यह आरएफसी 210 9 की धारा 4.3.2 के अनुसार एक डोमेन-मिलान समस्या है? मैं पूरी तरह से स्पष्ट नहीं हूं कि आपका होस्ट (api.site.dev) और कुकी-डोमेन (.site.dev) आवश्यकतानुसार "डोमेन-मिलान" है या नहीं। इसका सीओआरएस पक्ष इसे कम करने में आसान नहीं बनाता है, या तो :) – broofa

+0

[सीओआरएस अनुरोध का संभावित डुप्लिकेट - कुकीज़ क्यों नहीं भेजी जाती हैं?] (Http://stackoverflow.com/questions/8863571/cors-request - कुकीज़-नहीं-भेजे गए हैं) –

उत्तर

17

आपका AJAX अनुरोध सही पर सेट "withCredentials" सेटिंग्स (XMLHttpRequest2 में ही उपलब्ध हैं और लाने के) के साथ किया जाना चाहिए जवाब एक StackOverflow टिप्पणी में फिट नहीं है। इस लेख को मैंने इस विषय पर लिखा है: http://www.redotheweb.com/2015/11/09/api-security.html

+1

समस्या: - क्रेडेंशियल ध्वज सत्य होने पर 'वाइल्डकार्ड' * 'को' एक्सेस-कंट्रोल-ऑब्जेक्ट-ओरिजिन 'हेडर में उपयोग नहीं किया जा सकता है। उत्पत्ति 'शून्य' इसलिए पहुंच की अनुमति नहीं है। – ZiglioUK

+0

फ्रेंकोइस, मैंने आपका लेख पढ़ा है, मैं एक एपीआई खा रहा हूं जो एक वेब सेवा है। इसके लिए सिस्टम प्रमाणीकरण की आवश्यकता है (डीबी संचालित नहीं)। मैं प्रमाण पत्र के साथ उपयोग करता हूं और लॉगिन करने में सक्षम हूं। अब कुकी में इस क्रेडेंशियल को स्टोर करना और प्रमाणीकरण बाईपास करना संभव है। लेख के लिए धन्यवाद। –

+0

आपको प्रतिक्रिया शीर्षलेख 'पहुंच-नियंत्रण-अनुमति-प्रमाण-पत्र' को 'सत्य' पर भी सेट करना होगा, अन्यथा ब्राउज़र अनुरोध को अस्वीकार कर देगा (अस्वीकार कर देगा)। – Tim

5

मैं एक समान समस्या थी, और यह पता चला कि ब्राउज़र सेटिंग्स तृतीय पक्ष कुकी अवरुद्ध किया गया (क्रोम> सेटिंग> उन्नत सेटिंग> गोपनीयता> सामग्री सेटिंग> तृतीय-पक्ष कुकीज़ और साइट डेटा)। अनब्लॉकिंग समस्या हल हो गई! ,

var req = new XMLHttpRequest(); 
    req.open('GET', 'https://api.bobank.com/accounts', true); // force XMLHttpRequest2 
    req.setRequestHeader('Content-Type', 'application/json; charset=utf-8'); 
    req.setRequestHeader('Accept', 'application/json'); 
    req.withCredentials = true; // pass along cookies 
    req.onload = function() { 
     // store token and redirect 
     let json; 
     try { 
      json = JSON.parse(req.responseText); 
     } catch (error) { 
      return reject(error); 
     } 
     resolve(json); 
    }; 
    req.onerror = reject; 

आप CORS, एपीआई सुरक्षा, और कुकीज़ पर एक विस्तृत विवरण चाहते हैं:

+2

दरअसल। और चूंकि सफारी में यह डिफ़ॉल्ट सेटिंग है, और अधिकांश अन्य ब्राउज़रों में संभव है, एक साइट बनाना, जो सीओआरएस के माध्यम से तीसरे पक्ष की कुकीज़ पर निर्भर करता है, कुछ विचारों के साथ किया जाना चाहिए। कुछ उपयोगकर्ताओं को साइट पर काम करने के लिए तृतीय पक्ष कुकीज़ सक्षम करने के लिए कहा जा सकता है। –

+0

मैंने महसूस किया कि यह मेरी समस्या थी, इससे पहले कि मैंने तीन घंटों की समस्या निवारण और समर्थन की तलाश की थी। धन्यवाद! – Chris

+11

मुझे एक ही समस्या है, लेकिन "तृतीय पक्ष कुकीज़ और साइट डेटा को अवरोधित करें" पहले ही अक्षम कर दिया गया है। – Thayne

संबंधित मुद्दे