Passport.js使用Express.js 4进行本地身份验证

Passport.js使用Express.js 4进行本地身份验证,express,passport.js,Express,Passport.js,我正在尝试将Passport.js与Express.js 4.0一起使用,但什么都没有发生。我遵循下面的教程,并尝试调整它以适应Express.js 4.0新的路由功能 到目前为止,我只想尝试登录并获得带有正确消息的failure redirect视图,如LocalStrategy中所述 <% include header.html %> <% if (message.length > 0) { %> <div><%= message %&

我正在尝试将Passport.js与Express.js 4.0一起使用,但什么都没有发生。我遵循下面的教程,并尝试调整它以适应Express.js 4.0新的路由功能

到目前为止,我只想尝试登录并获得带有正确消息的failure redirect视图,如LocalStrategy中所述

<% include header.html %>

<% if (message.length > 0) { %>
  <div><%= message %></div>
<% } %>

<form action="/login" method="post" enctype="multipart/form-data">
  <input type="text" name="email"/>
  <input type="password" name="password"/>
  <input type="submit" value="Log In"/>
</form>

<% include footer.html %>
这就是我在app.js中所做的:

1.-拉取所需模块并创建应用程序变量

...
var session = require('express-session');
var mongoose = require('mongoose');
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
var flash = require('connect-flash');
var bcrypt = require('bcrypt-nodejs');

var app = express();
app.engine('.html', require('ejs').__express);
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'html');

app.use(favicon());
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded());
app.use(cookieParser());

app.use(session({
  secret: 'keyboardcat'
}));
app.use(passport.initialize());
app.use(passport.session());
app.use(flash());

app.use(express.static(path.join(__dirname, 'public')));
2.-连接到MongoDB数据库并确保用户模型存储用户

require('./models/db')(mongoose, 'mongodb://localhost/cms');

var User = require('./models/user')(mongoose);
module.exports = function (passport, User, LocalStrategy) {

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

  passport.deserializeUser(function(id, done) {
    User.findById(id, function (err, user) {
      done(err, user);
    });
  });

  passport.use('login', new LocalStrategy({
    usernameField : 'email',
    passwordField : 'password',
    passReqToCallback : true 
  }, function (email, password, done) {

      User.findOne({ email: email }, 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);

      });

    }

  ));

};
4.-配置Passport

require('./config/passport')(passport, User, LocalStrategy);
5.-确保包含所有必需的中间件

...
var session = require('express-session');
var mongoose = require('mongoose');
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
var flash = require('connect-flash');
var bcrypt = require('bcrypt-nodejs');

var app = express();
app.engine('.html', require('ejs').__express);
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'html');

app.use(favicon());
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded());
app.use(cookieParser());

app.use(session({
  secret: 'keyboardcat'
}));
app.use(passport.initialize());
app.use(passport.session());
app.use(flash());

app.use(express.static(path.join(__dirname, 'public')));
6.-路线处理

var router = express.Router();

router.use(function (req, res, next) {

  if (req.method === 'POST' && req.url === '/login') {
    // Log #1
    console.log(passport);

    passport.authenticate('login', { 
      successRedirect: '/',
      failureRedirect: '/login',
      failureFlash: true 
    });

  } else {

    next();

  }
});

router.route('/')
      .get(function (req, res) {
        res.render('index');
      });

router.route('/login')
      .post(function (req, res) {
        console.log('Post on /login');
      })
      .get(function (req, res) {
        res.render('login', {
          message: req.flash('loginMessage')
        });
      });

app.use('/', router);

... (Rest of app.js such as error handlers)
这是如何在./config/Passport.js中设置Passport策略的配置

require('./models/db')(mongoose, 'mongodb://localhost/cms');

var User = require('./models/user')(mongoose);
module.exports = function (passport, User, LocalStrategy) {

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

  passport.deserializeUser(function(id, done) {
    User.findById(id, function (err, user) {
      done(err, user);
    });
  });

  passport.use('login', new LocalStrategy({
    usernameField : 'email',
    passwordField : 'password',
    passReqToCallback : true 
  }, function (email, password, done) {

      User.findOne({ email: email }, 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);

      });

    }

  ));

};
登录视图如下所示

require('./models/db')(mongoose, 'mongodb://localhost/cms');

var User = require('./models/user')(mongoose);
module.exports = function (passport, User, LocalStrategy) {

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

  passport.deserializeUser(function(id, done) {
    User.findById(id, function (err, user) {
      done(err, user);
    });
  });

  passport.use('login', new LocalStrategy({
    usernameField : 'email',
    passwordField : 'password',
    passReqToCallback : true 
  }, function (email, password, done) {

      User.findOne({ email: email }, 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);

      });

    }

  ));

};
正如我们所见,输入名称的设置与策略中的一样正确

<% include header.html %>

<% if (message.length > 0) { %>
  <div><%= message %></div>
<% } %>

<form action="/login" method="post" enctype="multipart/form-data">
  <input type="text" name="email"/>
  <input type="password" name="password"/>
  <input type="submit" value="Log In"/>
</form>

<% include footer.html %>
它应该叫什么名字?我想让它在这里被称为中间件,当发布到登录路径时

日志#1实际上显示了passport对象


我有几天的时间来做这个,我不知道发生了什么。。。我希望有人能发现一些东西,谢谢

我看到您在
路由器.route('/login').post中没有做任何事情(除了
控制台.log
发送消息)

这样做:


嗨,第一个选择很有效。现在我被重定向到“/login”。现在我正在努力输出正确的错误消息,但我想这将是另一个问题,非常感谢!。