【问题标题】:passportjs local strategy not getting calledpassportjs 本地策略没有被调用
【发布时间】:2015-05-31 14:50:08
【问题描述】:

我正在使用 express 和 passport 来构建一个 rest api 后端,我的 localStrategy 似乎没有被请求调用。

我的应用程序的入口点如下所示:

app.js

var fs = require('fs');
var express = require('express');
var mongoose = require('mongoose');
var passport = require('passport');
var config = require('./config/config');

var morgan       = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser   = require('body-parser');

var app = express();

app.use(morgan('dev')); // log every request to the console
app.use(cookieParser()); // read cookies (needed for auth)
app.use(bodyParser.urlencoded({extended:true})); 

app.use(passport.initialize());

//connect to mongodb
mongoose.connect(config.db, options);

//load models (shorten forEach)
...
require(__dirname + '/models/' + file)(mongoose);

//load passport config
require('./config/passport')(mongoose, passport);

//load routes
require('./config/routes')(app, passport);

//start server
var server = app.listen(3000, ....

routes.js

...
app.post('/auth', function(req, res){
    console.log("reached auth endpoint");
    console.log(req.body);
    passport.authenticate('local', { session: false}, function(err, user, info){
      console.log("Test:"+user);
      if(err) {
        console.log("Error1");
        return next(err)}
      if(!user){
        console.log("Error2");
        return res.json(401, {error: 'Auth Error!'});
      }
      console.log("Error3");
      var token = jwt.encode({ username: user.email }, "hanswurst");
      res.json({token: token});
    }),
    function(req, res){
      console.log("passport user", req.user);
    };
  });

passport.js

...
passport.use(new LocalStrategy({
    usernameField: 'email',
    passwordField: 'password',
    passReqToCallback: true
  },
  function(email, password, done){
    console.log("TEST");
    User.findOne({'email': email}, function(err, user){
      if(err){
        console.log("Unknown error");
        return done(err);
      }
      if(!user){
        console.log("No User found");
        return done(null, false);
      }
      if(!user.validPassword(password)){
        console.log("Password was incorrect");
        return done(null, false);
      }
      console.log("User was found");
      return done(null, user);
    });
  }
));

我收到表单请求的唯一结果是

reached auth endpoint
{ email: 'test@mail.com', password: 'secret' }
POST /auth - - ms - -

对我来说,请求正文看起来不错,它应该进入我的 LocalStrategy。我有点无助,因为从这一点上我没有得到任何其他控制台输出。

【问题讨论】:

    标签: javascript node.js express passport.js passport-local


    【解决方案1】:

    首先,您在 routes.js 中有一些基本的 javascript 语法错误。此处的这部分(为清楚起见删除了许多代码)已损坏:

    passport.authenticate(/*...*/), function(req, res) {/*..*/};
    

    可能是您刚刚在错误的位置添加了一些console.log 调用。为了消除混淆,passport.authenticate() 不会立即执行身份验证,它所做的只是为您返回一个中间件。例如,您可以像这样使用它:

    var middleware = passport.authenticate(...);
    app.post('/auth', middleware);
    

    因此,要解决您的问题,请尝试立即调用身份验证返回的中间件,如下所示:

    app.post('/auth', function(req, res, next) {
        console.log("reached auth endpoint");
        console.log(req.body);
        passport.authenticate('local', {
            session: false
        }, function(err, user, info) {
                console.log("Test:" + user);
                if (err) {
                    console.log("Error1");
                    return next(err);
                }
                if (!user) {
                    console.log("Error2");
                    return res.json(401, {
                        error: 'Auth Error!'
                    });
                }
                console.log("Error3");
                var token = jwt.encode({
                    username: user.email
                }, "hanswurst");
                res.json({
                    token: token
                });
            })(req, res, next);
    });
    

    另外,我必须告诉你require 缓存模块。为了让config/passport.js 了解猫鼬和护照,您不应该将它们作为如下参数提供:

    require('./config/passport')(mongoose, passport);
    

    只需在 config/passport.js 中再次要求它们,如下所示:

    // (in config/passport.js)
    // Both of these vars point to the same thing you require'd in app.js
    var mongoose = require('mongoose');
    var passport = require('passport');
    

    【讨论】:

      【解决方案2】:

      [编辑]我发现了问题。因为 Express 不再支持 body-parser 等子包,所以您需要单独设置它们。如果我一开始就这样做了,一切都会好起来的,但我只是激活了:

      app.use(bodyParser.urlencoded({extended:true}));
      

      你还需要设置

      app.use(bodyParser.json());
      

      让它正常工作。愚蠢的疏忽,但仍然让我难倒了 3 天。


      我有同样的问题,但似乎没有什么对我有用。

      我将按照执行顺序从上到下删除代码

      翡翠模板

      .navbar-right(ng-controller="mvNavBarLoginCtrl")
        form.navbar-form
          .form-group
            input.form-control(placeholder='Email', ng-model='username')
          .form-group
            input.form-control(type='password', placeholder='password', ng-model='password')
          button.btn.btn-primary(ng-click="signIn(username,password)") Sign In
      

      下一步登录控制器

      angular.module('app').controller('mvNavBarLoginCtrl',function($scope, $http){
        $scope.signIn = function (username, password){
      
          console.log('un = ' + username);   // Prints fine in the console
          console.log('pw = ' + password);   // Prints fine in the console
      
          $http.post('/login', {username: username, password: password}).then(function(response){
            if(response.data.success){
              console.log('Logged in!!');
            }
            else{
              console.log('Failed to log in!!');
            }
      
          });
        }
      });
      

      下一步路由处理程序

      app.post('/login', function(req, res, next){
            console.log(req.username);   // Already empty
            console.log(req.password);   // Already empty
            console.log(req.body);       // Already empty
      
            // Because of the use of AngularJS we can not call passport directly, 
            // missing req and res will break the code 
      
            var auth = passport.authenticate('local', function(err, user){
      
                console.log(user);     // prints undefined
      
                if(err){return next(err);}
      
                if(!user){res.send({success:false});}
      
                req.logIn(user, function(err){
      
                    if(err){return next(err);}
      
                    res.send({success: true, user: user});
                });
      
            });
            // call the auth function to start authenticate
            auth(req, res, next);
        });
      

      下一步护照身份验证处理程序

      var User = mongoose.model('User');
      
      passport.use(new LocalStrategy({
            username: 'username',
            password: 'password'
          },
          function(username, password, done){
      
            console.log("called");  // never printed
      
            // find user based in mongoose schema see 'var User' 
            User.findOne({userName:username}).exec(function (err,user){
      
              console.log(user)     // never printed
              if(err){return done(err);}
      
              if(user){
                return done(null, user);
              }
              else{
                return done(null, false);
              }
            });
          }
      ));
      
      
      passport.serializeUser(function(user, done){
        if(user) {
          done(null, user._id);
        }
      });
      
      passport.deserializeUser(function(id, done){
        user.findOne({_id:id}).exec(function(err, user){
          if(user) {
            done(null, user);
          }
          else{
            done(null, false);
          }
        });
      });
      

      没有错误不在控制台中,也不是节点输出。我很困惑,阅读了大约 5 个类似问题的其他线程,但没有任何效果。

      如果有人能给我金针,我将永远感激不尽。

      【讨论】:

      • app.use(bodyParser.json());工作。你让我免于发疯。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-12
      • 2019-03-19
      • 2017-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多