首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MongoDb的Koa和Passport

MongoDb的Koa和Passport
EN

Stack Overflow用户
提问于 2014-09-02 23:32:02
回答 4查看 1.5K关注 0票数 0

我和Koa,Passport和Monk有点麻烦。

我希望使用Passport进行简单的本地身份验证。我遵循了一些教程,并得到了以下结论:(auth.js)

代码语言:javascript
复制
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 (用户名测试‘MongoDb’&密码测试‘===’)?

我试着添加这个函数:

代码语言:javascript
复制
function *getUser(name) {
  var useri = yield users.find({name:name});
  return useri;
};

然后像这样使用它:

代码语言:javascript
复制
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的东西,我真的很难理解它是如何工作的……

EN

回答 4

Stack Overflow用户

发布于 2014-10-01 14:23:56

您应该使用 you 关键字调用生成器函数。但是您可以仅在生成器函数中使用yield。因此,您可以将函数包装在co()中,如下所示:

代码语言:javascript
复制
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);
}));
票数 2
EN

Stack Overflow用户

发布于 2015-04-03 16:45:39

你可以看到这个演示:https://github.com/dozoisch/koa-react-full-example/blob/master/lib/authenticator.js

@Mohammad Rasti的方法在我的项目中不起作用(可能是因为版本不同)。下面的代码对我有效。

代码语言:javascript
复制
  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);
    });
  }));
票数 1
EN

Stack Overflow用户

发布于 2015-12-22 01:40:07

这就是我使用它的方式:

代码语言:javascript
复制
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);
  });
}))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25627127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档