Подтвердить что ты не робот

Не была вызвана локальная стратегия паспорта

Я уверен, что у меня отсутствует кое-что действительно очевидное здесь, но я не могу понять это. Функция, которую я передал конструктору LocalStrategy, не вызывается при отправке формы входа.

код:

var express = require('express');
var http = require('http');
var path = require('path');
var swig = require('swig');
var passport = require('passport');

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

passport.serializeUser(function(user, done) {
  console.log('Serialize user called.');
  done(null, user.name);
});

passport.deserializeUser(function(id, done) {
  console.log('Deserialize user called.');
  return done(null, {name: 'Oliver'});
});

passport.use(new LocalStrategy(
  function(username, password, done) {
    console.log('local strategy called with: %s', username);
    return done(null, {name: username});
  }));

var app = express();

app.set('port', process.env.PORT || 3000);
app.set('view engine', 'swig');
app.set('views', __dirname + '/views');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.cookieParser('asljASDR2084^^!'));
app.use(express.session());
app.use(passport.initialize());
app.use(passport.session());
app.use(app.router);
app.use(require('less-middleware')({ src: __dirname + '/public' }));
app.use(express.static(path.join(__dirname, 'public')));
app.use(express.errorHandler({ dumpExceptions:true, showStack:true }));

app.engine('swig', swig.renderFile);

app.post('/auth', passport.authenticate('local'));
app.get('/login', function(req, res) {
  // login is a simple form that posts username and password /auth
  res.render('login', {});
});

http.createServer(app).listen(app.get('port'), function(){
  console.log('Express server listening on port ' + app.get('port'));
});

Форма на моей/странице входа вырезана и вставлена ​​из документов паспорта, за исключением того, что я изменил ее, чтобы отправить /auth вместо/login:

<form action="/auth" method="post">
    <div>
        <label>Username:</label>
        <input type="text" name="username"/>
    </div>
    <div>
        <label>Password:</label>
        <input type="password" name="password"/>
    </div>
    <div>
        <input type="submit" value="Log In"/>
    </div>
</form>

Когда я суммирую форму входа, регистрируется следующее:

GET /login 200 5ms - 432b
POST /auth 401 6ms

Обратите внимание, что "локальная стратегия называется" никогда не регистрируется.

Почему не передается функция, которую я передал вызываемой LocalStrategy?

4b9b3361

Ответ 1

Недавно я столкнулся с этой проблемой, и это может быть вызвано рядом вещей. Первое, что нужно проверить, это убедиться, что bodyParser настроен для выражения, что я вижу, что вы это сделали.

app.use(express.bodyParser());

Следующее, что нужно, чтобы форма, которую вы отправляете на маршрут, содержит как username AND password, , так и пользователь должен также вводить что-то в обоих полях. Я был в тупике, чтобы немного проверить его, а не накладывать что-либо в поле пароля во время тестирования:) Паспорт требует, чтобы BOTH выполнял функцию проверки LocalStrategy, переданную в passport.authenticate('local').

Ваш пример также настроен так, чтобы правильно записывать как имя пользователя, так и пароль, но в любом случае вам следует попробовать проверить правильность обработки тела даже без паспорта:

app.post('/auth', function(req, res){
  console.log("body parsing", req.body);
  //should be something like: {username: YOURUSERNAME, password: YOURPASSWORD}
});

Else

Вы пытались добавить обработчик запроса к вашему маршруту /auth?

app.post('/auth', passport.authenticate('local'), function(req, res){
  console.log("passport user", req.user);
});

или

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

Ответ 2

Вы получаете 401 при использовании разных полей имени пользователя и пароля, чем по умолчанию. Вы должны указать это в своей LocalStrategy следующим образом:

passport.use(new LocalStrategy({
    usernameField: 'login',
    passwordField: 'password'
  },

  function(username, password, done) {
  ...
  }
));

По умолчанию это username и password Я думаю. См. Docs здесь.

Ответ 3

Я думаю, что вы отправляете форму с полям имени пользователя или пароля пустым.

Если вы заполните оба входа, затем отправьте, вызывается LocalStrategy.

Ответ 4

Я столкнулся с той же проблемой, когда установил свой собственный обработчик маршрута, из которого я назвал pass.authenticate(). Я забыл, что pass.authenticate возвращает промежуточное программное обеспечение, которое должно быть вызвано, поэтому просто вызвать pass.authenticate недостаточно. Затем я заменил

router.post("/",
 function(req,res,next){
   passport.authenticate("local", function(err, user, info){

    // handle succes or failure

  }); 
})

с

router.post("/",
 function(req,res,next){
   passport.authenticate("local", function(err, user, info){

    // handle succes or failure

  })(req,res,next); 
})

Ответ 5

Для Express 4.x:

// Body parser
var bodyParser = require('body-parser');

app.use(bodyParser.urlencoded({ extended: false })) // parse application/x-www-form-urlencoded
app.use(bodyParser.json()) // parse application/json

c.f. https://github.com/expressjs/body-parser

Ответ 6

Я тоже ударил головой по той же самой проблеме в течение нескольких часов. У меня было все на месте, как сказали другие ответы: 1. Форма возвращала все поля. 2. Орган парса был правильно настроен с расширенным: true 3. Паспорт с каждой настройкой и конфигурацией.

Но я изменил поле имени пользователя с номером телефона и паролем. Изменяя код, как показано ниже, моя проблема

  passport.use('login', new LocalStrategy(
    {usernameField:'phoneNumber',
    passwordField:'password'},
    function (username, password, done) {

    // your login goes here
    })

);

Если кто-то захочет, я могу написать всю процедуру аутентификации для phonenumber, используя mongodb и local-local.

Спасибо @user568109

Ответ 7

Моя проблема заключалась в том, что у меня был enctype = 'multipart/form-data'. Просто измените это на multipart = 'urlencoded'. И я думаю, что это решит.

Ответ 8

Возможно, ваш запрос не был отформатирован должным образом (особенно его тело), ​​и ваше имя пользователя и пароль не отправлялись, когда вы думали, что они были.

Вот пример оболочки API-интерфейса, в которой выполняется проверка вашего тела запроса, анализируется как json:

Api = {};
Api.request = (route, options) => {
  options = options || {};

  options.method = options.method || 'GET';
  options.credentials = 'include';

  if (options.method === 'POST') {
    options.headers = {
      'Accept': 'application/json',
      'Content-Type': 'application/json',
    };
    options.body = JSON.stringify(options.data) || '{}';
  }

  fetch(absoluteUrl + '/api/' + route, options)
    .then((response) => response.json())
    .then(options.cb || (() => {}))
    .catch(function(error) {
      console.log(error);
    });
};

Его можно использовать следующим образом:

Api.request('login', {
  data: {
    username: this.state.username,
    password: this.state.password
  },
  method: 'POST',
  cb: proxy((user) => {
    console.log(user);
  }, this)
});

Ответ 9

Для меня все было правильно настроено. Проблема заключалась в том, что я собирал данные формы, а затем создавал json из данных формы и отправлял его на сервер как JSON.stringify(formdatajson). (Для меня форма входа была всплывающей на экране)

Я нашел свою ошибку, отладив паспортные документы...

Если у вас также есть одна и та же проблема, и ни одно из вышеперечисленных решений не работает для вас, тогда отлаживайте паспортные данные.

открыть

strategy.js

поставьте отладчик ниже.

Strategy.prototype.authenticate 

Проверьте, какие данные формы будут доступны для вас. Надеюсь, что эта помощь...

Ответ 10

  • npm установить паспорт-локальный

  • var passport = require ('паспорт') , LocalStrategy = require ('passport-local'). Стратегия;

Согласно passportjs.org, и это сработало для меня!