2012-11-26 2 views
13

S'il vous plaît noter que je suis un débutant en Node.js donc s'il vous plaît soyez patient avec moi :)Node.js et Passport objet n'a pas de méthode validPassword

J'utilise Node.js + Express 3 + Passeport pour créer une authentification simple (locale) juste pour jouer

et ce que je suis arrivé à ce jour que lorsqu'un mauvais nom d'utilisateur ou mot de passe saisi par l'utilisateur est redirigé vers une page d'erreur

mais lorsque l'utilisateur entre un bon nom d'utilisateur et mot de passe Je reçois cette erreur

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

Je ne suis pas sûr de ce qui ne va pas là-bas

app.js (j'ai supprimé le code inutile):

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

            }) 
); 

et maintenant dans les routes/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:""}); 
    }); 
}; 

Merci pour votre temps.

Répondre

11

Eh bien, c'est un peu évident, n'est-ce pas? Vous utilisez

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

mais vous n'avez pas défini la méthode validPassword. Attachez-le à votre schéma:

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

EDIT Vous avez également défini de façon incorrecte le schéma. Il devrait être:

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

Notez que les deux username et password devraient être String objets de type, et non des chaînes "string", si vous savez ce que je veux dire. :)

+0

Merci :) il travaille maintenant –

+0

Une autre question si vous pouvez .. Pouvez-vous me recommander un livre ou d'une ressource pour apprendre Node.js mieux? –

+1

@MuhammadSaleh Je ne connais pas de livre Node.JS. J'ai tout appris en continuant à googler. Commencez par le didacticiel sur [page principale Node.JS] (http://nodejs.org/). Et puis juste google. Stackoverflow est aussi une excellente source de connaissances. C'est comme ça que je l'ai appris. – freakish

11

On dirait que vous avez copié exemple de site passportjs, où Jared a omis de mentionner comment le mettre en œuvre ..

Sur la page js passeport github il a un autre (simple) par exemple; il a enlevé la méthode validPassword tout à fait (ligne 18):

Example

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

C'est ce que je me suis basé sur l'application (en utilisant le cryptage) au-dessus de celui-ci.

+0

Merci j'ai vraiment besoin d'un exemple plus simple et j'ai également contacté Jared pour faire une meilleure documentation :) –

4

Étant également un noob à cela, il m'a fallu une journée entière pour comprendre celui-ci. J'ai utilisé l'histoire d'une autre application de Jared et quelques conseils de crypto des gens ici. Tout d'abord j'ai fait une méthode qui génère un sel (un grand nombre aléatoire qui est stringifié), utilise le sel et le mot de passe de l'utilisateur pour créer un hachage (à l'aide du module crypto de nodejs), et enfin stocke à la fois le sel et le hash chaque fois que mongoose enregistre un nouveau compte.

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

Pour la vérification, je prends simplement le mot de passe entré (à la connexion) et d'essayer la marque le même hachage en utilisant à nouveau le sel. Je compare ensuite le hachage stocké au nouveau et retourne vrai ou faux en conséquence.

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

Ce moment quand vous vous rendez compte que c'est un an. – Rorschach120

+0

C'est bon :) Merci pour la contribution –

Questions connexes