2012-02-01 22 views
28

मेरे साथ भालू, इसे किसी स्पष्टीकरण की आवश्यकता है।मोबाइल वेबव्यू से कॉर्स कुकी क्रेडेंशियल्स स्थानीय रूप से फ़ाइल के साथ लोड किया गया: //

मैं एक हाइब्रिड मोबाइल वेब ऐप बनाने में मदद कर रहा हूं। मुख्य कोडबेस एचटीएमएल 5 और जावास्क्रिप्ट है, जो मूल मोबाइल वेब व्यू (एक ला फोनगैप) में लपेटा जाएगा।

कार्यक्षमता का एक हिस्सा ऐप को हमारे ग्राहकों में से किसी एक द्वारा नियंत्रित वेब सेवा पर जानकारी पोस्ट करने की आवश्यकता है। इस वेब सेवा को बदलने के लिए बहुत कम गुंजाइश है क्योंकि इसका इस्तेमाल दूसरों द्वारा किया जा रहा है। हम एक HTTP पोस्ट का उपयोग कर JSON भेजते हैं और सर्वर से प्रतिक्रिया प्राप्त करते हैं। इस प्रतिक्रिया का हिस्सा एक JSESSIONID कुकी है जो सर्वर के साथ हमारे सत्र का प्रबंधन करता है। प्रारंभिक initSession() कॉल के बाद, हमें JSESSIONID कुकी को प्रत्येक (AJAX) अनुरोध के साथ भेजने की आवश्यकता है।

मोबाइल डिवाइस पर तैनात किए जाने पर, वेब ऐप देशी वेब व्यू में लपेटा जाता है, जो file:///path/to/app/index.html पर ब्राउज़ करके वेब ऐप शुरू करता है।

पहली बात हमने कोशिश की थी कि हमारे ग्राहक को सीआरओएस को अनुमति देने के लिए उनके प्रतिक्रिया शीर्षलेख में Access-Control-Allow-Origin: * सेट करने के लिए कहा जा रहा था। इसके बाद हमने सर्वर पर पोस्ट करने का प्रयास किया:

$.ajax({ 
    url: 'http://thirdparty.com/ws', 
    data: data, 
    type: "POST", 
    dataType: "JSON", 
    success: successCallback, 
    error: failedCallback 
}); 

अनुरोधों की निगरानी, ​​यह स्पष्ट था कि कुकीज़ शामिल नहीं की जा रही थीं। करीब निरीक्षण पर special section in the CORS spec for dealing with user credentials है, जिसमें सत्र कुकीज़ शामिल है। इसलिए मैंने इसे शामिल करने के लिए AJAX कॉल को संशोधित किया:

$.ajax({ 
    url: 'http://thirdparty.com/ws', 
    data: data, 
    type: "POST", 
    dataType: "JSON", 
    success: successCallback, 
    error: failedCallback, 
    xhrFields { withCredentials: true } 
}); 

ब्राउज़र से इस बार एक और त्रुटि। अधिक पढ़ने से निम्नलिखित उत्पन्न हुए:

यदि तृतीय पक्ष सर्वर ने Access-Control-Allow-Credentials: true शीर्षलेख के साथ प्रतिक्रिया नहीं दी है तो प्रतिक्रिया को अनदेखा कर दिया जाएगा और वेब सामग्री पर उपलब्ध नहीं किया जाएगा।

महत्वपूर्ण नोट: एक प्रमाणित अनुरोध का जवाब देते समय, सर्वर को Access-Control-Allow-Origin शीर्षलेख में एक डोमेन निर्दिष्ट करना होगा, और जंगली कार्डिंग का उपयोग नहीं कर सकता है।

तो हम सर्वर के हेडर को बदलने के लिए Access-Control-Allow-Credentials: true और Access-Control-Allow-Origin हमारे उत्पत्ति को शामिल करना होगा।

यहां हम अंततः मेरी समस्या पर आते हैं: when loading a web page using the file:// protocol, Origin वेब व्यू से भेजे गए अनुरोध हेडर को null पर सेट किया गया है। इसलिए इसे सर्वर द्वारा पार्स नहीं किया जा सकता है और इसलिए सर्वर इसे Access-Control-Allow-Origin में सेट नहीं कर सकता है। लेकिन अगर सर्वर Access-Control-Allow-Origin* के अलावा किसी अन्य चीज़ पर सेट नहीं कर सकता है, तो हम कुकीज सहित प्रमाण-पत्र नहीं भेज सकते हैं।

तो मैं अटक गया हूं। क्या करें? I saw a similar question posted here लेकिन मैं वास्तव में प्रस्तावित उत्तर को समझ नहीं पा रहा हूं। कोई भी सहायताकाफी प्रशंसनीय होगी!

+2

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

+0

हां, यह अंतरिम समाधान है, एक बुरा PHP कर्ल इंटरमीडिएट गेटवे। यह वास्तव में आदर्श नहीं है, लेकिन कम से कम समय के लिए काम करता है। – fiznool

+0

एक चीज जो मैं कर सकता हूं वह फोनगैप देवताओं से पूछता है अगर उन्होंने पहले ऐसा कुछ देखा है और कोई कामकाज है ... – fiznool

उत्तर

0

www.5app.co.uk पर देखने का प्रयास करें। एक्सएचआर कॉल के उपयोग से पूरी तरह से बचें और डेटा कनेक्शन आने पर और मोबाइल पर भरोसेमंद काम करता है। गेटवे फिर आपके ग्राहक के साथ इंटरफेस करता है।

+0

जानकारी के लिए धन्यवाद। आदर्श रूप से मैं ऐप्स को विकसित करने में एक कट्टरपंथी बदलाव की तलाश नहीं कर रहा हूं, लेकिन मैं देखूंगा कि 5app हमें क्या पेशकश कर सकता है। – fiznool

2

मुझे कल्पना है कि यदि आप हाइब्रिड एप्लिकेशन बना रहे हैं तो आप कॉर्डोवा का उपयोग कर रहे हैं। यदि ऐसा है तो आपको सीओआरएस की आवश्यकता नहीं है, आपको केवल उन डोमेन को सूचीबद्ध करने की आवश्यकता है जिन्हें आप एक्सेस करने जा रहे हैं।

http://docs.phonegap.com/en/3.0.0/guide_appdev_whitelist_index.md.html

0

उपयोग jsonp अनुरोध। जेसनपी अनुरोध आपको क्रॉस डोमेन अनुरोध करने में सक्षम बनाता है। Here एक उदाहरण है।

+0

'JSONP' केवल 'GET' अनुरोधों के लिए काम करेगा। –

7

मुझे एहसास है कि यह सवाल पुराना है, लेकिन मुझे लगा कि मैं इसे किसी भी तरह फेंक दूंगा। सीओआरएस अनुरोधों के मामले में, ब्राउज़र उन्हें preflights। इसका क्या अर्थ है - $.ajax() विधि जो भी आप उपयोग कर रहे हैं, उसके बावजूद, OPTIONS अनुरोध सर्वर पर भेजा गया है।

यह क्या preflighted OPTIONS अनुरोध वास्तव में क्या कर रहा है कह रहा है:

"अरे वहाँ, विदेशी सर्वर-से-कुछ-अन्य-डोमेन है, मैं तुम्हें एक नहीं सरल अनुरोध (सरल अनुरोध के भेजना चाहते हैं प्रीफलाइट नहीं किया गया है)। मेरे सरल-सरल अनुरोध के लिए इन प्रकार के शीर्षलेख और सामग्री प्रकार होने जा रहे हैं। क्या आप मुझे बता सकते हैं कि यह ठीक है? "

तब सर्वर जो कुछ भी करता है (शायद कुछ कॉन्फ़िगरेशन या डेटाबेस की जांच करेगा) और स्वीकार्य उत्पत्ति, स्वीकार्य शीर्षलेख, और/या स्वीकार्य विधि (ओं) के साथ प्रतिक्रिया करेगा।

अंत में - यदि वह प्रीफलाइट OPTIONS अनुरोध प्राप्त हुआ है तो वास्तविक $.ajax() विधि जाने की अनुमति देता है - यह जाता है।

सीओआरएस जेएसओएनपी के समान नहीं है।

सब कहा - जब withCredentials preflight सफलता प्रतिक्रिया (के रूप में सवाल में कहा गया है) एक Access-Control-Allow-Credentials हैडर ले जाने के लिए की आवश्यकता है, कि Access-Control-Allow-Origins और Access-Control-Allow-Methods मूल्यों, जो इरादा अनुरोध के पहलुओं को शामिल करना चाहिए के अतिरिक्त है।

उदाहरण के लिए - यदि आप somevaluehttp://bar-domain.com को हेडर के साथ मूल http://foo-domain.com से एक CORS POST अनुरोध कर रहे हैं, एक preflight OPTIONS अनुरोध बाहर जाकर वास्तविक पोस्ट अनुरोध के क्रम में होगा http://bar-domain.com को किए जाने के लिए, OPTIONS अनुरोध की आवश्यकता होगी Access-Control-Allow-Origins मान के साथ प्रतिक्रिया प्राप्त करने के लिए जिसमें http://foo-domain.com शामिल था। यह मूल नाम या * हो सकता है। प्रतिक्रिया में Access-Control-Allow-Methods मान भी होना चाहिए जिसमें POST शामिल था। यह * भी हो सकता है। और अंत में यदि हम चाहते हैं कि हमारे somevalue हेडर को अनुमति दी जाए, तो प्रतिक्रिया में Access-Control-Allow-Headers मान होना चाहिए जिसमें हमारी somevalue हेडर कुंजी या * शामिल हो।

वापस सर्कल करने के लिए - यदि आप सर्वर को नियंत्रित नहीं कर सकते हैं, या आपके सीओआरएस अनुरोधों को अनुमति देने के लिए सर्वर को अनुमति देने का कोई तरीका नहीं है, तो आप हमेशा JSONP या कुछ urlEncoded डेटाटाइप का उपयोग कर सकते हैं और/या कस्टम शीर्षलेख के बिना सरल अनुरोध कर सकते हैं। GET, HEAD, और पूर्ण POST अनुरोध आमतौर पर सरल अनुरोध होते हैं।

+2

साइड नोट: किसी क्रेडेंशियल अनुरोध का जवाब देते समय, सर्वर को एक डोमेन निर्दिष्ट करना होगा, और जंगली कार्डिंग ('*') का उपयोग नहीं कर सकता। –

1

मेरे सुझाव सर्वर साइड पर null को ACCESS-CONTROL-ALLOW-ORIGIN सेट

हाँ, यह सवाल एक छोटा सा के लिए मुझे परेशान कर रहा है।

CORS spec करने के बारे में

, null स्थिति है जहाँ एक file:// योजना

और वह कल्पना पर एक व्यावहारिक सिफारिश से एक CORS अनुरोध origin-list-or-null के रूप में सेट करने के लिए है, जो या तो अंतरिक्ष से अलग की गई मूल या की एक सूची है पूरा कर सकता है बस "अशक्त" (वैसे, origin-list-or-null के लिए परिभाषा से स्ट्रिंग %x6E %x75 %x6C %x6C सचमुच null hex- इनकोडिंग है)

अंत में आप, पूछना होगा अभ्यस्त कि * के बराबर अगर हमको ACCESS-CONTROL-ALLOW-ORIGIN सेटयोजना file:// से प्रत्येक अनुरोध वैध है (जिसका अर्थ यह है कि यदि आपका यूरी के बारे में पता है तो हर हाइब्रिड ऐप आपके एंडपॉइंट तक पहुंच सकता है)?

ठीक है, Access-Control-Allow-Credentials: true दिया गया, मुझे विश्वास है कि आपके पास सर्वर पर काम कर रहे संपूर्ण लेख तंत्र हैं। यह सही प्रमाणन

आशा है कि यह मदद मिलेगी