2012-12-17 43 views
3

我是新来的Node.js.尝试设置用户帐户创建并使用Passport登录。无法使用Express和MongoDB/Mongoose设置Passport - 示例代码?

我选择了护照,因为它的受欢迎程度,但我似乎无法拼凑一个基于Passport网站上的文档工作身份验证过程。

有没有人知道这个设置的教程?最好在那里你可以下载源代码。

我会分享我的app.js文件,也许这会揭示什么是缺乏。

var express = require('express') 
    , routes = require('./routes') 
    , home = require('./routes/home') 
    , user = require('./routes/user') 
    , http = require('http') 
    , path = require('path') 
    , passport = require('passport') 
    , LocalStrategy = require('passport-local').Strategy 
    , flash = require('connect-flash'); 


var app = express(); 

app.configure(function(){ 
    app.set('port', process.env.PORT || 3000); 
    app.set('views', __dirname + '/views'); 
    app.set('view engine', 'jade'); 
    app.use(express.favicon()); 
    app.use(express.logger('dev')); 
    app.use(express.bodyParser()); 
    app.use(express.methodOverride()); 
    app.use(express.cookieParser()); 
    app.use(express.session({ cookie: { maxAge: 60000 }, secret: 'keyboard cat' })); 
    app.use(flash()); 
    app.use(passport.initialize()); 
    app.use(passport.session()); 
    app.use(app.router); 
    app.use(express.static(path.join(__dirname, 'public'))); 
}); 

app.configure('development', function(){ 
    app.use(express.errorHandler()); 
}); 

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

passport.deserializeUser(function(obj, done) { 
    done(null, obj); 
}); 

passport.use(new LocalStrategy({ 
    usernameField: 'email', 
    passwordField: 'password' 
    }, 
    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); 
    }); 
    } 
)); 

app.get('/', routes.index); 
app.post('/login', 
    passport.authenticate('local', { 
    successRedirect: '/home', 
    failureRedirect: '/', 
    failureFlash: true 
    }) 
); 
app.get('/home', home.dashboard); 
app.get('/users', user.list); 

http.createServer(app).listen(app.get('port'), function(){ 
    console.log("Express server listening on port " + app.get('port')); 
}); 

注:此代码只是试图登录时,我返回到根页面我意识到,我并不在这一点上有任何实际的用户帐户,但我想至少获得成功用假用户登录。我错过了什么?

回答

7
var express = require('express') 
    , routes = require('./routes') 
    , home = require('./routes/home') 
    , user = require('./routes/user') 
    , http = require('http') 
    , mongodb = require('mongodb') 
    , mongoose = require('mongoose') 
    , path = require('path') 
    , passport = require('passport') 
    , LocalStrategy = require('passport-local').Strategy 
    , flash = require('connect-flash') 
    ; 

var app = express(); 

mongoose.connect('mongodb://localhost/test'); 
var db = mongoose.connection; 
db.on('error', console.error.bind(console, 'connection error:')); 
db.once('open', function callback() { 
    console.log('Connected to DB'); 
}); 
var userSchema = mongoose.Schema({ 
    username: String, 
    password: String 
}); 
userSchema.methods.validPassword = function (password) { 
    if (password === this.password) { 
    return true; 
    } else { 
    return false; 
    } 
} 
var User = mongoose.model('User', userSchema); 
var user = new User({ username: 'andrew', password: 'secret' }); 
user.save(); 

app.configure(function(){ 
    app.set('port', process.env.PORT || 3000); 
    app.set('views', __dirname + '/views'); 
    app.set('view engine', 'jade'); 
    app.use(express.favicon()); 
    app.use(express.logger('dev')); 
    app.use(express.bodyParser()); 
    app.use(express.methodOverride()); 
    app.use(express.cookieParser()); 
    app.use(express.session({ cookie: { maxAge: 60000 }, secret: 'keyboard cat' })); 
    app.use(flash()); 
    app.use(passport.initialize()); 
    app.use(passport.session()); 
    app.use(app.router); 
    app.use(express.static(path.join(__dirname, 'public'))); 
}); 

app.configure('development', function(){ 
    app.use(express.errorHandler()); 
}); 

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

passport.deserializeUser(function(obj, done) { 
    done(null, obj); 
}); 

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

app.get('/', routes.index); 
app.post('/login', 
    passport.authenticate('local', { 
    successRedirect: '/home', 
    failureRedirect: '/', 
    failureFlash: true 
    }) 
); 
app.get('/home', home.dashboard); 
app.get('/users', user.list); 

http.createServer(app).listen(app.get('port'), function(){ 
    console.log("Express server listening on port " + app.get('port')); 
}); 
+0

谢谢 - 我有同样的问题 –

+0

另外,谢谢。不过,我不得不提及,如果密码错误,您不应该返回用户存在;这是危害Web服务安全的许多小事之一。 –

+0

@Romiox取决于。有许多网站可以很容易地获得他们的用户列表(如StackOverflow),并且因此也不是那么安全。 –

0

有一个使用passport-localExpress作为passport-local source的一部分的示例。将passport.authenticatepassport.authenticate调用的failureRedirect设置为login页面并将必要的代码添加到登录视图模板以显示Flash消息可能会有所帮助,请参阅链接的源代码。如果您需要更多帮助,请查看其他护照模块的来源。

看起来问题可能在LocalStrategy的回调中。 User模型似乎并未被要求。

+0

谢谢狄克逊。我会看看他们的例子。我的代码有几个问题。是的,用户模型缺失的事实是其中的一部分。在Nodejitsu IRC聊天室中获得一些帮助后,我能够正常工作。我会在下面发帖。 – AndrewHenderson

相关问题