2014-05-07 6 views
5

मैं Passportjs के साथ प्रयोग कर रहा हूँ और एक कस्टम कॉलबैक के लिए कोड है:समझना Passportjs कस्टम कॉलबैक

app.get('/login', function(req, res, next) { 
    passport.authenticate('local', function(err, user, info) { 
    if (err) { return next(err); } 
    if (!user) { return res.redirect('/login'); } 
    req.logIn(user, function(err) { 
     if (err) { return next(err); } 
     return res.redirect('/users/' + user.username); 
    }); 
    })(req, res, next); 
}); 

मैं लाइन पिछले (req, res, next); से पीछे के अलावा इस कोड के सभी के साथ खुश हूँ - किसी को समझा सकते हैं अंत में इन पैरामीटर क्यों जोड़े गए हैं। पासपोर्ट प्रश्न की तुलना में यह शायद जेएस प्रश्न का अधिक है लेकिन किसी भी मदद की बहुत सराहना की जाती है।

+0

यह एक पासपोर्ट प्रश्न भी है। जाहिर है, 'passport.authenticate (...) 'एक समारोह वापस करता है। – Bergi

+1

ऐसा लगता है कि इसे 'app.get ('/login ', passport.authenticate (' local ', function (err, user, info) {...}) के रूप में लिखा जाने के लिए डिज़ाइन किया गया है); ' – Bergi

उत्तर

2

"जावास्क्रिप्ट" उत्तर यह है कि यह एक फ़ंक्शन देता है जिसे तर्क के उन दूसरे सेट के साथ फिर से बुलाया जाता है।

यह कार्य "श्रृंखला में प्रत्येक रणनीति से असफलताओं के लिए संचयक" है।

https://github.com/jaredhanson/passport/blob/master/lib/middleware/authenticate.js

2

आप गुमनाम समारोह के बिना यह पुनर्लेखन कर सकते हैं, या कस्टम कॉलबैक। नई रणनीति बनाने के लिए बस पासपोर्ट के passport.use(new LocalStrategy()) फ़ंक्शन का उपयोग करें। See 'Configure' docs

passport.use(new LocalStrategy(
    function(username, password, done) { 
    logIn({ username: username }, function (err, user) { 
     if (err) { return done(err); } 
     if (!user) { 
     return done(null, false, { message: 'Incorrect username.' }); 
     } 
     if (!user.validPassword(password)) { 
     return done(null, false, { message: 'Incorrect password.' }); 
     } 
     return done(null, user); 
    }); 
    } 
)); 

केवल परिवर्तन आप ले रहा है logIn समारोह इस फ़ाइल में होना करने की जरूरत है, और नहीं req के लिए एक विधि। तो बजाय कॉलबैक में res.redirect का उपयोग करने का

app.get('/login', passport.authenticate('local', { successRedirect: '/', 
                failureRedirect: '/login' })); 

, तो आप सिर्फ पासपोर्ट के दशक में successRedirect और failureRedirect गुण बनाया का उपयोग करें: तो फिर तुम बस passport.authenticate इसलिए की तरह कह सकते हैं। आप authentication page पर भी अपने दस्तावेज़ देख सकते हैं।

+0

यह आपके उदाहरण जैसा दिखता है गायब हैं (req, res, अगला)। आप res.redirect() को उनके बिना कैसे कॉल करते हैं? मुझे वास्तव में आपकी प्रतिक्रिया पसंद है क्योंकि मेरे पास एक सामान्य कॉलबैक है जिसका मैं उपयोग करना चाहता हूं। – Chris

+0

@Chris ने बेहतर काम करने के लिए उत्तर को अद्यतन किया। आपको शायद कॉलबैक का उपयोग नहीं करना चाहिए, बल्कि इसके बजाय सभी काम करने के लिए वास्तविक प्रमाणीकरण फ़ंक्शन का उपयोग करना चाहिए। क्या ये तुम्हारे लिए कारगर है? – Kostia

+0

समायोजन के लिए धन्यवाद, लेकिन वास्तव में वह था जिसे मैं दूर करने की कोशिश कर रहा था। :) मैं इसे एपीआई ऑथ के लिए उपयोग कर रहा हूं, और मैं रीडायरेक्ट नहीं करना चाहता हूं। मैं इसका उपयोग सही प्रतिक्रिया कोड के साथ अपनी एपीआई प्रतिक्रिया को अनुकूलित करने के लिए कर रहा हूं, और मेरी प्रतिक्रिया के साथ संदेश भी पास कर रहा हूं। – Chris

0

कनेक्ट/एक्सप्रेस मिडलवेयर समारोह हस्ताक्षर हैं:

function(req, res, next) 

passport.authenticate() जैसे, एक मध्यस्थ के रूप में इस्तेमाल किया जा सकता है:

app.post('/login', passport.authenticate('local'), nextMiddleware); 

इसका मतलब यह है authenticate() एक मिडलवेयर समारोह वस्तु, रिटर्न जो आप कर सकते हैं ऐप के अनुरोध-प्रतिक्रिया चक्र को जारी रखने के लिए (req, res, next) पैरामीटर के साथ उत्पन्न करें।

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