【发布时间】:2018-11-06 17:52:02
【问题描述】:
我在路由器中有代码
router.post('/auth', function(req, res) {
oauth.auth(req, res);
});
正确命中
accesstokenController.auth = function(req, res) {
console.log('Here auth called');
passport.initialize(), passport.authenticate(
'local', {
session: false,
scope: []
},(req,res)), serialize, generateToken, respond
};
(req,res) 在获得建议此链接的链接后添加
我相信它现在应该调用
passport.use(new Strategy(
function(username, password, done) {
console.log('Here pass called with ' + username + ' - ' + password);
db.authenticate(username, password, done);
}
));
但它从来没有调用过并且发生了超时。
如果我是这样直接调用的
app.post('/auth', passport.initialize(), passport.authenticate('local', { session: false,scope: [] }), serialize, generateToken, respond);
没关系,
在我上面的方法中
accesstokenController.auth = function(req, res) {
console.log('Here auth called');
passport.initialize(), passport.authenticate(
'local', {
session: false,
scope: []
},(req,res)), serialize, generateToken, respond
};
我刚刚创建了一个单独的方法并从路由器页面调用它,而不是调用它的 thislef
我错过了什么
其他代码
const db = {
updateOrCreate: function(user, cb) {
cb(null, user);
},
authenticate: function(username, password, cb) {
console.log('Here called');
User.findOne({ username: username,
password: password }).exec(function (err, user) {
if (err) {
cb(null,null);
}
else {
cb(null,user);
}
});
}
}
function serialize(req, res, next) {
console.log('Here pass called with ser ');
db.updateOrCreate(req.user, function(err, user) {
if (err) {
return next(err);
}
// we store information needed in token in req.user again
req.user = {
id: user.id
};
next();
});
}
function generateToken(req, res, next) {
req.token = jwt.sign({
id: req.user.id,
}, SECRET, {
expiresIn: TOKENTIME
});
next();
}
function respond(req, res) {
res.status(200).json({
user: req.user,
token: req.token
});
}
我有很多相关的链接,但没有设法解决这个问题
【问题讨论】:
-
你的 db.authenticate 是否调用了 done 函数?
-
标准做法是在这里自己调用
done(),同时返回来自db调用的错误/数据。 -
另外,要最终得到响应,您需要在
respond()中添加res.send() -
我更新了鉴权方法
标签: node.js express routing passport.js