2013-10-15 20 views
23

में "सेट-कुकी" को समझ में नहीं आता है, मेरे पास प्रमाणीकरण के लिए पासपोर्ट मॉड्यूल के साथ एक नोडजेस एक्सप्रेस REST api है। एक लॉगिन विधि (जीईटी) शीर्षलेख में एक कुकी देता है। जब मैं इसे क्रोम से कॉल करता हूं तो यह ठीक काम करता है, मेरी कुकी मेरे ब्राउज़र में सेट है।

लेकिन अगर मैं इसे Angularjs से $ http के माध्यम से कॉल करता हूं, तो कुकी सेट नहीं होती है।

Set-Cookie:connect.sid=s%3Ad7cZf3DSnz-IbLA_eNjQr-YR.R%2FytSJyd9cEhX%2BTBkmAQ6WFcEHAuPJjdXk3oq3YyFfI; Path=/; HttpOnly 

जैसा कि आप ऊपर देख सकते हैं, सेट-कुकी http सेवा प्रतिक्रिया के शीर्षलेख में मौजूद है।

शायद एचटीपी केवल इस समस्या का स्रोत हो सकता है? यदि हां, तो मैं इसे कैसे बदल सकता हूं? यहाँ मेरी एक्सप्रेस विन्यास है:

app.configure(function() { 
    app.use(allowCrossDomain); 
    app.use(express.bodyParser()); 
    app.use(express.cookieParser()) 
    app.use(express.session({ secret: 'this is a secret' })); 
    app.use(flash()); 
    //passport init 
    app.use(passport.initialize()); 
    app.use(passport.session()); 
    app.set('port', process.env.PORT || 8080); 
}); 

आपकी मदद

+0

क्या आप अपनी कोणीय विधि प्रदान कर सकते हैं जो कृपया लॉगिन के लिए $ http पर कॉल करें। यह नहीं बता सकता कि अब – Ostro

उत्तर

19

प्रमाण पत्र का उपयोग करने के लिए अपने $ http अनुरोध को कॉन्फ़िगर करना सुनिश्चित करें। एक्सएचआर प्रलेखन से:

https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS

सबसे दिलचस्प क्षमता दोनों XMLHttpRequest और प्रवेश नियंत्रण द्वारा उजागर "credentialed" अनुरोध करता है कि HTTP कुकी और HTTP प्रमाणीकरण जानकारी के जानकार हैं बनाने की क्षमता है। डिफ़ॉल्ट रूप से, क्रॉस-साइट XMLHttpRequest इनवोकेशन में, ब्राउज़र प्रमाण-पत्र नहीं भेजे जाएंगे।XMLHttpRequest ऑब्जेक्ट पर इसे लागू होने पर एक विशिष्ट ध्वज सेट करना होगा।

आप उपयोग कर सकते हैं विकल्प क्रेडेंशियल्स के उपयोग के सेट पर आपत्ति, देख

http://docs.angularjs.org/api/ng.$http

उदाहरण:

$http({withCredentials: true, ...}).get(...) 
+3

लेकिन AngularJS अभी भी प्रतिक्रिया में 'सेट-कुकी' को समझ में नहीं आता है। – Melkor

5

आप कुकी के अस्तित्व के लिए कैसे की जाँच कर रहे करने के लिए धन्यवाद?

$http ब्राउज़र के एक्सएचआर के आसपास सिर्फ एक रैपर है, जैसे कि jQuery के $.ajax और दोस्तों। इसका मतलब है कि आपका ब्राउज़र सामान्य रूप से कुकीज़ को संभाल लेगा।

मेरा अनुमान है कि कुकी है स्थापित किया जा रहा है, लेकिन आप document.cookie के माध्यम से इसे पढ़ने के लिए कोशिश कर रहे हैं। HttpOnly स्क्रिप्ट को कुकी तक पहुंचने से रोकता है। यह एक अच्छी बात है।

HttpOnly एक्सएसएस हमलों के खिलाफ कम करने में मदद करता है। यह दुर्भावनापूर्ण स्क्रिप्ट के लिए उपयोगकर्ता के सत्र टोकन (और इस प्रकार उनके लॉगिन) को चुरा लेना असंभव बनाता है। HttpOnly बंद न करें।

आपको कुकी को वैसे भी नहीं चाहिए। चूंकि $http एक्सएचआर के आसपास सिर्फ एक रैपर है, अगली बार जब आप अनुरोध करते हैं तो ब्राउज़र स्वचालित रूप से कुकी भेज देगा। आप डेवलपर टूल 'नेटवर्क पैनल में अनुरोध देखकर इसे सत्यापित कर सकते हैं।

+0

के लिए क्या गलत है, मैं क्रेडेंशियल्स को सत्य के साथ सेट करने की विशिष्ट आवश्यकता के लिए पोस्ट को संपादित कर दूंगा। यह बिना कुकीज़ और एक्सेस-कंट्रोल-अनुमति-प्रमाण-पत्र शीर्षलेख नहीं भेजेगा। एचटीपी के बारे में टिप्पणियों के बारे में केवल यह सुनिश्चित करने के लिए कि यह सब कुछ सुरक्षित है, एक बहुत अच्छा बिंदु +1 है। –

0

आप express.session कॉन्फ़िगर करके इसे बदल सकते हैं:

app.use(express.session({ 
    secret : 'this is a secret', 
    cookie : { 
    httpOnly : false, 
    maxAge : XXX // see text 
    } 
}); 

लेकिन मुझे नहीं लगता कि कोणीय कुकीज़ के बारे में ज्यादा परवाह नहीं करते हैं, उन ब्राउज़र द्वारा नियंत्रित किया जाता है (और मैं @ josh3736 साथ सहमत हैं कि आप के लिए httpOnly रखना चाहिए true)।

यह आपके कुकीज़ (ब्राउज़र-) सत्र कुकीज़ के साथ कुछ करने के लिए हो सकता है। आप कोशिश कर सकते हैं और देख सकते हैं कि कुकी के लिए maxAge स्पष्ट रूप से सेट करके यह बेहतर काम करता है (मिलीसेकंड में)।

5

मैं कोणीय $http अनुरोध में {withCredential : true} की स्थापना करके समस्या का समाधान और सेटिंग द्वारा:

res.header("Access-Control-Allow-Credentials", true); 

मेरे एक्सप्रेस सर्वर कॉन्फ़िगरेशन में। ऐसा करके, मेरी कुकी मेरी ब्राउज़र कुकीज़ सूची में अच्छी तरह से दिखाई देती है।

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