प्रमाणीकरण और सत्र प्रबंधन के लिए एसपीए सर्वोत्तम अभ्यास


307

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

  1. यह मानते हैं कि एपीआई और यूआई का मूल डोमेन एक ही है, नियमित वेब अनुप्रयोग के साथ प्रमाणीकरण से अलग नहीं है।

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

  2. एक सार्वजनिक एपीआई का उपयोग करके किसी भी तीसरे पक्ष के ग्राहक की तरह व्यवहार करें और OAuth के समान किसी प्रकार के टोकन सिस्टम के साथ प्रमाणित करें। यह टोकन तंत्र क्लाइंट यूआई द्वारा सर्वर एपीआई में किए गए प्रत्येक अनुरोध को प्रमाणित करने के लिए उपयोग किया जाएगा।

मैं वास्तव में यहाँ बहुत अधिक विशेषज्ञ नहीं हूँ, लेकिन # 1 अधिकांश मामलों के लिए पूरी तरह से पर्याप्त है, लेकिन मैं वास्तव में कुछ अनुभवी राय सुनना चाहूंगा।


मैं इस तरह से
चक्कर लगाता हूँ

जवाबों:


476

इस प्रश्न को, कुछ अलग रूप में, लंबाई में, यहाँ संबोधित किया गया है:

रेस्टफुल ऑथेंटिकेशन

लेकिन यह इसे सर्वर-साइड से संबोधित करता है। इसे क्लाइंट-साइड से देखते हैं। हालांकि, इससे पहले कि हम एक महत्वपूर्ण प्रस्तावना करें:

जावास्क्रिप्ट क्रिप्टो होपलेस है

इस पर माटसानो का लेख प्रसिद्ध है, लेकिन इसमें निहित पाठ काफी महत्वपूर्ण हैं:

https://www.nccgroup.trust/us/about-us/newsroom-and-events/blog/2011/august/javascript-cryptography-considered-harmful/

संक्षेप में:

  • एक आदमी के बीच में हमला तुच्छ रूप से आपके क्रिप्टो कोड को बदल सकता है <script> function hash_algorithm(password){ lol_nope_send_it_to_me_instead(password); }</script>
  • एक मानव-में-मध्य हमला एक ऐसे पृष्ठ के खिलाफ तुच्छ है जो गैर-एसएसएल कनेक्शन पर किसी भी संसाधन का काम करता है।
  • एक बार जब आपके पास एसएसएल होता है, तो आप वास्तविक क्रिप्टोकरंसी का उपयोग कर रहे हैं।

और मेरी खुद की एक कोरोलरी जोड़ने के लिए:

  • एक सफल XSS हमले का परिणाम आपके क्लाइंट के ब्राउज़र पर कोड को निष्पादित करने में परिणाम हो सकता है, भले ही आप एसएसएल का उपयोग कर रहे हों - इसलिए भले ही आपने हर हैच को नीचे गिरा दिया हो, आपका ब्राउज़र क्रिप्टो अभी भी विफल हो सकता है यदि आपके हमलावर को निष्पादित करने का एक तरीका मिल जाए। किसी और के ब्राउज़र पर कोई जावास्क्रिप्ट कोड।

यदि आप एक जावास्क्रिप्ट क्लाइंट का उपयोग करने का इरादा कर रहे हैं, तो यह असंभव या मूर्खतापूर्ण कई विश्वसनीय योजनाओं को प्रस्तुत करता है। चलो देखते हैं!

HTTP मूल प्रामाणिक

सबसे पहले और सबसे महत्वपूर्ण, HTTP बेसिक प्रामाणिक। योजनाओं का सबसे सरल: बस हर अनुरोध के साथ एक नाम और पासवर्ड पास करें।

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

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

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

समस्या ? आप क्लाइंट-साइड पर एक उपयोगकर्ता नाम और पासवर्ड को कैशिंग कर रहे हैं। यह बुराई को इस पर एक बेहतर दरार देता है - यहां तक ​​कि एक्सएसएस कमजोरियों का सबसे बुनियादी परिणाम क्लाइंट को अपने उपयोगकर्ता नाम और पासवर्ड को एक बुराई सर्वर पर बीम करने में हो सकता है। आप हैशिंग और पासवर्ड को सलाम करके इस जोखिम को कम करने की कोशिश कर सकते हैं, लेकिन याद रखें: जावास्क्रिप्ट क्रिप्टो होपलेस है । आप इस जोखिम को ब्राउज़र की मूल प्रामाणिक सहायता तक छोड़ सकते हैं, लेकिन .. बदसूरत पाप के रूप में, जैसा कि पहले उल्लेख किया गया है।

HTTP डाइजेस्ट प्रामाणिक

क्या jQuery के साथ डाइजेस्ट प्रमाणीकरण संभव है?

एक अधिक "सुरक्षित" स्थिति, यह एक अनुरोध / प्रतिक्रिया हैश चुनौती है। सिवाय जावास्क्रिप्ट क्रिप्टो के होपलेस है , इसलिए यह केवल एसएसएल पर काम करता है और आपको अभी भी क्लाइंट साइड पर उपयोगकर्ता नाम और पासवर्ड को कैश करना होगा, जिससे यह एचटीटीपी बेसिक ऑथेंट की तुलना में अधिक जटिल हो जाएगा लेकिन अधिक सुरक्षित नहीं है

अतिरिक्त हस्ताक्षर पैरामीटर्स के साथ क्वेरी प्रमाणीकरण।

एक और "सुरक्षित" स्थिति, जहां आप अपने पैरामीटर को नॉन और टाइमिंग डेटा (दोहराने और समय के हमलों से बचाने के लिए) के साथ एन्क्रिप्ट करते हैं और भेजते हैं। इसका एक सबसे अच्छा उदाहरण OAuth 1.0 प्रोटोकॉल है, जो है, जहां तक ​​मुझे पता है, एक REST सर्वर पर प्रमाणीकरण को लागू करने का एक सुंदर तरीका है।

http://tools.ietf.org/html/rfc5849

ओह, लेकिन जावास्क्रिप्ट के लिए कोई OAuth 1.0 ग्राहक नहीं हैं। क्यों?

जावास्क्रिप्ट क्रिप्टो होपलेस है , याद रखें। जावास्क्रिप्ट SSL के बिना OAuth 1.0 में भाग नहीं ले सकता है, और आपको अभी भी ग्राहक के उपयोगकर्ता नाम और पासवर्ड को स्थानीय रूप से संग्रहीत करना होगा - जो इसे उसी श्रेणी में रखता है जैसे कि डाइजेस्ट ऑथेंट - यह HTTP बेसिक ऑथेंट की तुलना में अधिक जटिल है लेकिन यह अधिक सुरक्षित नहीं है

टोकन

उपयोगकर्ता एक उपयोगकर्ता नाम और पासवर्ड भेजता है, और बदले में एक टोकन मिलता है जिसका उपयोग अनुरोधों को प्रमाणित करने के लिए किया जा सकता है।

यह HTTP बेसिक ऑथ की तुलना में थोड़ा अधिक सुरक्षित है, क्योंकि जैसे ही उपयोगकर्ता नाम / पासवर्ड लेनदेन पूरा होता है आप संवेदनशील डेटा को छोड़ सकते हैं। यह भी कम Restful है, क्योंकि टोकन "स्थिति" का गठन करते हैं और सर्वर कार्यान्वयन को अधिक जटिल बनाते हैं।

एसएसएल स्टिल

हालाँकि, यह है कि आपको अभी भी टोकन प्राप्त करने के लिए उस प्रारंभिक उपयोगकर्ता नाम और पासवर्ड को भेजना होगा। संवेदनशील जानकारी अभी भी आपके समझौता योग्य जावास्क्रिप्ट को छूती है।

अपने उपयोगकर्ता की साख बचाने के लिए, आपको अभी भी अपने जावास्क्रिप्ट से हमलावरों को बाहर रखने की आवश्यकता है, और आपको अभी भी तार पर एक उपयोगकर्ता नाम और पासवर्ड भेजने की आवश्यकता है। एसएसएल आवश्यक है।

टोकन एक्सपायरी

यह टोकन नीतियों को लागू करने के लिए आम है जैसे "हे, जब यह टोकन बहुत लंबा हो गया है, तो इसे छोड़ दें और उपयोगकर्ता को फिर से प्रमाणित करें।" या "मुझे पूरा यकीन है कि इस टोकन का उपयोग करने के लिए केवल आईपी पते की अनुमति है XXX.XXX.XXX.XXX"। इनमें से कई नीतियां बहुत अच्छे विचार हैं।

Firesheeping

हालाँकि, बिना SSL के एक टोकन का उपयोग करना अभी भी 'साइडजैकिंग' नामक हमले के लिए असुरक्षित है: http://codebutler.github.io/firesheep/

हमलावर को आपके उपयोगकर्ता की विश्वसनीयता नहीं मिलती है, लेकिन वे अभी भी आपके उपयोगकर्ता होने का दिखावा कर सकते हैं, जो बहुत बुरा हो सकता है।

tl; dr: वायर पर बिना लाइसेंस के टोकन भेजने का मतलब है कि हमलावर उन टोकन को आसानी से पकड़ सकते हैं और आपके उपयोगकर्ता होने का दिखावा कर सकते हैं। फायरशीप एक ऐसा कार्यक्रम है जो इसे बहुत आसान बनाता है।

एक अलग, अधिक सुरक्षित क्षेत्र

जितना बड़ा एप्लिकेशन आप चला रहे हैं, उतना ही कठिन यह सुनिश्चित करना है कि वे कुछ कोड को इंजेक्ट नहीं कर पाएंगे जो आपको संवेदनशील डेटा को संसाधित करने के तरीके में बदलाव करता है। क्या आपको अपने CDN पर पूरा भरोसा है? आपके विज्ञापनदाता? आपका अपना कोड आधार?

क्रेडिट कार्ड के विवरण के लिए सामान्य और उपयोगकर्ता नाम और पासवर्ड के लिए कम सामान्य - कुछ कार्यान्वयनकर्ता अपने शेष एप्लिकेशन से एक अलग पृष्ठ पर 'संवेदनशील डेटा प्रविष्टि' रखते हैं, एक ऐसा पृष्ठ जिसे यथासंभव नियंत्रित किया जा सकता है और यथासंभव लॉक किया जा सकता है, अधिमानतः एक के साथ उपयोगकर्ताओं को फ़िश करना मुश्किल है।

कुकी (बस का अर्थ है टोकन)

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

सत्र (अभी भी सिर्फ टोकन का मतलब है)

सेशन ऑथोर सिर्फ टोकन ऑथेंटिकेशन है, लेकिन कुछ अंतरों के साथ जो इसे थोड़ा अलग लगता है:

  • उपयोगकर्ता एक अनधिकृत टोकन के साथ शुरू करते हैं।
  • बैकएंड एक 'राज्य' ऑब्जेक्ट को बनाए रखता है जो एक उपयोगकर्ता टोकन से बंधा होता है।
  • एक कुकी में टोकन दिया गया है।
  • अनुप्रयोग वातावरण आपके विवरण को अलग करता है।

इसके अलावा, हालांकि, यह टोकन प्रामाणिक से अलग नहीं है, वास्तव में।

यह एक भयावह कार्यान्वयन से आगे भी भटकता है - राज्य वस्तुओं के साथ आप एक स्टेटफुल सर्वर पर सादे ol 'RPC के पथ से आगे और आगे जा रहे हैं।

OAuth 2.0

OAuth 2.0 की समस्या "सॉफ्टवेयर ए कैसे सॉफ्टवेयर बी को उपयोगकर्ता एक्स के डेटा के बिना उपयोगकर्ता बी के उपयोगकर्ता एक्स के लॉगिन क्रेडेंशियल्स तक पहुंच के बिना एक्सेस देता है।"

किसी उपयोगकर्ता के लिए टोकन प्राप्त करने के लिए कार्यान्वयन केवल एक मानक तरीका है, और फिर "हां, इस उपयोगकर्ता और इस टोकन मिलान" के लिए एक तृतीय पक्ष सेवा के लिए, और आप अभी से उनके कुछ डेटा प्राप्त कर सकते हैं।

मौलिक रूप से, हालांकि, OAuth 2.0 सिर्फ एक टोकन प्रोटोकॉल है। यह अन्य टोकन प्रोटोकॉल के समान गुण प्रदर्शित करता है - आपको अभी भी उन टोकन की सुरक्षा के लिए SSL की आवश्यकता है - यह सिर्फ उन टोकन को उत्पन्न करने के तरीके को बदलता है।

दो तरीके हैं जो OAuth 2.0 आपकी मदद कर सकते हैं:

  • दूसरों को प्रमाणीकरण / सूचना प्रदान करना
  • दूसरों से प्रमाणीकरण / सूचना प्राप्त करना

लेकिन जब यह नीचे आता है, तो आप बस ... टोकन का उपयोग कर रहे हैं।

अपने सवाल पर वापस

तो, जो प्रश्न आप पूछ रहे हैं, "क्या मुझे कुकी में अपना टोकन स्टोर करना चाहिए और क्या मेरे पर्यावरण के स्वचालित सत्र प्रबंधन को विवरणों का ध्यान रखना चाहिए, या क्या मुझे जावास्क्रिप्ट में अपना टोकन स्टोर करना चाहिए और उन विवरणों को स्वयं संभालना चाहिए?"

और जवाब है: जो कुछ भी आपको खुश करता है उसे करो

हालाँकि, स्वचालित सत्र प्रबंधन की बात यह है कि आपके लिए पर्दे के पीछे बहुत कुछ जादू है। अक्सर यह अपने आप को उन विवरणों के नियंत्रण में होने के लिए अच्छा है।

मैं 21 का हूं इसलिए एसएसएल हां है

अन्य उत्तर है: सब कुछ या ब्रिगेड के लिए https का उपयोग करें जो आपके उपयोगकर्ताओं के पासवर्ड और टोकन चुरा लेगा।


3
बहुत बढ़िया जवाब। मैं टोकन कोर सिस्टम और बेसिक कुकी ऑर्ट के बीच साम्य की सराहना करता हूं (जो अक्सर वेब फ्रेमवर्क में बनाया जाता है)। मैं जो चाह रहा था, वह उसी तरह है। मैं आपको विचार के लिए भी कई संभावित मुद्दों को कवर करने की सराहना करता हूं। चीयर्स!
क्रिस निकोला

11
मुझे पता है कि यह एक समय हो गया है, लेकिन मैं सोच रहा हूं कि क्या इसे JWT को शामिल करने के लिए विस्तारित किया जाना चाहिए? ऑरिजनल0.com
क्रिस निकोला

14
टोकन It's also less RESTful, as tokens constitute "state and make the server implementation more complicated." (1) REST सर्वर को स्टेटलेस होना चाहिए। एक टोकन संग्रहीत क्लाइंट-साइड सर्वर के लिए किसी भी सार्थक तरीके से राज्य का प्रतिनिधित्व नहीं करता है। (2) मार्जिन अधिक जटिल सर्वर-साइड कोड का RESTfulness से कोई लेना-देना नहीं है।
सूपडॉग

10
lol_nope_send_it_to_me_insteadमुझे इस फ़ंक्शन का नाम बहुत पसंद था: D
लियो

6
एक चीज जिसे आप नजरअंदाज करते हैं: httpOnly के रूप में चिह्नित होने पर कुकीज़ XSS सुरक्षित हैं, और सुरक्षित और samesite के साथ आगे बंद हो सकते हैं। और कुकी की हैंडलिंग लगभग === अधिक लड़ाई कठिन हो चुकी है। टोकन सुरक्षा को संभालने के लिए जेएस और स्थानीय भंडारण पर भरोसा करना एक मूर्ख खेल है।
Martijn Pieters

57

आप JWT (JSON वेब टोकन) और SSL / HTTPS का उपयोग करके प्रमाणीकरण प्रक्रिया में सुरक्षा बढ़ा सकते हैं ।

मूल प्रामाणिक / सत्र आईडी के माध्यम से चोरी की जा सकती है:

  • MITM हमला (मैन-इन-द-मिडिल) - बिना SSL / HTTPS के
  • उपयोगकर्ता के कंप्यूटर तक पहुंचने का एक घुसपैठिया
  • XSS

JWT का उपयोग करके आप उपयोगकर्ता के प्रमाणीकरण विवरणों को एन्क्रिप्ट कर रहे हैं और क्लाइंट में स्टोर कर रहे हैं, और इसे एपीआई के हर अनुरोध के साथ भेज रहे हैं, जहां सर्वर / एपीआई टोकन को मान्य करता है। इसे निजी कुंजी के बिना डिक्रिप्ट / रीड नहीं किया जा सकता है (जो सर्वर / एपीआई स्टोर गुप्त रूप से) अपडेट पढ़ें

नया (अधिक सुरक्षित) प्रवाह होगा:

लॉग इन करें

  • उपयोगकर्ता लॉग इन करता है और एपीआई (एसएसएल / एचटीटीपीएस से अधिक) के लिए लॉगिन क्रेडेंशियल भेजता है
  • एपीआई लॉगिन क्रेडेंशियल प्राप्त करता है
  • यदि मान्य है:
    • डेटाबेस में एक नया सत्र पंजीकृत करें अद्यतन पढ़ें
    • एक निजी कुंजी के साथ एक JWT में उपयोगकर्ता आईडी, सत्र आईडी, आईपी पते, टाइमस्टैम्प आदि को एन्क्रिप्ट करें।
  • एपीआई ग्राहक को जेडब्ल्यूटी टोकन वापस भेजता है (एसएसएल / एचटीटीपीएस पर)
  • क्लाइंट JWT टोकन प्राप्त करता है और लोकलस्टोरेज / कुकी में स्टोर करता है

एपीआई के लिए हर अनुरोध

  • उपयोगकर्ता HTTP शीर्ष लेख में संग्रहीत JWT टोकन के साथ एपीआई (एसएसएल / एचटीटीपीएस पर) एक HTTP अनुरोध भेजता है
  • एपीआई HTTP हेडर पढ़ता है और JWT टोकन को अपनी निजी कुंजी के साथ डिक्रिप्ट करता है
  • एपीआई JWT टोकन को सत्यापित करता है, JWT टोकन में से एक के साथ HTTP अनुरोध से आईपी पते से मेल खाता है और यदि सत्र समाप्त हो गया है तो जांच करता है
  • यदि मान्य है:
    • अनुरोधित सामग्री के साथ प्रतिक्रिया दें
  • यदि अमान्य है:
    • अपवाद फेंकें (403/401)
    • सिस्टम में फ्लैग घुसपैठ
    • उपयोगकर्ता को एक चेतावनी ईमेल भेजें।

अपडेट किया गया 30.07.15:

JWT पेलोड / दावे वास्तव में निजी कुंजी (गुप्त) के बिना पढ़ा जा सकता है और इसे स्थानीयस्टोरेज में संग्रहीत करना सुरक्षित नहीं है। मुझे इन झूठे बयानों के बारे में खेद है। हालाँकि वे एक JWE मानक (JSON वेब एन्क्रिप्शन) पर काम कर रहे हैं ।

मैंने JWT में दावों (userID, exp) को संग्रहीत करके इसे लागू किया है, इसे एक निजी कुंजी (गुप्त) के साथ साइन किया है जो एपीआई / बैकएंड केवल उसके बारे में जानता है और इसे क्लाइंट पर एक सुरक्षित HttpOnly कुकी के रूप में संग्रहीत करता है। इस तरह इसे XSS के माध्यम से नहीं पढ़ा जा सकता है और इसमें हेरफेर नहीं किया जा सकता है, अन्यथा JWT हस्ताक्षर सत्यापन को विफल करता है। सुरक्षित HttpOnly कुकी का उपयोग करके भी , आप सुनिश्चित कर रहे हैं कि कुकी को केवल HTTP अनुरोधों (स्क्रिप्ट तक पहुंच योग्य नहीं) और केवल सुरक्षित कनेक्शन (HTTPS) के माध्यम से भेजा गया है।

अपडेट किया गया 17.07.16:

JWTs प्रकृति द्वारा स्टेटलेस हैं। इसका मतलब है कि वे खुद को अमान्य / समाप्त करते हैं। टोकन के दावों में SessionID को जोड़कर आप इसे राज्यव्यापी बना रहे हैं, क्योंकि इसकी वैधता अब केवल हस्ताक्षर सत्यापन और समाप्ति तिथि पर निर्भर नहीं करती है, यह सर्वर पर सत्र की स्थिति पर भी निर्भर करती है। हालाँकि, उल्टा आप टोकन / सत्रों को आसानी से अमान्य कर सकते हैं, जिसे आप स्टेटलेस JWTs के साथ पहले नहीं कर सकते थे।


1
अंत में एक JWT अभी भी मुझे लगता है कि एक सुरक्षा दृष्टिकोण से 'सिर्फ एक टोकन' है। सर्वर अभी भी उपयोगकर्ता आईडी, आईपी पते, टाइमस्टैम्प आदि को एक अपारदर्शी सत्र टोकन के साथ जोड़ सकता है और यह JWT से अधिक या कम सुरक्षित नहीं होगा। हालांकि, JWT की स्टेटलेस प्रकृति कार्यान्वयन को आसान बनाती है।
जेम्स

1
@ JWT के पास महत्वपूर्ण विवरणों को ले जाने में सक्षम और सक्षम होने का लाभ है। यह विभिन्न एपीआई परिदृश्यों के लिए बहुत उपयोगी है, जैसे कि क्रॉस-डोमेन ऑर्टरी की आवश्यकता होती है। कुछ सत्र के लिए अच्छा नहीं होगा। यह एक परिभाषित (या कम से कम प्रगति पर) युक्ति है, जो कार्यान्वयन के लिए उपयोगी है। यह कहना किसी भी अन्य अच्छे टोकन कार्यान्वयन से बेहतर नहीं है, लेकिन यह अच्छी तरह से परिभाषित और सुविधाजनक है।
क्रिस निकोला

1
@ क्रिस मैं आपकी सभी बातों से सहमत हूँ। हालांकि, ऊपर दिए गए उत्तर में वर्णित प्रवाह स्वाभाविक रूप से अधिक सुरक्षित प्रवाह नहीं है जैसा कि JWT के उपयोग के कारण दावा किया गया है। इसके अलावा, जब तक आप JWT के साथ एक पहचानकर्ता और सर्वर पर स्टोर राज्य के साथ एक पहचानकर्ता को नहीं जोड़ते हैं, तब ऊपर वर्णित योजना में JWT रिवोकेबल नहीं है। अन्यथा आपको या तो उपयोगकर्ता नाम / पासवर्ड (खराब उपयोगकर्ता अनुभव) का अनुरोध करके नियमित रूप से एक नया JWT प्राप्त करने की आवश्यकता है या एक JWT को बहुत लंबे समय तक समाप्ति समय के साथ जारी करें (यदि टोकन चोरी हो जाता है)।
जेम्स

1
मेरा उत्तर 100% सही नहीं है, क्योंकि JWT को वास्तव में निजी कुंजी (गुप्त) के बिना डिक्रिप्ट / रीड किया जा सकता है और इसे लोकलस्टोरेज में स्टोर करना सुरक्षित नहीं है। मैंने JWT में दावों (userID, exp) को संग्रहीत करके इसे लागू किया है, इसे एक निजी कुंजी (गुप्त) के साथ साइन किया है जो एपीआई / बैकएंड केवल ग्राहक के बारे में जानता है और इसे HttpOnly कुकी के रूप में संग्रहीत करता है। इस तरह इसे XSS द्वारा नहीं पढ़ा जा सकता है। लेकिन आपको HTTPS का उपयोग करना होगा क्योंकि टोकन MITM हमले के साथ चोरी हो सकता है। मैं इस पर प्रतिबिंबित करने के लिए अपने उत्तर को अपडेट करूंगा।
गौई

1
@vsenko ग्राहक से प्रत्येक अनुरोध के साथ कुकी भेजी जाती है। आप जेएस से कुकी का उपयोग नहीं करते हैं, यह क्लाइंट से एपीआई के प्रत्येक HTTP अनुरोध के साथ जुड़ा हुआ है।
गौई

7

मैं दूसरी, टोकन प्रणाली के लिए जाऊंगा।

क्या आप एम्बर-ऑर्ट या एमबर-सिंपल-ऑर्ट के बारे में जानते हैं ? वे दोनों टोकन आधारित प्रणाली का उपयोग करते हैं, जैसे अंगारे-सरल-स्थिति वाले राज्य:

Ember.js अनुप्रयोगों में टोकन आधारित प्रमाणीकरण को लागू करने के लिए एक हल्के और विनीत पुस्तकालय। http://ember-simple-auth.simplabs.com

उनके पास सत्र प्रबंधन है, और मौजूदा परियोजनाओं में भी प्लग इन करना आसान है।

एम्बर-सिंपल-ओर्स का एक एम्बर ऐप किट उदाहरण संस्करण भी है: OAuth2 प्रमाणीकरण के लिए एम्बर-सिंपल-कॉर्सेट का उपयोग करके एम्बर-ऐप-किट का कार्य उदाहरण।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.