2014-04-02 8 views
5

से पूछताछ नहीं करता है मैं अपने node.js ऐप में passport.js का उपयोग करने की कोशिश कर रहा हूं ताकि मोंगोडीबी के साथ उपयोगकर्ता को प्रमाणित किया जा सके। मैंने सफलता कभी नहीं मारा। "[email protected]", "password":पासपोर्ट-स्थानीय रिटर्न 400 त्रुटि, कभी भी डेटाबेस

पोस्ट में, मैं "ईमेल" भेजें "परीक्षण"

var passport = require('passport') 
    , LocalStrategy = require('passport-local').Strategy; 


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

passport.use(new LocalStrategy({ 
     emailField: 'email', 
     passwordField: 'passw', 
    }, 
function (emailField, passwordField, done) { 
    process.nextTick(function() { 
     db.collection(users, function (error, collection) { 
     if (!error) { 
      collection.findOne({ 
       'email': emailField, 
       'password': passwordField 
      }, function (err, user) { 
       if (err) { 
        return done(err); 
       } 
       if (!user) { 
        console.log('this email does not exist'); 
        return done(null, false); 
       } 
        return done(null, user); 
      }); 
     } else { 
      console.log(5, 'DB error'); 
     } 
     }); 
    }); 
})); 

MongoDB 'उन' संग्रह में:

{ 
    "_id": { 
     "$oid": "533b5283e4b09d8a1148b4c4" 
    }, 
    "email": "[email protected]", 
    "password": "test" 
} 

शायद मैं डेटाबेस से कनेक्ट नहीं कर रहा हूं, मुझे यकीन नहीं है।

इसके अलावा, जब मैं पूरे समारोह में लॉग इन करता हूं, तो मुझे कोई लॉग नहीं मिलता है। मुझे बस

POST /login 302 7ms - 39b 
GET /fail 404 3ms 

किसी भी सुझाव की सराहना की जाएगी। मुझे लगता है कि मुझे कुछ याद आ रहा है लेकिन मुझे यकीन नहीं है कि इसे कैसे व्यवस्थित किया जाए। इन का उपयोग कर

, passport = require('passport') 
    , LocalStrategy = require('passport-local').Strategy; 

:

var uristring = 
process.env.MONGOLAB_URI || 
process.env.MONGOHQ_URL || 
'mongodb://<myurlhere>'; 

mongo.connect(uristring, function (err, db) { 

यहाँ अद्यतन कोड

इन की आवश्यकता होती है: अन्य समारोह, जहां मैं डेटाबेस के लिए लिख रहा हूँ में मैं का उपयोग करना :

// all environments 
app.set('port', process.env.PORT || 3000); 
app.set('views', path.join(__dirname, 'views')); 
app.set('view engine', 'ejs'); 
app.use(express.favicon()); 
app.use(express.logger('dev')); 
app.use(express.json()); 
app.use(express.urlencoded()); 
app.use(express.methodOverride()); 
app.use(express.cookieParser()); 
app.use(express.session({ secret: 'keyboard cat'})); 
app.use(logfmt.requestLogger()); 
app.use(express.static(path.join(__dirname, 'public'))); 
app.use(passport.initialize()); 
app.use(passport.session()); 
app.use(app.router); 

// User authentication passport 

passport.use(new LocalStrategy(
    { 
     usernameField: 'email', 
     passwordField: 'passw', 
    }, 
    function (userId, password, done) { 
     // removed process.nextTick 
     console.log('Hey! no more 400 error!'); 
     db.collection(users, function (error, collection) { 
      if (!error) { 
       collection.findOne({ 
        'email': userId, 
        'password': password 
       }, function (err, user) { 
        if (err) { 
         return done(err); 
        } 
        if (!user) { 
         console.log('this email does not exist'); 
         return done(null, false); 
        } 
        return done(null, user); 
       }); 
      } else { 
       console.log(5, 'DB error'); 
      } 
     }); 
    } 
)); 

passport.serializeUser(function(user, done) { 
    done(null, user); 
}); 

passport.deserializeUser(function(user, done) { 
    done(null, user); 
}); 

app.post('/login', passport.authenticate('local'), function(req, res) { 
    console.log('SUCCESS WOOOO'); 
    // If this function gets called, authentication was successful. 
    // `req.user` contains the authenticated user. 
    //res.redirect('/users/' + req.user.username); 
    }); 

यह कोड हमेशा मुझे लॉग इन करते समय POST /login 400 10ms देता है। मेरे सभी अन्य मार्ग ठीक काम करते हैं।

+0

क्या आपका कोड एक फ़ाइल में है या मॉड्यूल में तोड़ दिया गया है? मैं पूछता हूं क्योंकि जिस क्रम में आप चीजें कॉल करते हैं, वह मामला हो सकता है। साथ ही, क्या आपने किसी विशेष कारण के लिए अपने कोड में 'process.nextTick' छोड़ा था? मेरा मानना ​​है कि यह एक डीबी कॉल की देरी 'नकली' उदाहरण कोड में है लेकिन वास्तव में इसकी आवश्यकता नहीं है। –

+0

नहीं, मैंने अभी इस ऐप को शुरू किया है और वर्तमान में यह फ़ंक्शन app.js. में है। मैं प्रमाणीकरण काम करने के बाद इस मॉड्यूलर को तोड़ने पर योजना बनाने की योजना बना रहा हूं। – Joel

+0

मैंने इतनी सारी चीजों की कोशिश की है। वर्तमान में मुझे 404 मिल रहा है। 'app.post ('/ login', passport.authenticate ('local'), फ़ंक्शन (req, res) {' 'console.log ('सफलता WOOOO');' '// यदि यह फ़ंक्शन कहलाता है, तो प्रमाणीकरण सफल रहा। ' // req.user में प्रमाणीकृत उपयोगकर्ता शामिल है। '//res.redirect('usus/ '+ req.user.username);' '});' – Joel

उत्तर

1

यह पोस्टमैन के साथ एक मुद्दा हो रहा है (जिसे मैंने बिना किसी समस्या के कई बार उपयोग किया है)।

एक बार जब मैंने एक वास्तविक HTML फॉर्म का उपयोग किया तो यह ठीक काम करता था। शायद एक हेडर चीज?

+0

मुझे पोस्टमैन के साथ समान समस्याएं आ रही हैं। यहां तक ​​कि इंटरसेप्टर एक्सटेंशन चालू होने पर भी सत्र दृढ़ता (कुकीज़ के माध्यम से) की कोई धारणा बनाए रखने की प्रतीत नहीं होती है। –

17

1) खतरनाक HTTP 400 त्रुटि

पासपोर्ट एक HTTP 400 त्रुटि जब उपयोगकर्ता नाम और/या पासवर्ड सेट नहीं कर रहे हैं फेंकता है।

लाइन 75 के आसपास स्रोत देखें जहां Strategy.prototype.authenticate'missing credentials' त्रुटि फेंकता है।

passport.use(new LocalStrategy({ 
     emailField: 'email', 
     passwordField: 'passw', 
    }, 

लेकिन emailField पासपोर्ट द्वारा मान्यता प्राप्त नहीं है:

2) कारण

अपने कोड में निदान, आप ब्लॉक की है। source code में वापस, हम देखते हैं कि पासपोर्ट की तलाश में है:

this._usernameField = options.usernameField || 'username'; 
this._passwordField = options.passwordField || 'password'; 

यही कारण है कि HTTP 400 इस विशिष्ट स्थिति में फेंक दिया जा रहा है।

4) समस्या

मैं मैं क्या विश्वास करते हैं (बेहतर) काम करेंगे मूल की तुलना में करने के लिए अपने मूल कोड संपादित किया है फिक्सिंग। process.nextTick को हटाने के लिए संपादन करते समय मैंने कुछ स्वतंत्रता ली और कुछ चीजों का नाम बदल दिया। मुझे उम्मीद है कि आप एक क्षमाशील व्यक्ति हैं।:)

passport.use(new LocalStrategy(
    { 
     usernameField: 'email', 
     passwordField: 'passw', 
    }, 
    function (userId, password, done) { 
     // removed process.nextTick 
     console.log('Hey! no more 400 error!'); 
     db.collection(users, function (error, collection) { 
      if (!error) { 
       collection.findOne({ 
        'email': userId, 
        'password': password 
       }, function (err, user) { 
        if (err) { 
         return done(err); 
        } 
        if (!user) { 
         console.log('this email does not exist'); 
         return done(null, false); 
        } 
        return done(null, user); 
       }); 
      } else { 
       console.log(5, 'DB error'); 
      } 
     }); 
    } 
)); 

5) कुछ समापन नोट:

  • तुम भी प्रपत्र इनपुट पासपोर्ट की उम्मीद चूक मैच के लिए जिम्मेदार बताते हैं संपादित कर सकते हैं। मार्गदर्शन के लिए passport documentation देखें।
  • मैं गारंटी नहीं दे सकता कि मोंगोडीबी कॉल काम करेगा, लेकिन यह आपको HTTP 400 से पहले प्राप्त कर लेगा। यदि डेटाबेस कॉल में समस्याएं हैं, तो यह लगभग निश्चित रूप से एक नया प्रश्न है क्योंकि कोड और मॉड्यूल का एक अलग सेट शामिल है।
  • पासपोर्ट का उपयोग करते समय, परियोजना गिटहब पेज पर जाने और स्रोत के माध्यम से पढ़ने के लायक है। स्रोत में अक्सर टिप्पणियां होती हैं कि (ए) अन्य दस्तावेज़ों में नहीं हैं या (बी) उनके द्वारा वर्णित कोड के करीब हैं ... इसलिए यदि आप कोडिंग गुरु या जो कुछ भी नहीं हैं, तो भी चीजें आपके लिए स्पष्ट की जाती हैं।
+0

मुझे अभी भी 400 मिल रहा है। अगर मैं 400 से अधिक प्राप्त कर सकता हूं, तो शायद मैं इसे समझ सकता हूं। मुझे अभी भी 400 के अलावा कोई भी लॉग नहीं मिल सकता है। मैंने अपने परिवर्तनों के साथ मूल पोस्ट को अपडेट किया है। 'पोस्ट/लॉगिन 400 10ms' – Joel

+0

मैं http: // localhost: 3000/लॉगिन पर पोस्ट कर रहा हूं। मेरे सभी अन्य मार्ग काम करते हैं। मैं ईमेल भेज रहा हूं और – Joel

+0

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

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