0

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;

これで問題なく動作しますが、ここで if (username === 'test' && password === 'test') の代わりに MongoDb データベースを使用するにはどうすればよいですか?

私はこの機能を追加しようとしました:

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 では、すべてがどのように機能するかを理解するのに本当に苦労しています..

4

4 に答える 4

2

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);
}));
于 2014-10-01T06:23:55.887 に答える
1

これが私がそれを使用している方法です:

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);
  });
}))
于 2015-12-21T17:40:06.847 に答える
0

ええと、passport.use() 呼び出し元関数に利回りがありません。

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

    var useri = yield getUser(username);

    console.log(useri);
  }
));

ただし、他の回答と同様に、扱いやすいように co を使用することをお勧めします。

于 2016-04-12T14:31:15.747 に答える