2014-07-18 4 views
5

मैं फ्लास्क का उपयोग करके एक एपीआई साइट बनाने की कोशिश कर रहा हूं, और मैं टोकन प्रमाणीकरण प्रदान करने के लिए Flask-jwt का उपयोग कर रहा हूं।
authorizaiton ठीक काम करता है अगर मैं अपाचे में CORS कर (mod_headers का उपयोग करने दें एक्सेस हेडर को जोड़ने के लिए, इसjwt auth wrapper लागू होने पर फ्लास्क-कॉर्स रैपर काम नहीं कर रहा है।

Header set Access-Control-Allow-Origin "*"

की तरह हालांकि, मैं बजाय सिर्फ वाइल्डकार्ड का उपयोग कर के बारे में अधिक विस्तृत अभिगम नियंत्रण करना चाहते हैं। और मैं flask-cors को देखा है, जो मूल की जाँच करें और शीर्ष लेख भेजने के लिए एक अच्छा आवरण है। और अब मेरी मार्ग इस तरह दिखता है (और अपाचे सेटिंग में कोई शीर्ष लेख हेरफेर)

@app.route('/protected/place') 
@cross_origin(headers=['Content-Type']) # Send Access-Control-Allow-Headers 
@jwt_required() 
def my_view_func(): 
    do something 

लेकिन अब मैं पहुंच नहीं मिलेगा यदि मैं जावास्क्रिप्ट से http अनुरोध करता हूं तो सर्वर से एस-कंट्रोल हेडर प्रतिक्रिया। (हालांकि, अगर मैं मैन्युअल रूप से पोस्ट करता हूं, कर्ल करने की तरह, मैं अभी भी क्रॉस मूल प्लगइन काम कर रहा हूं और एक्सेस कंट्रोल हेडर देख सकता हूं)

जब मैं @jwt_required रैपर को हटाता हूं, तो cross_origin wrapper ठीक काम करता है और यह मुझे प्रतिक्रिया देगा। जब jwt_required wrapper लागू होता है, सर्वर से कोई प्रतिक्रिया नहीं देखी जा सकती है।

मैं क्रोम के साथ अपने क्लाइंट पेज को डिबग कर रहा हूं। बीटीडब्ल्यू

मैंने रैपर के क्रम को बदलने की कोशिश की, लेकिन इससे मदद नहीं मिलती है।

क्या यह संभव है कि, यदि प्रमाणीकरण विफल हो जाता है, तो cross_origin wrapper एक्सेस कंट्रोल हेडर नहीं भेजेगा?

दो रैपर के सोर्स कोड:
कुप्पी के जेडब्ल्यूटी:
https://github.com/mattupstate/flask-jwt/blob/master/flask_jwt/init.py
कुप्पी के CORS:
https://github.com/wcdolphin/flask-cors/blob/master/flask_cors.py

+3

की तरह कई घंटों के लिए संघर्ष करने के बाद, मैं अंत में समस्या का पता चला। आशा है कि यह उन अन्य लोगों की सहायता करे जो एक ही समस्या को घेर लेते हैं। प्रमाणीकरण की आवश्यकता होने पर बस 'एक्सेस-कंट्रोल-स्वीकृति-हेडर' को "प्राधिकरण" जोड़ने की आवश्यकता है। इस '' @ app.route ('/ संरक्षित/स्थान') @cross_origin (हेडर = 'सामग्री-प्रकार', 'प्राधिकरण']) # संदेश पहुंच-नियंत्रण-अनुमति दें-हेडर @jwt_required() डीईएफ़ my_view_func(): कुछ '' ' –

+0

क्या आप जानते हैं'/प्रमाणन के लिए CORS जोड़ने के लिए तरीके से करना 'हैंडलर? –

+0

@YangHu पोस्टिंग के लिए धन्यवाद, बहुत मददगार, वास्तव में मुझे यह बदलने के लिए प्रेरित किया कि मैं सीओआरएस एक्सटेंशन का उपयोग कैसे कर रहा था। मैंने पाया कि आप वैश्विक स्तर को छोड़कर, वही काम कर सकते हैं (जैसा कि प्रत्येक दृश्य समारोह पर सजावटी का उपयोग करने के विपरीत) '' 'CORS (ऐप, उत्पत्ति =" http://127.0.0.1:8080 "के माध्यम से, allow_headers = [" सामग्री-प्रकार "," प्राधिकरण " , "एक्सेस-कंट्रोल-अनुमति-प्रमाण-पत्र"], support_credentials = True) '' '। @ निकोले फोमिनेह यदि एक्सटेंशन का उपयोग नहीं कर रहे हैं तो आप सजावटी को एक दृश्य पर ढेर कर सकते हैं: '' '@app।मार्ग ('someurl /') @cross_origin (यहां आपकी कॉन्फ़िगरेशन) @ auth.login_required def some_view(): ... '' ' – AdjunctProfessorFalcon

उत्तर

5

कई घंटों के लिए संघर्ष करने के बाद, मैं अंत में समस्या का पता चला। उम्मीद है कि यह उन लोगों की मदद करता है जो एक ही समस्या को घेरते हैं।
प्रमाणीकरण की आवश्यकता होने पर बस "हेडर" तर्क (Access-Control-Allow-Headers फ़ील्ड सेट करता है) में Authorization शामिल करने की आवश्यकता है।
इस
@app.route('/protected/place') @cross_origin(headers=['Content-Type','Authorization']) # Send Access-Control-Allow-Headers @jwt_required() def my_view_func(): do something

+0

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

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