2012-11-26 20 views
13

कृपया ध्यान दें मैं कि Node.js में कुल शुरुआत तो मैं Node.js + एक्सप्रेस 3 + पासपोर्ट उपयोग कर रहा हूँ मेरे साथ कृपया धैर्य रखें :)Node.js और पासपोर्ट वस्तु कोई विधि validPassword

है एक साधारण प्रमाणीकरण (स्थानीय) बस के चारों ओर खेलने के लिए

बनाने के लिए और मैं अब तक कि जब एक गलत नाम या पासवर्ड उपयोगकर्ता द्वारा दर्ज एक त्रुटि पृष्ठ

लेकिन रीडायरेक्ट हो गई है क्या पहुँच गए हैं जब उपयोगकर्ता एक सही में प्रवेश करती है उपयोगकर्ता नाम और पासवर्ड मुझे यह त्रुटि मिलती है

node_modules\mongoose\lib\utils.js:435 
    throw err; 
     ^
TypeError: Object { _id: 50b347decfd61ab9e9e6768f, 
username: 'saleh', 
password: '123456' } has no method 'validPassword' 

मुझे यकीन है कि क्या गलत वहाँ

app.js (मैं अनावश्यक कोड निकाला गया) है नहीं कर रहा हूँ:

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

    app.configure(function(){ 
    app.set('port', process.env.PORT || 3000); 
    app.set('views', __dirname + '/views'); 
    app.set('view engine', 'ejs'); 
    app.use(express.favicon()); 
    app.use(express.logger('dev')); 
    app.use(express.bodyParser()); 
    app.use(express.methodOverride()); 
    app.use(passport.initialize()); 
    app.use(passport.session()); 
    app.use(app.router); 
    app.use(express.static(path.join(__dirname, 'public'))); 
}); 



var mongoose = require('mongoose'); 
var db = mongoose.createConnection('localhost', 'authTest'); 

var authSchema = mongoose.Schema({ 
    username: 'string', 
    password: 'string' 
}); 

var User = db.model('users', authSchema); 


passport.use(new LocalStrategy(
    function(username, password, done) { 
    User.findOne({ 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); 
    }); 
    } 
)); 



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

passport.deserializeUser(function(id, done) { 
    User.findById(id, function(err, user) { 
    done(err, user); 
    }); 
}); 




app.post('/login', 
    passport.authenticate('local', { successRedirect: '/', 
            failureRedirect: '/login/error', 

            }) 
); 

और अब मार्गों में/login.js

var mongoose = require('mongoose'); 
var db = mongoose.createConnection('localhost', 'authTest'); 

var authSchema = mongoose.Schema({ 
    username: 'string', 
    password: 'string' 
}); 

var User = db.model('users', authSchema); 

exports.index = function(req, res){ 
User.find(function (err, list) { 
     res.render('login', { title: 'Usernames and Passwords', users: list,msg:""}); 
    }); 
}; 

आपके समय के लिए धन्यवाद।

उत्तर

11

अच्छा, यह स्पष्ट है, है ना? आप

if (!user.validPassword(password)) { 
    return done(null, false, { message: 'Incorrect password.' }); 
} 

उपयोग कर रहे हैं, लेकिन आप validPassword विधि परिभाषित नहीं किया है। अपने स्कीमा करने के लिए इसे संलग्न करें:

var authSchema = mongoose.Schema({ 
    username: 'string', 
    password: 'string' 
}); 
authSchema.methods.validPassword = function(pwd) { 
    // EXAMPLE CODE! 
    return (this.password === pwd); 
}; 

संपादित तुम भी गलत तरीके से स्कीमा परिभाषित किया है। यह होना चाहिए:

var authSchema = mongoose.Schema({ 
    username: String, 
    password: String 
}); 

ध्यान दें कि दोनों username और passwordString प्रकार की वस्तुओं, नहीं तार "string" होना चाहिए, यदि आप जानते हैं कि मैं क्या मतलब है। :)

+0

धन्यवाद :) यह अब काम करता है –

+0

यदि आप कर सकते हैं तो एक और सवाल .. क्या आप मुझे नोड.जेएस सीखने के लिए एक पुस्तक या कोई संसाधन सुझा सकते हैं? –

+1

@ मुहम्मदमालेह मुझे कोई नोड.जेएस पुस्तक नहीं पता। मैंने लगातार गुगल करके सबकुछ सीखा है। [Node.JS मुख्य पृष्ठ] पर ट्यूटोरियल के साथ शुरू करें (http://nodejs.org/)। और फिर बस गूगल। स्टैक ओवरफ्लो ज्ञान का एक बड़ा स्रोत भी है। इस तरह मैंने इसे सीखा है। – freakish

11

ऐसा लगता है कि passportjs वेबसाइट है, जहां जारेड यह कैसे लागू करने के लिए उल्लेख करने में विफल से उदाहरण की नकल की ..

पासपोर्ट js GitHub पृष्ठ पर वह एक और (सरल) उदाहरण है; वह validPassword विधि पूरी तरह (लाइन 18) हटाया:

Example

if (user.password != password) { return cb(null, false); } 

है यही कारण है कि मैं यह की चोटी पर (एन्क्रिप्शन का उपयोग) पर अपना एप्लिकेशन आधारित।

+0

धन्यवाद मुझे वास्तव में एक सरल उदाहरण की आवश्यकता है और मैंने बेहतर दस्तावेज बनाने के लिए जेरेड से भी संपर्क किया है :) –

4

इस पर एक नोब भी होने के कारण, मुझे यह पता लगाने के लिए एक पूरा दिन लगा। मैंने जेरेड के उदाहरण ऐप्स और यहां से लोगों से कुछ क्रिप्टो सलाह से इतिहास का उपयोग किया।

सबसे पहले मैंने एक विधि बनाई जो एक नमक उत्पन्न करता है (एक बड़ी यादृच्छिक संख्या जिसे स्ट्रिंग किया जाता है), हैश बनाने के लिए नमक और उपयोगकर्ता का पासवर्ड (नोडजेस 'क्रिप्टो' मॉड्यूल की मदद से), और अंत में मोंगोज़ एक नया खाता सहेजने से पहले हर बार नमक और हैश दोनों को स्टोर करता है।

//make hash 
userSchema.pre('save', function(next) { 
    var user = this; 
    if(!user.isModified('password')) return next(); 
    var rand = (Math.floor(Math.random() * 1000000000)).toString(36); 
    var hash = crypto.createHash('md5').update(user.password + rand).digest("hex"); 
    user.password = hash; 
    user.salt = rand; 
    next(); 
}); 

सत्यापन के लिए मैं बस इनपुट पासवर्ड (लॉगिन पर) लेता हूं और नमक का उपयोग करके उसी हैश को फिर से बनाने का प्रयास करता हूं। मैं फिर संग्रहीत हैश की तुलना नए से करता हूं और तदनुसार सत्य या गलत लौटाता हूं।

// Password verification 
    userSchema.methods.validPassword = function(password) { 
     var testhash = crypto.createHash('md5').update(password + this.salt).digest("hex"); 
     if(testhash === this.password) { 
     return true; 
     } else { 
     return false; 
     } 
    } 
+0

उस पल जब आपको एहसास हो कि यह एक वर्ष पुराना है। – Rorschach120

+0

यह ठीक है :) योगदान के लिए धन्यवाद –

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