2012-11-26 12 views
13

Si prega di notare che io sono un principiante totale Node.js quindi cerca di essere paziente con me :)Node.js e passaporto oggetto non ha un metodo validPassword

sto usando Node.js + Express 3 + Passaporto per creare un semplice autenticazione (locale) solo per giocare intorno

e quello che ho raggiunto finora che quando un nome utente o password errata immessi utente viene reindirizzato a una pagina di errore

ma quando l'utente inserisce un corretto nome utente e password ottengo questo errore

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

io non sono sicuro di cosa c'è che non va c'è

app.js (ho rimosso il codice non necessario):

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

            }) 
); 

ed ora in percorsi/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:""}); 
    }); 
}; 

Grazie per il tuo tempo.

risposta

11

Bene, questo è ovvio, non è vero? Si utilizza

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

ma non è stata definita validPassword metodo. Collegare al vostro schema:

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

EDIT Hai anche erroneamente definito lo schema. Dovrebbe essere:

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

notare che sia username e password dovrebbe essere String oggetti di tipo, non stringhe "string", se sai cosa voglio dire. :)

+0

Thanks :) ora funziona –

+0

Un'altra domanda se si può .. mi puoi consigliare un libro o di qualsiasi risorsa per imparare Node.js meglio? –

+1

@MuhammadSaleh Non conosco nessun libro Node.JS. Ho imparato tutto costantemente su google. Inizia con il tutorial sulla [Pagina principale di Node.JS] (http://nodejs.org/). E poi basta google. Stackoverflow è anche una grande fonte di conoscenza. È così che l'ho imparato. – freakish

11

Sembra che è stato copiato esempio dal sito passportjs, dove Jared non ha menzionato come implementarlo ..

Nella pagina GitHub passaporto js ha un altro (più semplice) ad esempio; ha rimosso il metodo validPassword del tutto (linea 18):

Example

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

Questo è quello che ho basato la mia app (utilizzando la crittografia) su di esso.

+0

Grazie, ho davvero bisogno di un esempio più semplice e ho anche contattato Jared per creare una documentazione migliore :) –

4

Essendo anche un noob in questo, mi ci è voluto un giorno intero per capirlo. Ho usato la cronologia da un'altra delle app di esempio di Jared e alcuni consigli criptati da gente qui.

Prima di tutto ho creato un metodo che genera un salt (un grande numero casuale che è stringificato), utilizza il salt e la password dell'utente per creare un hash (con l'aiuto del modulo 'crypto' del nodojs), e infine memorizza sia il sale che l'hash ogni volta che la mangusta salva un nuovo account.

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

Per la verifica semplicemente prendo la password immessa (al momento del login) e tentare la marca lo stesso hash di nuovo usando il sale. Quindi confronta l'hash memorizzato con quello nuovo e restituisco true o false di conseguenza.

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

Quel momento in cui ti rendi conto che ha un anno. – Rorschach120

+0

Va bene :) Grazie per il contributo –

Problemi correlati