2013-04-27 12 views
11

के साथ हर अनुरोध को टोकन एक्सेस चेक करें मैं वर्तमान में अपने रीस्टफुल एपीआई के लिए ओएथ 2.0 आर्किटेक्चर को कार्यान्वित कर रहा हूं।रेडिस

प्रत्येक अनुरोध के साथ मैंने अपने सभी ग्राहकों के लिए प्राधिकृत अनुरोध करने के लिए HTTP शीर्षलेख में एक प्राधिकरण बेयरर टोकन स्थापित किया है।

Authorization: Bearer sdflksd3r4823vkn95-03850432 

मैं समझता हूं कि समाप्ति तिथि तक एपीआई में टोकन को स्वीकार करना आम बात है। लेकिन कहें कि क्या उपयोगकर्ता टोकन को रद्द करना चाहता है, तो मुझे प्रत्येक अनुरोध के साथ टोकन की स्थिति की जांच करने की विधि को नियोजित करने की आवश्यकता होगी।

तो मैं प्रत्येक HTTP अनुरोध की जांच के लिए डीबी पर जाने की सोच रहा था। मुझे एहसास है कि प्रदर्शन कारणों से यह अच्छी तरह से स्केल नहीं करेगा।

तो मैं सोच रहा था कि जैसे समाधान Redis पहुंच टोकन स्थिति के बहुत तेज एकल पढ़ने के लिए उपयुक्त होगा?

उत्तर

9

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

यदि आपके पास निरस्त टोकन की ब्लैकलिस्ट होने जा रही है तो रेडिस की तरह कुछ शायद ठीक होगा (हालांकि प्रत्येक टोकन सत्यापन के लिए रिमोट कॉल करने से अभी भी धीमा)। अपने Redis इंस्टेंस और आपके एपीआई सर्वर के बीच कम विलंबता के साथ, ठीक से सेटअप करें, आपको प्रति अनुरोध < 10ms देखना होगा।

बोनस: चीजों को गति देने के लिए एक और विकल्प अस्वीकार API अनुरोधों के कैशिंग को संभालने के लिए Bloom filter का उपयोग करना होगा। इस तरह आप केवल रेडिस पर जाते हैं यदि ब्लूम फ़िल्टर अनुरोध टोकन को संभवतः निरस्त कर देता है। ध्यान दें कि चूंकि यह कैशिंग की एक और परत है, इसलिए टोकन को अस्वीकार करते समय आपको ब्लूम फ़िल्टर की स्थिति अपडेट करनी होगी।

+0

में मदद करता है मैं निश्चित रूप से एक ब्लूम फ़िल्टर पर विचार कर रहा था। हालांकि मैं यह भी सोच रहा था कि क्या यह सिंगलटन कैश का उपयोग कर एक व्यवहार्य विकल्प –

+1

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

+0

उत्कृष्ट जवाब। आपका बहुत बहुत धन्यवाद! –

2

मैं अपने लिए कुछ समान बना रहा हूं।
टोकन सिंटैक्स और एन्क्रिप्शन के लिए, मैं आपको JWT का उपयोग करने का सुझाव देता हूं, यह इसके लिए एक अच्छा मानक है।
एक जोड़ी टोकन/उपयोगकर्ता आईडी स्टोर करने के लिए रेडिस का उपयोग करना ठीक है, क्योंकि हम एक समाप्ति मूल्य निर्धारित कर सकते हैं।
इसके अलावा मैंने बीच में एक ब्लूम फ़िल्टर डाला, लेकिन मैंने इसे सीरोप सुझाव के विपरीत विपरीत तरीके से बनाया: मैं ब्लूम फ़िल्टर द्वारा लॉगिन में सभी टोकन संग्रहीत कर रहा हूं, इसलिए यदि टोकन मौजूद नहीं है तो यह निश्चित रूप से अमान्य है ; और शायद सही है लेकिन मुझे सुनिश्चित करने के लिए रेडिस पर एक जांच करना है; लेकिन अब मुझे एक समस्या है: अगर मैं अपना ऑथ सिस्टम स्केल करना चाहता हूं तो मुझे ऑथ सर्वर के बीच एक स्टेटस लोड बैलेंसर चाहिए। आईएमएचओ, ब्लैकलिस्ट बनाने के लिए ब्लूम फ़िल्टर का उपयोग करना सही नहीं है: अगर मैं ब्लूमलिस्ट में ब्लैकलिस्ट को निरस्त और गलत टोकन फ़िल्टर करता हूं, अगर आइटम ब्लैकलिस्ट नहीं किया गया है तो ब्लूम फ़िल्टर झूठा लौटाता है (और मुझे इसे रेडिस बैकएंड में देखना होगा औथ के लिए); अन्यथा यदि कोई तत्व मौजूद है (ब्लैकलिस्टेड) ​​मुझे यह सुनिश्चित करने के लिए रेडिस पर जांचना है क्योंकि ब्लूम फ़िल्टर सही प्रतिक्रिया झूठी सकारात्मक हो सकती है।

+0

मैं वास्तव में sessionStorage में संग्रहीत मेरी AngularJS साइट पर एक जेडब्ल्यूटी टोकन का उपयोग कर रहा हूं। ब्राउजर एप्लिकेशन बंद होने पर हर बार लॉगिन करना होगा। उपयोगकर्ता को एक और टोकन दोबारा जारी करने से पहले यह 30 मिनट की समाप्ति समय भी है। मैं बस इसके नोट बनाने के लिए रेडिस का उपयोग करता हूं, और यह मुझे टोकन को बहुत जल्दी खोजने की अनुमति देता है। –

6

मैंने जेडब्ल्यूटी द्वारा उत्पन्न निरंतर टोकन को संभालने के लिए कुछ समान लागू किया।

मैं एक समाप्ति के साथ निरस्त टोकन सेट करने के लिए रेडिस का उपयोग कर रहा हूं, इसलिए टोकन स्वचालित रूप से रेडिस से हटा दिए जाते हैं। और मेरे पास प्रदान किए गए टोकन को फिर से जांचने के लिए एक मिडलवेयर है। full post here देखें।उम्मीद है कि यह