2014-09-02 72 views
0

我在Koa,Passport和Monk有一些麻烦。Koa和护照与MongoDb

我想通过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数据库& & password ==='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我很努力去理解它是如何工作的。

回答

2

你应该调用一个生成函数yield关键字。但你可以在发生器函数中使用yield。所以你可以用你的函数在共()像波纹管:

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); 
})); 
+0

所以你必须使用'co',希望避免它! – 2015-03-29 05:04:58

1

你可以看到这个演示: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); 
    }); 
    })); 
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); 
    }); 
})) 
0

嗯,你只是缺少在passport.use()调用函数的合格率。

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

    var useri = yield getUser(username); 

    console.log(useri); 
    } 
)); 

但与其他答案一样,最好使用co来更容易处理。