2009-12-02 18 views
30

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

उत्तर

30

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

तो सवाल यह दो भागों में विभाजित किया जा सकता,

  • कैसे मैं एपीआई के माध्यम से OpenID प्रमाणीकरण करते हैं
  • कैसे मैं अनुवर्ती अनुरोधों में "प्रमाणीकृत" राज्य बनाए रखते हैं

पहले भाग के लिए, ओपनआईडी प्रमाणीकरण में लगभग हमेशा इंटरैक्टिव कदम शामिल होते हैं। प्रमाणीकरण प्रक्रिया के दौरान सबसे अधिक संभावना एक कदम होगा जहां उपयोगकर्ता ओपनआईडी प्रदाता के वेब पेज में है, साइन इन कर रहा है और कुछ "मैं सहमत हूं" बटन दबा रहा हूं। इसलिए एपीआई इस पारदर्शी रूप से संभाल नहीं सकता है और नहीं (नहीं, "मुझे अपना ओपनआईडी प्रदाता और पासवर्ड बताएं और मैं बाकी कर दूंगा")। यह सबसे अच्छा है कि क्लाइंट को खोलने और निर्देशों का पालन करने के लिए HTTP लिंक को आगे और पीछे भेजना है।

"प्रमाणीकृत" को बनाए रखने के राज्य

बाकी एपीआई राज्यविहीन होना चाहिए, प्रत्येक अनुरोध सभी जानकारी, सही संभालने के लिए आवश्यक शामिल करना चाहिए? प्रत्येक अनुरोध के लिए ओपनआईडी प्रदाता के खिलाफ प्रमाणित करने का कोई अर्थ नहीं होगा, इसलिए कुछ सत्र का प्रकार निरंतर है। सत्र कुंजी (या "पहुँच टोकन" या उपयोगकर्ता नाम/पासवर्ड) संवाद स्थापित करने के लिए विकल्पों में से कुछ हैं:

  • HTTPS + मूल प्रमाणीकरण ("प्राधिकरण: बेसिक ..." प्रत्येक अनुरोध में हेडर)
  • हस्ताक्षर अनुरोध Amazon-style ("प्राधिकरण: एडब्ल्यूएस ..." प्रत्येक अनुरोध में हेडर)
  • OAuth: शामिल पहुंच टोकन प्राप्त, कि और प्रत्येक अनुरोध
  • कुकी कि सत्र कुंजी ("कुकी संग्रहीत करता है में अन्य पैरामीटर का एक समूह: ... "प्रत्येक अनुरोध में हेडर)
  • हस्ताक्षरित कुकी जो सत्र सूचना संग्रहीत करती है कुकी में टयन

अभी सिर्फ एक एपीआई उपभोक्ता है, इसलिए मैंने सबसे सरल चीज के लिए जाना चुना जो संभवतः काम कर सकता है - कुकीज़।वे Beaker की सहायता से, पिलोन में उपयोग करने के लिए अति-आसान हैं। वे फ्लैश ऐप में "बस काम करते हैं" - चूंकि यह ब्राउज़र के अंदर चलता है, ब्राउज़र में फ्लैश ऐप के अनुरोधों में प्रासंगिक कुकीज़ शामिल होगी - ऐप को इसके संबंध में बिल्कुल भी बदलने की आवश्यकता नहीं है। यहां एक स्टैक ओवरफ्लो प्रश्न है जो कुकीज़ का उपयोग करने की भी वकालत करता है: RESTful authentication for web applications

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

4

OAuth एपीआई उपयोग के लिए बेहतर फिट है। Python में उपयोग में OAuth का एक उदाहरण यहां दिया गया है: oauth-python-twitter। लीह कल्वर की python-oauth लाइब्रेरी पाइथन में ओएथ का वैचारिक कार्यान्वयन है, लेकिन python-oauth2 हाल ही में एक प्रतियोगी है जिसे कुछ चर्चा मिल रही है। प्रेरणा के लिए, django-piston को Django के लिए RESTful API बनाने के दौरान ऑथ करने के लिए OAuth का उपयोग करने के लिए समर्थन है, हालांकि दस्तावेज़ उस विशेष विषय के लिए उतना अच्छा नहीं है जितना मैं चाहता हूं।

+0

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

+1

उस स्थिति में, शायद http://pylonshq.com/pasties/by_tag/openid पर पेस्ट में से एक मदद करेगा। –

3

यदि आप एपीआई बनाते हैं, तो आप ओएथ प्रोटोकॉल की जांच कर सकते हैं। यह ओपनआईडी के लिए पूरक है।

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