2012-11-26 26 views
13

請注意,我在Node.js的總初學者所以請耐心等待我:)的Node.js和護照對象沒有方法validPassword

我如何使用Node.js +快遞3 +護照創建一個簡單的認證(本地)只是玩弄

什麼我到目前爲止,當一個錯誤的用戶名或密碼輸入的用戶會被重定向到一個錯誤頁面

但達到當用戶輸入一個正確的用戶名和密碼我得到這個錯誤

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 
}); 

注意兩個usernamepasswordString類型的對象,而不是字符串"string",如果你知道我的意思。 :)

+0

謝謝:)它,如果你可以...你給我推薦一本書或學習Node.js的更好的任何資源工作現在 –

+0

另一個問題? –

+1

@MuhammadSaleh我不知道任何Node.JS書。我通過不斷的谷歌搜索學到了一切。從[Node.JS主頁](http://nodejs.org/)上的教程開始。然後只是谷歌。 Stackoverflow也是一個很好的知識來源。我就是這樣學習的。 – freakish

11

看起來你從passportjs網站,在那裏賈裏德沒有提到如何實現它複製的例子..

在護照上JS GitHub的頁面,他還有另外一個(簡單)的例子;他取出validPassword方法完全(18行):

Example

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

我根據我對在它的上面(使用加密)的應用程序,是。

+0

謝謝我真的需要一個更簡單的例子,我也聯繫了Jared做出更好的文檔:) –

4

作爲一個noob在這個,它花了我整整一天來找出這一個。我使用了另一個Jared示例應用程序的歷史記錄和一些來自這裏的人的加密建議。

首先,我做了一個方法,生成一個鹽(一個大的隨機數被字符串化),使用鹽和用戶的密碼來創建一個哈希(在nodejs的'crypto'模塊的幫助下),最後在貓鼬保存新帳戶之前,每次都存儲鹽和散列。

//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(); 
}); 

爲了驗證我乾脆把輸入的密碼(登錄時),並嘗試再次做出同樣的哈希使用的鹽。然後,我將存儲的哈希與新哈希進行比較,並相應地返回true或false。

// 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

沒關係:)感謝您的貢獻 –