पासपोर्ट


155

एक वेब इंटरफेस के माध्यम से एक RESTful एपीआई के माध्यम से पासपोर्ट (js) का उपयोग करके प्रमाणीकरण (स्थानीय और फेसबुक, उदाहरण के लिए) कैसे संभालता है?

विशिष्ट चिंताएं कॉलबैक से डेटा के गुजरने को एक विशिष्ट प्रतिक्रिया (JSON) बनाम एक विशिष्ट res.send ({डेटा: req.data}) का उपयोग करके, एक प्रारंभिक / लॉगिन समापन बिंदु सेट कर रही हैं, जो फेसबुक (लॉग इन) पर रीडायरेक्ट नहीं कर सकता है। AJAX के माध्यम से पहुँचा, क्योंकि यह JSON प्रतिक्रिया नहीं है - यह कॉलबैक के साथ फेसबुक पर पुनर्निर्देशित है)।

मैंने https://github.com/halrobertson/test-restify-passport-facebook पाया है , लेकिन मुझे इसे समझने में परेशानी हो रही है।

इसके अलावा, पासपोर्ट क्रेडेंशियल कैसे क्रेडेंशियल को संग्रहीत करता है? सर्वर (या यह सेवा है?) MongoDB द्वारा समर्थित है, और मुझे वहाँ संग्रहीत करने के लिए क्रेडेंशियल (लॉगिन और pw का नमकीन) की उम्मीद है, लेकिन मुझे नहीं पता कि पासपोर्ट.जेएस में इस प्रकार की क्षमता है या नहीं।


जब से तुम नोड के लिए नए हैं, आसान शुरू करने और बाहर की जाँच उदाहरण आवेदन के लिए passport-facebook। आपके द्वारा वह कार्य करने के बाद, अगला चरण यह समझना शुरू करना है कि पासपोर्ट कैसे काम करता है, और यह कैसे क्रेडेंशियल्स को संग्रहीत करता है। इसे फिर से शुरू करने के लिए हुक करना (आपके द्वारा उल्लेखित एक के अद्यतन संस्करण के लिए यहां देखें ) अंतिम चरणों में से एक होगा (या आप एक्सप्रेस में रीस्ट इंटरफ़ेस को लागू कर सकते हैं)।
रॉबर्टबेल्प

जवाबों:


312

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

चलिए @Keith उदाहरण सेटअप का उपयोग करते हैं, अतिरिक्त सुरक्षा के लिए थोड़ा संशोधित किया गया है:

  • वेब सर्वर https://example.comएक एकल पेज जावास्क्रिप्ट क्लाइंट ऐप परोसता है
  • https://example.com/apiसमृद्ध ग्राहक सेवा में समृद्ध ग्राहक ऐप सर्वर समर्थन प्रदान करता है
  • सर्वर नोड और पासपोर्ट में लागू।
  • सर्वर में एक "उपयोगकर्ता" तालिका के साथ एक डेटाबेस (किसी भी प्रकार) है।
  • उपयोगकर्ता नाम / पासवर्ड और फेसबुक कनेक्ट को प्रमाणीकरण विकल्प के रूप में पेश किया जाता है
  • रिच क्लाइंट अन्य अनुरोधों में बनाता है https://example.com/api
  • अन्य ग्राहक हो सकते हैं (उदाहरण के लिए फोन ऐप), जो वेब सेवा का उपयोग करते हैं, https://example.com/apiलेकिन वेब सर्वर के बारे में नहीं जानते हैं https://example.com

ध्यान दें कि मैं सुरक्षित HTTP का उपयोग कर रहा हूं। यह मेरी राय में किसी भी सेवा के लिए जरूरी है जो खुले में उपलब्ध है, क्योंकि पासवर्ड और प्राधिकरण टोकन जैसी संवेदनशील जानकारी क्लाइंट और सर्वर के बीच गुजर रही है।

उपयोगकर्ता नाम / पासवर्ड प्रमाणीकरण

आइए देखें कि पहले सादा पुराना प्रमाणीकरण कैसे काम करता है।

  • उपयोगकर्ता से जोड़ता है https://example.com
  • सर्वर एक समृद्ध जावास्क्रिप्ट एप्लिकेशन परोसता है जो शुरुआती पेज को प्रस्तुत करता है। किसी पृष्ठ में कोई लॉगिन फ़ॉर्म है।
  • उपयोगकर्ता द्वारा लॉग इन नहीं किए जाने के कारण इस एकल पृष्ठ एप्लिकेशन के कई अनुभाग डेटा से आबाद नहीं हुए हैं। इन सभी अनुभागों में एक "लॉगिन" ईवेंट पर एक ईवेंट श्रोता है। यह सब क्लाइंट साइड सामान है, सर्वर को इन घटनाओं का पता नहीं है।
  • उपयोगकर्ता अपने लॉगिन और पासवर्ड दर्ज करता है और सबमिट बटन दबाता है, जो क्लाइंट साइड चर में उपयोगकर्ता नाम और पासवर्ड रिकॉर्ड करने के लिए एक जावास्क्रिप्ट हैंडलर को ट्रिगर करता है। फिर यह हैंडलर "लॉगिन" ईवेंट चलाता है। फिर से, यह सभी क्लाइंट साइड एक्शन है, क्रेडेंशियल अभी तक सर्वर पर नहीं भेजे गए थे
  • "लॉगिन" ईवेंट के श्रोताओं को आमंत्रित किया जाता है। इनमें से प्रत्येक को अब https://example.com/apiपेज पर रेंडर करने के लिए उपयोगकर्ता विशिष्ट डेटा प्राप्त करने के लिए RESTful API पर एक या अधिक अनुरोध भेजने की आवश्यकता है । वेब सेवा को भेजे जाने वाले हर एक अनुरोध में संभवतः HTTP बेसिक प्रमाणीकरण के रूप में उपयोगकर्ता नाम और पासवर्ड शामिल होंगे , क्योंकि RESTful की जाने वाली सेवा को ग्राहक के अनुरोध को अगले अनुरोध तक बनाए रखने की अनुमति नहीं है। चूंकि वेब सेवा सुरक्षित एचटीटीपी पर है, इसलिए पासवर्ड ट्रांज़िट के दौरान सुरक्षित रूप से एन्क्रिप्ट किया जाता है।
  • वेब सेवा पर https://example.com/apiप्रत्येक व्यक्ति को प्रमाणीकरण सूचना के साथ व्यक्तिगत अनुरोधों का एक समूह प्राप्त होता है। प्रत्येक अनुरोध में उपयोगकर्ता नाम और पासवर्ड उपयोगकर्ता डेटाबेस के खिलाफ जांचा जाता है और यदि सही पाया गया अनुरोधित फ़ंक्शन निष्पादित होता है और ग्राहक को JSON प्रारूप में डेटा लौटाया जाता है। यदि उपयोगकर्ता नाम और पासवर्ड त्रुटि से मेल नहीं खाते हैं तो क्लाइंट को 401 HTTP त्रुटि कोड के रूप में भेजा जाता है।
  • हर अनुरोध के साथ उपयोगकर्ता नाम और पासवर्ड भेजने के लिए मजबूर करने के बजाय, आप अपनी Restful सेवा में "get_access_token" फ़ंक्शन कर सकते हैं जो उपयोगकर्ता नाम और पासवर्ड लेता है और एक टोकन के साथ प्रतिक्रिया करता है, जो कि किसी प्रकार का क्रिप्टोग्राफ़िक है। यह अद्वितीय है और इसकी समाप्ति है इससे जुड़ी तारीख ये टोकन प्रत्येक उपयोगकर्ता के साथ डेटाबेस में संग्रहीत किए जाते हैं। फिर क्लाइंट बाद के अनुरोधों में एक्सेस टोकन भेजता है। तब टोकन को उपयोगकर्ता नाम और पासवर्ड के बजाय डेटाबेस के खिलाफ मान्य किया जाएगा।
  • नॉन ब्राउज़र क्लाइंट एप्लिकेशन जैसे कि फ़ोन ऐप ऊपर की तरह ही होते हैं, वे उपयोगकर्ता से उसकी साख दर्ज करने के लिए कहते हैं, फिर वेब सेवा के लिए हर अनुरोध के साथ उन्हें (या उनसे उत्पन्न एक्सेस टोकन) भेजें।

इस उदाहरण से महत्वपूर्ण महत्वपूर्ण बात यह है कि रेस्टफुल वेब सेवाओं को हर अनुरोध के साथ प्रमाणीकरण की आवश्यकता होती है

इस परिदृश्य में सुरक्षा की एक अतिरिक्त परत उपयोगकर्ता प्रमाणीकरण के अलावा क्लाइंट एप्लिकेशन प्राधिकरण को जोड़ देगी। उदाहरण के लिए, यदि आपके पास वेब क्लाइंट, iOS और एंड्रॉइड ऐप हैं, तो आप वेब सेवा का उपयोग करके सर्वर को यह जान सकते हैं कि दिए गए अनुरोध के तीन में से कौन सा क्लाइंट है, भले ही वह प्रमाणित उपयोगकर्ता हो। यह आपकी वेब सेवा को कुछ कार्यों को विशिष्ट ग्राहकों तक सीमित करने में सक्षम कर सकता है। इसके लिए आप एपीआई कुंजी और रहस्यों का उपयोग कर सकते हैं, उस पर कुछ विचारों के लिए यह उत्तर देखें ।

फेसबुक प्रमाणीकरण

ऊपर दिए गए वर्कफ़्लो फेसबुक कनेक्ट के लिए काम नहीं करते हैं क्योंकि फ़ेसबुक के माध्यम से लॉगिन में एक तीसरी पार्टी, फ़ेसबुक है। लॉगिन प्रक्रिया के लिए उपयोगकर्ता को फेसबुक की वेबसाइट पर पुनः निर्देशित करना होगा जहां हमारे नियंत्रण के बाहर क्रेडेंशियल्स दर्ज किए गए हैं।

तो आइए देखें कि चीजें कैसे बदलती हैं:

  • उपयोगकर्ता से जोड़ता है https://example.com
  • सर्वर एक समृद्ध जावास्क्रिप्ट एप्लिकेशन परोसता है जो शुरुआती पेज को प्रस्तुत करता है। पृष्ठ में somehwere एक लॉगिन फ़ॉर्म है जिसमें "फेसबुक के साथ लॉगिन" बटन शामिल है।
  • उपयोगकर्ता "फेसबुक के साथ लॉगिन" बटन पर क्लिक करता है, जो सिर्फ एक लिंक है जो (उदाहरण के लिए) रीडायरेक्ट करता है https://example.com/auth/facebook
  • https://example.com/auth/facebookमार्ग passport.js द्वारा नियंत्रित किया जाता है (देखें प्रलेखन )
  • सभी उपयोगकर्ता देखते हैं कि पृष्ठ बदल जाता है और अब वे एक फेसबुक होस्ट किए गए पृष्ठ में हैं जहां उन्हें हमारे वेब एप्लिकेशन को लॉगिन और अधिकृत करने की आवश्यकता है। यह पूरी तरह से हमारे नियंत्रण से बाहर है।
  • उपयोगकर्ता फेसबुक में लॉग इन करता है और हमारे आवेदन को अनुमति देता है, इसलिए फेसबुक अब कॉलबैक URL पर वापस भेज देता है जिसे हमने पासपोर्ट.जेएस सेटअप में कॉन्फ़िगर किया था, जो प्रलेखन में उदाहरण के बाद हैhttps://example.com/auth/facebook/callback
  • https://example.com/auth/facebook/callbackमार्ग के लिए पासपोर्ट.जेएस हैंडलर उस कॉलबैक फ़ंक्शन का आह्वान करेगा जो फेसबुक का उपयोग टोकन प्राप्त करता है और उपयोगकर्ता के ईमेल पते सहित फेसबुक से कुछ उपयोगकर्ता जानकारी प्राप्त करता है।
  • ईमेल से हम अपने डेटाबेस में उपयोगकर्ता का पता लगा सकते हैं और इसके साथ फेसबुक एक्सेस टोकन स्टोर कर सकते हैं।
  • आखिरी चीज जो आप फेसबुक कॉलबैक में करते हैं, वह रिच क्लाइंट एप्लिकेशन पर वापस भेजना है, लेकिन इस बार हमें उपयोगकर्ता नाम और टोकन को क्लाइंट को पास करना होगा ताकि यह उनका उपयोग कर सके। यह कई तरीकों से किया जा सकता है। उदाहरण के लिए, जावास्क्रिप्ट चर को सर्वर-साइड टेम्प्लेट इंजन के माध्यम से पृष्ठ पर जोड़ा जा सकता है, या किसी कुकी को इस जानकारी के साथ वापस किया जा सकता है। (यूआरएल में इस डेटा को पारित करने के साथ सुरक्षा मुद्दों को इंगित करने के लिए @RyanKimber के लिए धन्यवाद, जैसा कि मैंने शुरू में सुझाव दिया था)।
  • तो अब हम सिंगल पेज ऐप को एक बार शुरू करते हैं, लेकिन क्लाइंट के पास यूज़रनेम और एक्सेस टोकन है।
  • क्लाइंट एप्लिकेशन "लॉगिन" इवेंट को तुरंत ट्रिगर कर सकता है और एप्लिकेशन के विभिन्न हिस्सों को वेब सेवा से आवश्यक जानकारी का अनुरोध करने देता है।
  • भेजे गए सभी अनुरोधों https://example.com/apiमें प्रमाणीकरण के लिए फेसबुक एक्सेस टोकन, या REST API में "get_access_token" फ़ंक्शन के माध्यम से फेसबुक के टोकन से उत्पन्न एप्लिकेशन के स्वयं के टोकन शामिल हो सकते हैं।
  • गैर-ब्राउज़र ऐप्स के लिए यहां कुछ अधिक कठिन है, क्योंकि OAuth को लॉग इन करने के लिए एक वेब ब्राउज़र की आवश्यकता होती है। फोन या डेस्कटॉप ऐप से लॉगिन करने के लिए आपको फेसबुक पर रीडायरेक्ट करने के लिए एक ब्राउज़र शुरू करना होगा, और इससे भी बदतर, आप। कुछ तंत्र के माध्यम से आवेदन के लिए फेसबुक एक्सेस टोकन वापस करने के लिए ब्राउज़र के लिए एक रास्ता चाहिए।

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

मुझे यह जानने में दिलचस्पी होगी कि क्या किसी के पास इससे निपटने का एक सरल तरीका है।


5
आपकी विस्तृत प्रतिक्रिया के लिए धन्यवाद। बस एक सवाल: आप ऐसा कहते हैं Every single request they send to the web service will include the username and password, और फिर भी आप कहते हैं you can have a "get_access_token" function in your RESTful service। यह कहना विरोधाभासी लगता है कि आरईएसटी को स्टेटलेस होना चाहिए, लेकिन एक्सेस टोकन सर्वर साइड को स्टोर करना ठीक है, क्योंकि एक्सेस टोकन को स्टोर करने का कार्य करने का मतलब है कि सर्वर अब स्टेटफुल है। मैं इस बारे में किसी भी स्पष्टीकरण या औचित्य की सराहना करूंगा। धन्यवाद! :)
ryanrhee

6
जब मैं स्टेटलेस आवश्यकता के बारे में सोचता हूं तो मैं एक ग्राहक के साथ एक विशेष सत्र के लिए राज्य के बारे में सोचता हूं। मुझे डेटाबेस में उपयोगकर्ता के साथ जुड़े डेटा, जैसे पासवर्ड या एक्सेस टोकन "राज्य", कम से कम "सत्र राज्य" नहीं है। आपके सर्वर को स्पष्ट रूप से यह जानना होगा कि उपयोगकर्ता कौन हैं और उनके पासवर्ड, लेकिन यह एप्लिकेशन डेटा है जो सत्र के साथ संबद्ध नहीं है। उस ने कहा, बहुत से लोग कथित रूप से रैस्टफुल सेवाओं में कुकीज़ का उपयोग करते हैं, इसलिए आप रीस्ट स्पेसिफिकेशन का पालन करना कितना सख्त चाहते हैं, वास्तव में प्रत्येक कार्यान्वयनकर्ता पर निर्भर है।
मिगेल

1
@Dexter: पारंपरिक लॉगिन मामले में एक उपयोगकर्ता एक रूप में उपयोगकर्ता नाम और पासवर्ड दर्ज करता है और जब वह सबमिट बटन हिट करता है तो यह जानकारी एक वेब सर्वर पर पोस्ट की जाती है। इस स्थिति में ऐसा नहीं होता है, उपयोगकर्ता फॉर्म भरता है और जब वह हिट करता है तो एक जावास्क्रिप्ट हैंडलर सबमिट करें (सबमिट बटन में एक ऑनक्लिक घटना) डेटा को कैप्चर करता है और क्लाइंट संदर्भ में रखता है। मेरे पास दिखाने के लिए तैयार एक उदाहरण नहीं है, लेकिन अपने ब्लॉग पर इस ट्यूटोरियल के दूसरे भाग के लिए देखें जहाँ मैं दिखाता हूँ कि यह कैसे किया जाता है: blog.miguelgrinberg.com/post/…
Miguel

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

1
@ नथन: https पर मूल स्थिति सुरक्षित है, इसलिए हाँ, यह एक स्वीकार्य तंत्र है।
मिगेल

11

मैं प्रत्येक मामले में पूर्ण प्रवाह के साथ @ मिगुएल के स्पष्टीकरण की बहुत सराहना करता हूं, लेकिन मैं फेसबुक प्रमाणीकरण हिस्से पर कुछ जोड़ना चाहूंगा।

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

इसके अलावा, आप मोबाइल एप्लिकेशनों के लिए भी समान API एंड-पॉइंट का उपयोग कर सकते हैं। फेसबुक के लिए बस एंड्रॉइड / आईओएस एसडीके का उपयोग करें, क्लाइंट के अंत में फेसबुक एक्सेस_टोकन प्राप्त करें और इसे सर्वर से पास करें।

स्टेटलेस प्रकृति के बारे में , के रूप में समझाया जब get_access_token एक टोकन और ग्राहक के लिए पारित उत्पन्न करने के लिए प्रयोग किया जाता है, इस टोकन भी सर्वर पर संग्रहीत किया जाता है। इसलिए यह एक सत्र टोकन के रूप में अच्छा है और मेरा मानना ​​है कि यह इसे स्टेटफुल बनाता है।

बस मेरे 2 सेंट ।।


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

यदि आप फेसबुक के खिलाफ कार्रवाई करने के लिए उपयोगकर्ता को प्रमाणित करना चाहते हैं, लेकिन जब तक आप अपने सर्वर / डेटाबेस के खिलाफ उपयोगकर्ता को मान्य नहीं कर सकते हैं, तब तक जावास्क्रिप्ट एपि महान है।
जेम्स वेस्टगेट

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

फेसबुक जावास्क्रिप्ट एसडीके वर्तमान में क्रोम आईओएस के साथ काम नहीं करता है। शायद कुछ के लिए एक मुद्दा।
डेविक्स

@RyanKimber आप एक छोटा सा git रेपो या इसके जैसा लिख ​​सकते हैं जहाँ यह एक उदाहरण के रूप में पूरी तरह से अटक जाता है
शमौन Dragsb Simonk

3

यहाँ एक भयानक लेख है जो मैंने पाया है कि आप इसके साथ प्रमाणित करने में मदद कर सकते हैं:

  • फेसबुक
  • ट्विटर
  • गूगल
  • स्थानीय प्रामाणिक

आसान नोड प्रमाणीकरण: सेटअप और स्थानीय


आपके लिंक पर एक लेख नहीं है, बल्कि 'जावास्क्रिप्ट' के साथ टैग किए गए लेखों की एक सूची है
पाउलो ओलिवेरा

1
धन्यवाद। लिंक अपडेट किया गया। उन्होंने इसे बदल दिया था।
मूसुफ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.