我遇到了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'&& 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,我真的很难理解它是如何工作的。
答案 0 :(得分: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);
}));
答案 1 :(得分: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);
});
}));
答案 2 :(得分: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);
});
}))
答案 3 :(得分:0)
你刚刚在passport.use()调用函数中错过了一个yield。
passport.use(new LocalStrategy(
function* (username, password, done) {
var useri = yield getUser(username);
console.log(useri);
}
));
但与其他答案一样,最好使用co来更容易处理。