2014-09-17 10 views
5

के भीतर एकाधिक पासपोर्ट का उपयोग करना मान लीजिए मुझे एक एक्सप्रेस एप्लिकेशन के भीतर दो अलग-अलग पासपोर्ट की आवश्यकता है (जैसे उपयोगकर्ता & कमरा)। तो मैं दो अलग-अलग वार्स परिभाषित:पासपोर्टजेएस - एक्सप्रेस एप्लिकेशन

var passport = require('passport'); 
var roomPassport = require('passport'); 

तो, मैं उन्हें अलग पासपोर्ट रणनीतियों के साथ प्रारंभ:

// required for passport 
application.use(session({ secret: 'ilovepassport;-)' })); // session secret 
application.use(passport.initialize({ userProperty: "user" })); 
application.use(passport.session()); // persistent login sessions 
application.use(roomPassport.initialize({ userProperty: "room" })); 
application.use(roomPassport.session()); // persistent login sessions 
application.use(flash()); // use connect-flash for flash messages stored in session` 

:

require('./config/passport')(passport); // pass passport for configuration 
require('./config/roompassport')(roomPassport); // pass passport for configuration 

अंतिम चरण उन्हें एक्सप्रेस मिडलवेयर के रूप में स्थापित करने के लिए है हालांकि, अगर मैंने ऐसा किया, तो वास्तव में कमरापैसपोर्ट पासपोर्ट ओवरराइड करता है और दो ऑब्जेक्ट्स के बजाय - req.user और req.room, मुझे केवल एक req.room मिल गया है लेकिन इसके साथ शुरू किया गया है उपयोगकर्ता का आधार - सामग्री।

यह उल्लेख करना महत्वपूर्ण है कि प्रत्येक पासपोर्ट (उपयोगकर्ता या कमरा) एक-दूसरे से स्वतंत्र रूप से प्रमाणित हो सकता है, यानी एक परिदृश्य है जहां दोनों ऑब्जेक्ट req.user और req.room मौजूद हैं।

इसे कैसे हल करें?

संपादित करें 1

ठीक है, कुछ और घंटे के बाद, ऐसा लगता है, हालांकि मैं पासपोर्ट वस्तुओं को अलग करने, application.use(roomPassport.initialize({ userProperty: "room" })); की कॉल के बाद है, चीजों को गंदा मिलता है कि - और इस वजह req.login() विधि पिछले संलग्न पासपोर्ट के साथ काम करता है । तो सही passport.serializeUser विधि को कॉल करने के बजाय, यह roomPassport.serializeUser विधि को कॉल करता है।

मेरा अगला प्रश्न - सही विधि को कॉल करने के लिए req.login() कैसे बनाएं?

उत्तर

9

आपकी समस्या यह है कि पासपोर्ट मॉड्यूल एक तत्काल पासपोर्ट ऑब्जेक्ट निर्यात करता है जब आपको इसकी आवश्यकता होती है। और जब उस वस्तु को नोड द्वारा कैश किया जाता है जब आपको इसकी आवश्यकता होती है, तो आपको हर बार सटीक वस्तु मिलती है।

सौभाग्य से, पासपोर्ट मॉड्यूल आपको reference to the class देता है, जिसका अर्थ है कि आप यह कर सकते हैं।

var Passport = require('passport').Passport, 
    passport = new Passport(), 
    roomPassport = new Passport(); 

अब आपके पास दो पूरी तरह अलग पासपोर्ट ऑब्जेक्ट्स होनी चाहिए।

+0

धन्यवाद दोस्त, आपने मेरा दिन बचाया! यह मेरी समस्या हल करता है लेकिन पूरी तरह से नहीं। ऐसा लगता है कि मुझे अलग पासपोर्ट सत्र की आवश्यकता होगी, अन्यथा पासवर्ड ऑब्जेक्ट्स एक ही कुकी को ओवरराइड करते हैं। तो मेरा अगला सवाल यह है कि - दो अलग-अलग सत्र कैसे सेट करें (शायद उन्हें नाम दें)? –

+0

मैंने इसे यहां नए प्रश्न के रूप में रखा है http://stackoverflow.com/questions/25898629/passportjs-how-to-make-separate-passport- सत्र –

+0

अरे, मैंने आपकी सलाह का पालन किया और दो अलग-अलग पासपोर्ट कॉन्फ़िगरेशन फ़ाइलों को भी बनाया दो diff स्थानीय रणनीतियों को संभालें। हालांकि जब मैं मूल का उपयोग करके लॉगिन करने का प्रयास करता हूं तो यह "अज्ञात रणनीति स्थानीय-लॉगिन" कहने में त्रुटि उत्पन्न करता है। – codeinprogress

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