NodeJS护照

我在nodejs上设置了护照,并让它与mongoose一起工作,允许用户login并创build新帐户。

app.js:

var express = require('express') , app = module.exports = express.createServer() , passport = require('passport') , LocalStrategy = require('passport-local').Strategy , routes = require('./routes/index')(app) //index loads in multiple routes , MongoDBConnection = require('./database/DatabaseConnector').MongoDBConnection; // Configuration app.configure(function(){ app.set('views', __dirname + '/views'); app.set('view engine', 'jade'); app.use(express.cookieParser()); app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(express.session({ secret: 'justdoit' })); app.use(passport.initialize()); app.use(passport.session()); app.use(app.router); app.use(express.static(__dirname + '/public')); }); var mongoDbConnection = new MongoDBConnection(); passport.serializeUser(function(user, done) { done(null, user.id); }); passport.deserializeUser(function(id, done) { mongoDbConnection.findUserById(id, function(err, user){ done(err, user); }); }); passport.use(new LocalStrategy( function(username, password, done) { process.nextTick(function () { mongoDbConnection.findUser(username, function(err, user) { //conditions.... }); }); } )); app.get('/', function(req, res){ res.render('index', { title: "Index", user: req.user }); }); app.get('/account', ensureAuthenticated, function(req, res){ res.render('account', { title: "Account", user: req.user }); }); app.get('/login', function(req, res){ res.render('login', { title: "Login", user: req.user, message: req.flash('error') }); }); app.post('/login', passport.authenticate('local', { successRedirect: '/account', failureRedirect: '/login', failureFlash: true }) ); function ensureAuthenticated(req, res, next) { if (req.isAuthenticated()) { return next(); } res.redirect('/login') } 

我的问题是app.js(这是护照代码的位置)文件变得有点大,我试图移动护照部分到自己的脚本,并具有app.js之外的路由和它自己的auth.js路线文件,然后通过app.js引用路线。 它适用于其他路线,但对于护照相关的,如login它似乎没有激发passport.authenicate()函数。

有反正我可以将护照路线和function放入自己的文件,并调用它/加载它从app.js?

auth.js:

 module.exports = function(app){ passport.serializeUser(function(user, done) { done(null, user.id); }); passport.deserializeUser(function(id, done) { mongoDbConnection.findUserById(id, function(err, user){ done(err, user); }); }); passport.use(new LocalStrategy( function(username, password, done) { process.nextTick(function () { mongoDbConnection.findUser(username, function(err, user) { if (err) { return done(err); } if (!user) { return done(null, false, { message: 'Unknown user ' + username }); } if (user.password != password) { return done(null, false, { message: 'Invalid password' }); } return done(null, user); }); }); } )); app.get('/', function(req, res){ res.render('index', { title: "Index", user: req.user }); }); app.get('/account', ensureAuthenticated, function(req, res){ console.log("directing to the account page...."); res.render('account', { title: "Account", user: req.user }); }); app.get('/login', function(req, res){ res.render('login', { title: "Login", user: req.user, message: req.flash('error') }); }); app.post('/login', passport.authenticate('local', { successRedirect: '/account', failureRedirect: '/login', failureFlash: true }) ); function ensureAuthenticated(req, res, next) { if (req.isAuthenticated()) { return next(); } res.redirect('/login') } } 

这就是我所做的。 请评论,如果你需要更多的帮助定制它到你的代码。

第一步

把你的护照代码放在一个单独的文件中。 例如pass.js. (我看你已经这样做了)然后,在该文件中,把所有的代码放在这里面:

 module.exports = function(passport, LocalStrategy){ }; 

请记住添加到您正在使用的其他functioninput。 在你的情况下,除了passport和LocalStrategy,你可能还需要添加mongoDbConnection作为input。

第二步

在你的app.js中,包含这一行。 如果可能,就在“app.listen”之前,确保所有内容都被正确定义/声明/包含。

 require('./pass.js')(passport, LocalStrategy); 

说明

第一步中的“包装器”定义了您将包括在您的应用程序中的代码块。 第二步中的“要求”是实际包含它的代码。 您基本上是将整个“pass.js”文件定义为一个函数,并将其传递给执行代码所需的工具(护照,LocalStrategy等)

在你的情况下,你可能需要修改我的代码来:

 module.exports = function(passport, LocalStrategy, mongoDbConnection){ }; require('./pass.js')(passport, LocalStrategy, mongoDbConnection); 

这应该工作。 我刚刚search了一下,这似乎是“正确”的方式来打破你的app.js(我说这极大的恐慌虽然:))。 随意评论,如果你需要任何帮助。

这个github回购也有一个很好的例子。

https://github.com/madhums/nodejs-express-mongoose-demo

server.js文件将是你的app.js。 而/config/passport.js是包含的护照设置。

为此我build议在app.js中这样做

  require('./mypassport')(app); 

和mypassport.js

 var passport = require('passport') , LocalStrategy = require('passport-local').Strategy , MongoDBConnection = require('./database/DatabaseConnector').MongoDBConnection; module.exports = function(app){ passport.serializeUser(function(user, done) { done(null, user.id); }); passport.deserializeUser(function(id, done) { mongoDbConnection.findUserById(id, function(err, user){ done(err, user); }); }); passport.use(new LocalStrategy( function(username, password, done) { process.nextTick(function () { mongoDbConnection.findUser(username, function(err, user) { if (err) { return done(err); } if (!user) { return done(null, false, { message: 'Unknown user ' + username }); } if (user.password != password) { return done(null, false, { message: 'Invalid password' }); } return done(null, user); }); }); } )); } 
 module.exports = function(app){ passport.serializeUser(function(user, done) { done(null, user.id); }); 

也许它不工作,因为你没有一个护照对象的参考?

再加上勒让的回答。 module.exports = function()是nodejs中的一种方法,可以为整个应用程序创build全局可用的文件,variables或特定function。

 // anyfile.js module.exports = function(){ //global code. }