2012-09-21 52 views
22

我在nodejs上设置了护照,并让它与猫鼬一起工作,以允许用户登录并创建新帐户。NodeJS护照

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引用路由。它适用于其他路线,但对于护照相关的路线而言,例如登录它似乎不会激发passport.authenicate()函数。

无论如何,我可以把护照路线和功能放到它自己的文件中,并从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') 
} 
} 
+0

你能发表一些代码吗? – UpTheCreek

+0

在那里添加了一些代码。基本上我正在寻找将其转移到外部路线文件并从app.js中删除混乱。 – DanyZift

+0

你可以发布app.js v2吗?可能问题在于模块无法看到您在app.js中创建的pasport对象。你通过应用程序,但不是护照。尝试:'module.exports = function(app,passport){...' – UpTheCreek

回答

36

这是我做的。如果您需要更多帮助将其定制到您的代码,请发表评论。

第一步

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

module.exports = function(passport, LocalStrategy){ 

}; 

记住要添加到函数输入其他任何你正在使用。在你的情况下,除了passport和LocalStrategy,你可能还需要添加mongoDbConnection作为输入。

第二步

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

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

说明

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

就你而言,你可能需要修改我的代码:

module.exports = function(passport, LocalStrategy, mongoDbConnection){ 

}; 

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

这应该有效。我前一阵子搜索了这个,这似乎是“正确”的方式来分解你的app.js(尽管我非常惊慌地说这个:))。如果您需要任何帮助,请随时发表评论。

+0

干杯勒让勒,做到了这一招。 :) – DanyZift

+0

@DanyZift:很高兴知道它有帮助! – Legendre

+0

@Legendre Genius!谢谢! – shaunakde

3

对于此我建议在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); 
     }); 
     }); 
} 
)); 
} 
0
module.exports = function(app){ 

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

也许它不工作,因为ü没有护照对象的引用?

0

加上勒让的回答。 module.exports = function()是一种在nodejs中为整个应用程序创建全局可用的文件,变量或特定功能的方法。

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