2014-09-02 68 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來更容易處理。