【问题标题】:Passport.js local authentication with Express.js 4Passport.js 本地身份验证与 Express.js 4
【发布时间】:2014-07-01 22:05:37
【问题描述】:

我正在尝试将 Passport.js 与 Express.js 4.0 一起使用,但没有任何反应。我正在遵循以下教程并尝试对其进行调整以适应 Express.js 4.0 的新路由功能。

http://scotch.io/tutorials/javascript/easy-node-authentication-setup-and-local

到目前为止,我只想尝试登录并使用正确的消息获取失败重定向视图,如 LocalStrategy 中所述。

这就是我在 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();

2.- 连接MongoDB数据库并确保用户模型存储用户

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

var User = require('./models/user')(mongoose);

4.- 配置 Passport

require('./config/passport')(passport, User, LocalStrategy);

5.- 确保包含所有必需的中间件

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 策略的配置方式

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 %>

由于还没有用户,我希望在提交表单时被重定向到 '/',并显示 '不正确的用户名。' 消息,而不是浏览器保持在加载状态,没有任何反应。

一些想法......

我打电话给:

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

应该在哪里调用它?我在这里想要的是在对登录路由进行 POST 时将其称为中间件。

Log#1 实际上显示的是护照对象。

我有几天的时间,我无法弄清楚发生了什么......我希望有人能发现一些东西,非常感谢!。

【问题讨论】:

    标签: express passport.js


    【解决方案1】:

    我发现你在router.route('/login').post 中没有做任何事情(console.log 发送消息除外)

    这样做:http://passportjs.org/guide/

    .post(passport.authenticate('local', { successRedirect: '/', failureRedirect: '/login' }))

    或者用custom callback(如果你想保留你的console.log),你返回护照返回的身份验证方法。

    .post(函数 (req, res){ console.log('发布到 /login'); return passport.authenticate('local-login', function(err, user, info){ // PS:您也可以在此处检查 err/user 以查看其他一切是否正常 控制台日志(错误); 控制台.log(用户); 控制台日志(信息) })(req, res, next); });

    【讨论】:

    • 您好,第一个选项效果很好。现在我被重定向到'/ login'。现在我正在努力输出正确的错误消息,但我想这将是另一个问题,非常感谢!。
    猜你喜欢
    • 2020-12-15
    • 2017-03-31
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    • 2012-10-28
    • 2012-04-27
    相关资源
    最近更新 更多