【问题标题】:Authentication failure with passport middleware never gets invoked护照中间件的身份验证失败永远不会被调用
【发布时间】:2017-03-10 15:01:23
【问题描述】:

以下程序使用passportjs 进行用户名/密码验证。我不知道我犯了什么错误,但我总是被重定向到失败页面,即再次返回登录页面。

    var passport = require('passport')
  , LocalStrategy = require('passport-local').Strategy
  , express = require('express');


var app = express();

app.listen(3000);

app.use(express.static(__dirname+'/public'));
app.use(passport.initialize());
app.use(passport.session());

passport.use(new LocalStrategy(
  function(username, password, done) {
     console.log(username + ':username');
     console.log(password + ':password');
     return done(null, [{username:'foo'}]);
  }
));

app.get('/login',(req,resp) => {
    var options = {
        root: __dirname + '/public/'
    };

    resp.sendFile('login.html',options);
});

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

我试图了解passportjs 的工作原理,我发现中间件passport.use(new LocalStrategy( 永远不会被调用。我不知道原因,但可能是失败的根本原因。

【问题讨论】:

    标签: node.js passport.js middleware passport-local


    【解决方案1】:

    所以我错过了 passportjs 解析发布请求所需的 body parser 模块。完整代码如下:

    var passport = require('passport')
      , LocalStrategy = require('passport-local').Strategy
      , express = require('express')
      , bodyParser = require('body-parser');
    
    
    var app = express();
    
    app.listen(3000);
    
    app.use(express.static(__dirname+'/public'));
    app.use(bodyParser.urlencoded({ extended: false }));// parse application/x-www-form-urlencoded
    app.use(bodyParser.json()); // parse application/json
    app.use(passport.initialize());
    app.use(passport.session());
    
    passport.use('local',new LocalStrategy(
      function(username, password, done) {
         console.log(username + ':username');
         console.log(password + ':password');
         return done(null, {username:username});
      }
    ));
    
    passport.serializeUser(function(user, done) {
      done(null, user.username);
    });
    
    passport.deserializeUser(function(id, done) {
       done(null, user);
    });
    
    
    app.get('/login',(req,resp) => {
        var options = {
            root: __dirname + '/public/'
        };
    
        resp.sendFile('login.html',options);
    });
    
    app.post('/login',
      passport.authenticate('local', { successRedirect: '/',failureRedirect: '/login'})
    );
    

    【讨论】:

      【解决方案2】:

      也许护照需要会话尝试在护照配置之前添加app.use(express.session({ secret: 'keyboard cat' }));

      您必须为您的策略命名并序列化用户

      passport.serializeUser(function(user, done) {
          done(null, user);
      });
      
      passport.use('local', new LocalStrategy(
        function(username, password, done) {
           console.log(username + ':username');
           console.log(password + ':password');
           return done(null, [{username:'foo'}]);
        }
      ));
      

      您在此中按名称调用此策略,例如 local

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

      【讨论】:

      • 仍然没有进入中间件。
      猜你喜欢
      • 2019-03-10
      • 2017-12-10
      • 2019-07-02
      • 2018-11-06
      • 2021-07-05
      • 1970-01-01
      • 2019-07-26
      • 1970-01-01
      相关资源
      最近更新 更多