2013-08-26 12 views
10

मेरे पास एक फ्लास्क ऐप है जो आरईएसटी एपीआई बैकएंड के रूप में कार्य करता है। मैं बैकएंड के लिए टोकन आधारित प्रमाणीकरण को कार्यान्वित करना चाहता हूं लेकिन ऐसा करने के लिए मुझे उपयोगकर्ता टोकन पुनर्प्राप्त करने की आवश्यकता है। फ्लास्क-सुरक्षा दस्तावेज स्पष्ट रूप से कहता है कि टोकन को पुनर्प्राप्त करने के लिए प्रमाणीकरण समापन बिंदु पर जेएसओएन डेटा के रूप में प्रमाणीकरण विवरण के साथ एक HTTP पोस्ट करने की आवश्यकता है। दुर्भाग्य से मुझे समझ में नहीं आता कि इस तरह के अनुरोध करने के लिए आवश्यक सीएसआरएफ टोकन को कैसे पुनर्प्राप्त किया जाए।फ्लास्क-सुरक्षा सीएसआरएफ टोकन

यदि मैं एक्सटेंशन के साथ प्रदान किए गए लॉगिन पेज/टेम्पलेट का उपयोग करता हूं तो सीएसआरएफ टोकन क्लाइंट को फॉर्म में छिपे हुए क्षेत्र में पास कर दिया जाता है। सवाल यह है:

मैं लॉगिन पृष्ठ तक पहुंचने और पार्स किए बिना सीएसआरएफ टोकन को कैसे प्राप्त करूं, उदाहरण के लिए $ http विधियों या मोबाइल ऐप का उपयोग करके एंजुलरजेएस ऐप से उदाहरण के लिए?

स्पष्ट रूप से मैं फ्लास्क-सुरक्षा का उपयोग करने से बच सकता हूं और खुद को टुकड़ों को कार्यान्वित कर सकता हूं लेकिन मैं अपेक्षाकृत वेबपैप्स के साथ अनुभवहीन हूं और मुझे लगता है कि मैं इस गलत तरीके से आ रहा हूं।

+0

आपने अंत में यह कैसे किया? – kyrre

+0

मैंने सुरक्षा परत को स्वयं लागू करना समाप्त कर दिया। क्षमा करें मेरे पास आपके लिए बेहतर जवाब नहीं है। – Jacopo

+0

ध्यान दें कि angularjs में टोकन को स्टोर करने का कोई सुरक्षित तरीका नहीं है, उदाहरण के लिए देखें [यहां] (https://stormpath.com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage/)। सुरक्षित विकल्प सर्वर को टोकन को केवल एकमात्र कुकी में स्टोर करने देना है + सीएसआरएफ सुरक्षा सक्षम करें। अगर आपको बात करने की ज़रूरत है तो कोणीय है, तो आप बस सत्र (+ एंटी-सीएसआरएफ) का उपयोग कर सकते हैं। – Adversus

उत्तर

2

मैंने परीक्षण नहीं किया है कि यह काम करता है, लेकिन source code का संक्षेप में निरीक्षण करने से ऐसा लगता है कि आपको सामग्री प्रकार के साथ application/json पर लॉगिन यूआरएल के लिए एक जीईटी अनुरोध भेजना होगा। फ्लास्क-सुरक्षा लॉगिन अनुरोध के JSON संस्करण के साथ इस अनुरोध का जवाब देती है और इसमें टोकन भी शामिल है। एक बार आपके पास टोकन हो जाने पर आप POST अनुरोध भेज सकते हैं।

+0

धन्यवाद आप सही सड़क पर डाल दिया। जीईटी अनुरोध करने के शीर्ष पर मुझे अनुरोध के साथ कुछ जेसन डेटा में पास करना होगा अन्यथा 'request.json' फ्लास्क में खाली है और '_render_json' विधि ट्रिगर नहीं है। दुर्भाग्यवश यद्यपि यह आपके द्वारा लिंक किए गए स्रोत की लाइन 45 पर एक त्रुटि का कारण बनता है क्योंकि फ़ॉर्म में कोई उपयोगकर्ता विशेषता नहीं है। लेकिन संक्षेप में कोड को देखते हुए मुझे लगता है कि उपयोगकर्ता विशेषता सत्यापन के दौरान सेट की जानी चाहिए लेकिन यह इस अनुरोध के लिए नहीं होती है। मुझे खुदाई रखना होगा। धन्यवाद फिर से – Jacopo

+0

ठीक है मैंने त्रुटि का पता लगाया। फ्लास्क-डब्ल्यूटीएफ की 'validate_on_submit' विधि पहले 'is_submitted' के लिए जांचें जो जीईटी अनुरोध के लिए गलत है। यह 'मान्य' विधि को कॉल करने और फॉर्म में 'उपयोगकर्ता' विशेषता को निर्दिष्ट करने से रोकता है। हालांकि 'वैध' विधि को कॉल करने से मैन्युअल रूप से 'सीएसआरएफ टोकन गायब' त्रुटि उत्पन्न होती है और हम शुरुआत में वापस आ जाते हैं। – Jacopo

4

मैं एक ऐसी ही उपयोग के मामले था और कुप्पी के WTF डॉक्स से इस उदाहरण का पालन करके इसे सुलझाने समाप्त हो गया: https://flask-wtf.readthedocs.org/en/latest/csrf.html#ajax

तो CSRF CsrfProtect(app) के माध्यम से एप्लिकेशन की रक्षा के द्वारा, csrf_token() सभी टेम्पलेट में उपलब्ध हो जाता है। तो फिर आप आसानी से इसे एक स्क्रिप्ट टैग माध्यम से उपलब्ध करा सकते हैं:

<script type="text/javascript"> 
    var csrftoken = "{{ csrf_token() }}" 
</script> 

अब कुप्पी के सुरक्षा/लॉगिन endpoint के लिए अपनी पोस्ट आंकड़ों के टोकन जोड़ें।

+2

उत्तर के लिए धन्यवाद लेकिन मैं अपने स्वयं के उपयोगकर्ता प्रबंधन समाधान को लागू करने के लिए समाप्त हो गया। यह भी तभी काम करता है जब आप फ्लास्क ऐप वाले पृष्ठों की सेवा करते हैं और आप टेम्पलेट को जिन्जा के साथ प्रस्तुत करते हैं। यदि आप केवल बैकएंड (आरईएसटी एपीआई) के लिए फ्लास्क ऐप का उपयोग करते हैं और फ्रंटेंड को अन्य तरीकों से परोसा जाता है तो आपको टोकन को पुनः प्राप्त करने और जेसन प्रतिक्रिया में इसे प्रस्तुत करने के लिए एक एपीआई एंडपॉइंट प्रदान करना होगा। मुझे यकीन नहीं है कि यह कैसे काम करेगा, मैं इसे शायद कोशिश करूँगा। – Jacopo

0

[एक एक जवाब के रूप लेखन के बाद से मैं टिप्पणी करने के लिए पर्याप्त प्रतिष्ठा नहीं है]

मैं जैकोपो के रूप में ठीक उसी समस्या में पड़ गए हैं, में है कि -) request.json खाली है और इस प्रकार get_auth_token (ट्रिगर नहीं है ।

Btw - Flask Security documentation का कहना है:

टोकन आधारित प्रमाणीकरण प्रमाणीकरण endpoint के खिलाफ JSON डेटा के रूप में प्रमाणीकरण के विवरण के साथ एक HTTP POST प्रदर्शन से उपयोगकर्ता प्रमाणीकरण टोकन पुन: प्राप्त करने से सक्षम है।

तो मैंने कोशिश की पोस्ट, नहीं (खाली request.json की फिर भी एक ही समस्या) मैं/प्रवेश के रूप में json डेटा के साथ कहा जाता है:

{"email": "[email protected]", "password": "test123"} 

और गूगल क्रोम में डाकिया ग्राहक का उपयोग कर एक अनुरोध भेजा ।

फिर भी, request.json खाली है :(

संपादित करें:। मैं अजगर के अनुरोध मॉड्यूल का उपयोग कर आगे बढ़ने के लिए सक्षम था विवरण here

+0

हाय मंदार, मुझे आशा है कि आपने इसे हल किया है, लेकिन मैंने अभी एक उत्तर पोस्ट किया है जो मदद कर सकता है: http://stackoverflow.com/a/27926284/992509 – SJoshi

+1

जो उत्तर आप अपने ब्लॉग पोस्ट में शुरूआत में दे रहे हैं (कैसे कार्यान्वित करें फ्लास्क-सुरक्षा पर जेसन लॉगिन का उपयोग करते समय csrf टोकन) संक्षेप में है: फ्लास्क-सुरक्षा के कॉन्फ़िगरेशन में csrf प्रमाणीकरण अक्षम करें। क्या यह करने के लिए बचा है? इस [लेख] के अनुसार (https://auth0.com/blog/2014/01/07/angularjs- प्रमाणीकरण-with-cookies-vs-token/) यह तब तक है जब तक आप कुकीज का उपयोग नहीं करते: " सीएसआरएफ: चूंकि आप कुकीज़ पर भरोसा नहीं कर रहे हैं, इसलिए आपको क्रॉस साइट अनुरोधों के खिलाफ सुरक्षा की आवश्यकता नहीं है ... "लेकिन क्या यह वास्तव में सीएसआरएफ टोकन का उपयोग करने के रूप में सहेजने जैसा है? – Sebastian

1

मैं कल रात घंटे के लिए इस समस्या के साथ संघर्ष किया।

मेरे एप्लिकेशन का उदाहरण बनाने के लिए::

app = Flask(__name__) 
app.config.from_object(config_by_name[config_name]) 

# Create database connection object 
app.db = db 
app.db.init_app(app) 

CsrfProtect(app) 

मेरी/लॉगिन HTML में:

<meta name="csrf-token" content="{{ csrf_token() }}"> 

डाकिया से:

enter image description here

यहाँ क्या मेरे लिए काम समाप्त हो गया है

यहां एक विकल्प था जिसकी मैंने कोशिश की, और शायद यह और अधिक सफल होगा? यह मूल रूप से एक ही जवाब है कि कुप्पी के सुरक्षा उदाहरण क्षुधा दे:

enter image description here

2

ठीक है, वहाँ एक आसान तरीका है। Visit। कॉन्फ़िगरेशन आइटम WTF_CSRF_ENABLED को csrf को अक्षम करने के लिए गलत पर सेट किया जा सकता है। फिर सब कुछ वैसे ही जाता है जैसा आप चाहते हैं।

+1

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

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