2

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, ....

ルート.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);
    };
  });

パスポート.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 に入力する必要があります。この時点から他のコンソール出力が得られないので、私は少し無力です。

4

2 に答える 2

4

【追記】問題を見つけました。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つほど読みましたが、何も機能しませんでした。

誰かが私に最高のヒントをくれたら、私は永遠に感謝します.

于 2015-10-19T23:46:52.007 に答える
4

まず、routes.js にいくつかの基本的な JavaScript 構文エラーがあります。ここにあるこの部分 (わかりやすくするために多くのコードが削除されています) が壊れています。

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

console.log間違った場所にいくつかの呼び出しを追加した可能性があります。混乱を解消するために、passport.authenticate()すぐに認証を実行するのではなく、ミドルウェアを返します。たとえば、次のように使用します。

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

したがって、問題を解決するには、次のように、authenticate によって返されたミドルウェアをすぐに呼び出してみてください。

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');
于 2015-05-31T17:33:31.257 に答える