Узел js Next не является ошибкой в ​​стратегии пасспорта - PullRequest
0 голосов
/ 15 марта 2019

Не получается заставить работать систему входа в систему. Я использую файл json с информацией о пользователе, и я использую node.js, экспресс и паспорт. Вот мой код (сокращенно, чтобы включать только соответствующую информацию).

index.js

const express = require('express')
const path = require('path')
const PORT = process.env.PORT || 5000
const myDB = require('./jDB');
const passport = require('passport')
  , LocalStrategy = require('passport-local').Strategy;
const app = express();
const bodyParser = require('body-parser');

app.use(express.static(path.join(__dirname, 'public')));
app.use(bodyParser());
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

app.use(passport.initialize());
app.use(passport.session());

app.get('/success', (req, res) => res.send("Welcome "+req.query.username+"!!"));
app.get('/error', (req, res) => res.send("error logging in"));

passport.serializeUser(function(user, cb) {
  cb(null, user.id);
});

passport.deserializeUser(function(id, cb) {
  User.findById(id, function(err, user) {
    cb(err, user);
  });
});

passport.use(new LocalStrategy({

  usernameField: 'username',
  passwordfield : 'password'

},
  function(username, password, done) {
  console.log('I was given ' + username + " and " + password);
  if(myDB.login(username, password)) {
      console.log('Logged in');
      return done(null, user); 
  } else {
      console.log('Failed login');
      return done(null, false);
  }
}));


function myAuth(req, res) {
  passport.authenticate('local', { 
    successRedirect: '/success', 
    failureRedirect: '/error', 
  })(req, res);


}

app.get('/login', (req, res) => res.render('pages/login', { root : __dirname}));

app.post('/login', (req, res) => myAuth(req, res));

app.listen(PORT, () => console.log(`Listening on ${ PORT }`));  

jDB.js

const login = require('./json/users.json');

module.exports = {
    login : function(mUser, mPass) {
        var cryptPass = crypto.createHmac('sha256', mPass).digest('hex');
        for(var exUser in login) {
            console.log(json.stringify(login[exUser]) + " against " + mUser);
            if(login[exUser].username == mUser && login[exUser].password == cryptPass) {
                return true;
            }
        } 
        return false;

    }

И раздел формы логина.ejs:

<form action='/login' method='post'>
            <div class="form-group">
              <label for="username">Username</label>
              <input type="text" class="form-control" name="username">
            </div>
            <div class="form-group">
              <label for="pasword">Password</label>
              <input type="password" class="form-control" name="password">
            </div>
            <button type="submit" class="btn btn-primary">Login</button>
          </form>

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

TypeError: next is not a function
    at Strategy.strategy.error (/home/tommy/carrers-week/node_modules/passport/lib/middleware/authenticate.js:356:9)
    at Strategy.authenticate (/home/tommy/carrers-week/node_modules/passport-local/lib/strategy.js:93:17)
    at attempt (/home/tommy/carrers-week/node_modules/passport/lib/middleware/authenticate.js:361:16)
    at authenticate (/home/tommy/carrers-week/node_modules/passport/lib/middleware/authenticate.js:362:7)
    at myAuth (/home/tommy/carrers-week/index.js:195:5)
    at app.post (/home/tommy/carrers-week/index.js:202:34)
    at Layer.handle [as handle_request] (/home/tommy/carrers-week/node_modules/express/lib/router/layer.js:95:5)
    at next (/home/tommy/carrers-week/node_modules/express/lib/router/route.js:137:13)
    at Route.dispatch (/home/tommy/carrers-week/node_modules/express/lib/router/route.js:112:3)
    at Layer.handle [as handle_request] (/home/tommy/carrers-week/node_modules/express/lib/router/layer.js:95:5)

Я серьезно не знаю, как решить эту проблему, поэтому заранее спасибо за вашу помощь!

1 Ответ

1 голос
/ 15 марта 2019

Из трассировки ошибок видно, что это приложение выдает в

passport.authenticate

Кроме того, это огорчает метод next. Одна вещь, которую я хотел бы сделать, это ограничить этот вызов

function next() {
  console.log(arguments)
}

или просто укажите:

function myAuth(req, res, next) {
  passport.authenticate('local', { 
    successRedirect: '/success', 
    failureRedirect: '/error', 
  })(req, res, next);


}

app.post('/login', (req, res, next) => myAuth(req, res, next));

Чтобы получить больше понимания, можно взглянуть на

паспорт-местный / блоб / ведущий / Библиотека / strategy.js: 93 * +1014 *

try {
    if (self._passReqToCallback) {
      this._verify(req, username, password, verified);
    } else {
      this._verify(username, password, verified);
    }
  } catch (ex) {
    return self.error(ex); //93
  }

Паспорт / BLOB / Master / Библиотека / промежуточный слой / authenticate.js: 356

  strategy.error = function(err) {
    if (callback) {
      return callback(err);
    }

    next(err); //356
  };

и вуаля:

обратный вызов, предоставленный локальной стратегии, не вызовет next() вызов

...