Коа и паспорт с MongoDb

У меня проблемы с Koa, Passport и Monk.

Я хотел бы иметь простую локальную аутентификацию с помощью Passport. Я следил за некоторыми учебниками и дошел до этого: (auth.js)

const
  passport = require('koa-passport'),
  LocalStrategy = require('passport-local').Strategy,
  monk = require('monk'),
  wrap = require('co-monk'),
  db = monk('localhost/try'),
  users = wrap(db.get('users'));

var user = {
  id: 1,
  username: 'test'
};

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

passport.deserializeUser(function(id, done) {
  done(null, user);
});

passport.use(new LocalStrategy(
  function(username, password, done) {

    if (username === 'test' && password === 'test') {

      return done(null, user);
    } else {
      return done(null, false);
    }

  }

));

module.exports = passport;

Теперь это работает нормально, но как я могу использовать свою базу данных MongoDb здесь вместо if (имя пользователя === 'test' && пароль === 'test')?

Я попытался добавить эту функцию:

function *getUser(name) {
  var useri = yield users.find({name:name});
  return useri;
};

а затем используйте его следующим образом:

passport.use(new LocalStrategy(
  function(username, password, done) {

    var useri = getUser(username);
    console.log(useri);

    if (username === 'test' && password === 'test') {

      return done(null, user);
    } else {
      return done(null, false);
    }
  }
));

но в конечном итоге получаю только {} в моей консоли.

Итак, как мне это сделать? В Express все так просто, но с этой штуковиной Koa я действительно изо всех сил пытаюсь понять, как все это работает.


person QlliOlli    schedule 02.09.2014    source источник


Ответы (4)


вам следует вызвать функцию генератора с ключевым словом yield. но вы можете использовать yield только в функциях генератора. поэтому вы можете обернуть свою функцию в co(), как показано ниже:

passport.use("login",new LocalStrategy(function(username, password, done) {
   // retrieve user ...
   co(function *() {
     try {
        var user=yield getUser(username);
        console.log(user);
        return user;
     } catch (ex) {
        return null;
     }
   })(done);
}));
person Mohammad Rasti    schedule 01.10.2014
comment
Так что вы должны использовать co, надеялся избежать этого! - person basickarl; 29.03.2015

Вы можете увидеть эту демонстрацию: https://github.com/dozoisch/koa-react-full-example/blob/master/lib/authenticator.js

Метод @Mohammad Rasti не работает в моем проекте (может быть из-за версии). Следующий код работает для меня.

  passport.use(new LocalStrategy(function(username, password, done) {
    co(function*() {
      try {
        var user = yield getUser(username);
        if (username === user.username && password === user.password) {
          return user;
        } else {
          return null;
        }
      } catch(e) {
        return null;
      }
    }).then(function(user) {
      done(null, user);
    });
  }));
person Fancyoung    schedule 03.04.2015

вот как я его использую:

var LocalStrategy = require('passport-local').Strategy
passport.use(new LocalStrategy(function(username, password, done) {

  co(function *() {
    try {
      return yield getUser(username, password);
    } catch (ex) {
      console.log('error: ', ex);
      return null;
    }
  }).then(function(user) {
    console.log('found: ', user);
    done(null, user);
  });
}))
person stondo    schedule 21.12.2015

Хм, вы просто пропустили выход в вызывающей функции паспорта.use ().

passport.use(new LocalStrategy(
  function* (username, password, done) {

    var useri = yield getUser(username);

    console.log(useri);
  }
));

Но, как и другие ответы, лучше всего использовать co для упрощения обработки.

person devric    schedule 12.04.2016