2012-11-26 2 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' 
/루트 이제

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', 

            }) 
); 

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:""}); 
    }); 
}; 
을 login.js :

은 내가 잘못이

app.js (I는 불필요한 코드를 제거) 무엇 확실하지 않다

시간 내 주셔서 감사합니다.

답변

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

편집을 또한 잘못 스키마를 정의한. 그것은해야한다 : 당신이 무슨 뜻인지 안다면 모두 usernamepasswordString 유형의 객체가 아닌 문자열 "string"해야

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

참고. 당신은 제라드가 그것을 구현하는 방법을 언급하는 데 실패 passportjs 웹 사이트에서 예제를 복사처럼 :)

+0

감사합니다 :) 지금 작동합니다. –

+0

다른 질문이 있습니다. 책이나 리소스를 사용하여 Node.js를 더 잘 배울 수 있습니까? –

+1

@MuhammadSaleh Node.JS 책을 모른다. 나는 끊임없이 인터넷 검색을 통해 모든 것을 배웠다. [Node.JS 기본 페이지] (http://nodejs.org/)에서 자습서로 시작하십시오. 그리고 나서 그냥 구글. Stackoverflow는 훌륭한 지식의 원천이기도합니다. 그것이 내가 그것을 배운 방법입니다. – freakish

11

은 .. 보이는 여권 JS의 GitHub의 페이지에서

그는 또 다른 (간단) 예제가 실려있다; 그는 모두 validPassword 방법 (라인 18)을 제거 : 나는 그 위에 (암호화 사용) 내 응용 프로그램을 기반으로 무엇

Example

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

.

+0

감사합니다. 나는 더 간단한 예제가 정말로 필요했고 Jared에게 더 나은 문서를 만들기 위해 연락했습니다 :) –

4

또한이 멍청한 놈이기 때문에,이 하루를 알아 내는데 하루 종일 걸렸습니다. Jared의 예제 응용 프로그램 중 하나의 기록과 여기에있는 사람들의 일부 암호화 조언을 사용했습니다.

먼저 salt (문자열이 큰 임의의 숫자)를 생성하고 salt와 사용자의 암호를 사용하여 해시를 생성 한 다음 (nodejs 'crypto'모듈을 사용하여) 마지막으로 mongoose가 새 계정을 저장하기 전에 매번 소금과 해시를 저장합니다.

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

그 순간이 실현되는 순간은 1 살입니다. – Rorschach120

+0

괜찮습니다. :) 감사합니다. –