【问题标题】:Can't set up Passport with Express and MongoDB/Mongoose - Sample Code?无法使用 Express 和 MongoDB/Mongoose 设置 Passport - 示例代码?
【发布时间】:2012-12-04 03:53:49
【问题描述】:

我是 Node.js 的新手。尝试设置用户帐户创建并使用 Passport 登录。

我选择 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'));
});

注意:此代码只是在尝试登录时将我返回到根页面。我意识到此时我没有任何实际的用户帐户,但是我希望至少能够成功登录假用户。我错过了什么?

【问题讨论】:

    标签: javascript node.js express passport.js


    【解决方案1】:
    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'));
    });
    

    【讨论】:

    • 谢谢 - 我遇到了同样的问题
    • 另外,谢谢。不过,我确实不得不提​​一下,如果密码错误,您不应该返回用户存在;这是危害 Web 服务安全性的众多小事之一。
    • @Romiox 取决于。有许多网站可以轻松获取他们的用户列表(例如 StackOverflow),因此它们的安全性并不低。
    【解决方案2】:

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

    看来问题可能出在LocalStrategy 的回调中。 User 模型似乎不是必需的。

    【讨论】:

    • 谢谢迪克森。我会看看他们的例子。我的代码有一些问题。是的,用户模型缺失的事实是其中的一部分。在 Nodejitsu IRC 聊天室的一些帮助下,我能够让它正常工作。我会在下面发帖。
    猜你喜欢
    • 2011-12-07
    • 2019-10-29
    • 2017-01-05
    • 2011-12-07
    • 2021-12-11
    • 2021-01-03
    • 1970-01-01
    • 2019-12-30
    • 2014-10-22
    相关资源
    最近更新 更多