2013-03-29 15 views
55

मैंने देखा है कि this stack exchange के माध्यम से नोड में त्रुटि प्रबंधन को कैसे काम करना चाहिए, लेकिन मुझे यकीन नहीं है कि जब यह प्रमाणीकरण विफल हो जाता है तो पासपोर्ट क्या कर रहा है। मेरे पास निम्नलिखित लोकलस्ट्रेटी है:एक्सप्रेस पासपोर्ट (node.js) त्रुटि हैंडलिंग

passport.use(new LocalStrategy({ usernameField: 'email', passwordField: 'password' }, 
    function(email, password, next) { 

    User.find({email: UemOrUnm}, function(err, user){ 
     if (err) { console.log('Error > some err'); return next(err); } 
     if (!user) { console.log('Error > no user'); return next('Incorrect login or password'); } 

     if (password != user.password) { 
     return next(Incorrect login or password); 
     } 
     return next(null, user); 
    }); 
    } 
)); 

मुझे 'त्रुटि> कुछ गलती' कंसोल प्रिंटआउट देखने के बाद, और कुछ भी नहीं होता है। मुझे लगता है कि इसे एक त्रुटि पैरामीटर के साथ अगले पथ पर जारी रखना चाहिए, लेकिन ऐसा लगता है कि ऐसा नहीं लगता है। क्या चल रहा है?

उत्तर

135

रणनीति-क्रियान्वयन passport.authenticate के साथ संयोजन के लिए काम करता है, दोनों अनुरोधों को प्रमाणीकृत करने और सफलता/विफलता को संभालने के लिए काम करता है।

app.post('/login', passport.authenticate('local', { 
    successRedirect: '/loggedin', 
    failureRedirect: '/login', // see text 
    failureFlash: true // optional, see text as well 
}); 

यह जहां तीन शर्तों में से एक हो सकता है, रणनीति में कोड कॉल करेगा:

आप इस मार्ग (जो एक ई-मेल पता और पासवर्ड पारित हो जाता है) का उपयोग कर रहे कहते हैं:

  1. उपयोगकर्ताओं की जानकारी लाने के लिए एक आंतरिक त्रुटि आई (डेटाबेस कनेक्शन चला गया है); यह त्रुटि इस पर पारित की जाएगी: next(err); यह एक्सप्रेस द्वारा संभाला जाएगा और एक HTTP 500 प्रतिक्रिया उत्पन्न करेगा;
  2. प्रदान किए गए प्रमाण-पत्र अमान्य हैं (आपूर्ति किए गए ई-मेल पते के साथ कोई उपयोगकर्ता नहीं है, या पासवर्ड एक मेल नहीं है); उस स्थिति में, आप कोई त्रुटि उत्पन्न नहीं करते हैं, लेकिन आप उपयोगकर्ता ऑब्जेक्ट के रूप में false पास करते हैं: next(null, false); यह failureRedirect ट्रिगर करेगा (यदि आप एक को परिभाषित नहीं करते हैं, तो एक HTTP 401 अनधिकृत प्रतिक्रिया उत्पन्न की जाएगी);
  3. सबकुछ जांचता है, आपके पास वैध उपयोगकर्ता ऑब्जेक्ट है, इसलिए आप इसे पास करते हैं: next(null, user); यह successRedirect ट्रिगर करेगा;

गलत प्रमाणीकरण (लेकिन एक आंतरिक त्रुटि) के मामले में, आप कॉलबैक के साथ एक अतिरिक्त संदेश पारित कर सकते हैं:

next(null, false, { message : 'invalid e-mail address or password' }); 

आप का इस्तेमाल किया है, तो failureFlashऔर स्थापित the connect-flash middleware, आपूर्ति संदेश सत्र में संग्रहीत किया जाता है और इसे आसानी से एक्सेस किया जा सकता है, उदाहरण के लिए, टेम्पलेट में उपयोग किया जाना चाहिए।

संपादित करें: यह भी संभव है पूरी तरह से (एक रीडायरेक्ट या 401 भेजने के पासपोर्ट के बजाय) प्रमाणीकरण खुद प्रक्रिया का परिणाम को संभालने के लिए:

app.post('/login', function(req, res, next) { 
    passport.authenticate('local', function(err, user, info) { 
    if (err) { 
     return next(err); // will generate a 500 error 
    } 
    // Generate a JSON response reflecting authentication status 
    if (! user) { 
     return res.send({ success : false, message : 'authentication failed' }); 
    } 
    // *********************************************************************** 
    // "Note that when using a custom callback, it becomes the application's 
    // responsibility to establish a session (by calling req.login()) and send 
    // a response." 
    // Source: http://passportjs.org/docs 
    // *********************************************************************** 
    req.login(user, loginErr => { 
     if (loginErr) { 
     return next(loginErr); 
     } 
     return res.send({ success : true, message : 'authentication succeeded' }); 
    });  
    })(req, res, next); 
}); 
+2

धन्यवाद! मुझे लगता है कि मेरे मामले में, मैं रीडायरेक्ट करने की बजाय AJAX के माध्यम से एक असफल प्रतिक्रिया भेजने की कोशिश कर रहा हूं।पासपोर्ट दस्तावेज़ों को देखते हुए, मुझे लगता है कि इसका मतलब है कि मुझे इसके बजाय एक कस्टम फ़ंक्शन कॉलबैक के साथ अपना मार्ग प्रारूपित करना होगा। –

+3

यदि यह मदद करता है, तो मैंने अपने उत्तर को प्रमाणीकरण को संभालने का एक संभावित तरीका दिखाने के लिए संपादित किया :) – robertklep

+1

"हैंडलिंग प्रमाणीकरण स्वयं" संपादित करने के लिए धन्यवाद, यह एक जीवन-बचतकर्ता था! – wulftone

2

आप req.logIn(function (err) { }); जोड़ सकते हैं और सफलता क्या करने की जरूरत के अंदर अनुप्रेषित कॉलबैक फ़ंक्शन

+0

क्या आप अपना उत्तर स्पष्ट कर सकते हैं? – dgilperez

15

क्या ईसाई कह रहे थे तुम समारोह

req.login(user, function(err){ 
    if(err){ 
    return next(err); 
    } 
    return res.send({success:true}); 
}); 
जोड़ने की जरूरत थी

तो पूरे मार्ग होगा:

app.post('/login', function(req, res, next) { 
    passport.authenticate('local', function(err, user, info) { 
    if (err) { 
     return next(err); // will generate a 500 error 
    } 
    // Generate a JSON response reflecting authentication status 
    if (! user) { 
     return res.send(401,{ success : false, message : 'authentication failed' }); 
    } 
    req.login(user, function(err){ 
     if(err){ 
     return next(err); 
     } 
     return res.send({ success : true, message : 'authentication succeeded' });   
    }); 
    })(req, res, next); 
}); 

स्रोत: http://passportjs.org/guide/login/

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