【发布时间】:2016-12-25 08:30:01
【问题描述】:
我使用护照 JWT 进行身份验证,但我在运行回调函数/响应时遇到困难,仅当用户通过身份验证。如何做到这一点?
在我的路线中:
import express from 'express';
import passport from '../../config/passport';
import memberInfoCtrl from '../controllers/memberInfo';
const router = express.Router();
router.route('/members')
.get(membersCtrl.tokenCheck, passport.authenticate('jwt', { session: false }), membersCtrl.doSomethingElse);
export default router;
如果身份验证成功,我希望运行membersCtrl.doSomethingElse。
这是我的 tokenCheck 函数:
function tokenCheck(req, res, next) {
const token = getToken(req.headers);
if (token) {
const decoded = jwt.decode(token, config.secret);
User.findOne({
email: decoded.email
}, (err, user) => {
if (err) throw err;
if (!user) {
return res.status(403).send({
success: false, msg: 'Authentication failed. User not found.'
});
}
// res.json({ success: true, msg: 'Welcome to the member area!' });
return next();
});
} else {
return res.status(403).send({ success: false, msg: 'No token provided.' });
}
}
在tokenCheck 中使用res.json 可以正常工作,但之后不会调用doSomethingElse 函数。
我以为是因为我们发送了这样的回复:
res.json({ success: true, msg: 'Welcome to the member area!' });
将res.json 替换为return next(); 会返回错误:
Error: Unknown authentication strategy \"jwt\"
为什么会发生这种情况 - 我如何在执行另一个功能之前检查身份验证,对于相同的路由?
我确定我错过了一些愚蠢的东西。任何帮助表示赞赏!
这是我初始化护照的主要快递脚本的一部分:
import passport from 'passport';
...
app.use(passport.initialize());
app.use('/api', routes);
...
护照配置:
const JwtStrategy = require('passport-jwt').Strategy;
import User from '../server/models/user';
import config from './env';
module.exports = (passport) => {
const opts = {};
opts.secretOrKey = config.secret;
passport.use(new JwtStrategy(opts, (jwtPayload, done) => {
User.findOne({ id: jwtPayload.id }, (err, user) => {
if (err) {
return done(err, false);
}
if (user) {
done(null, user);
} else {
done(null, false);
}
});
}));
};
【问题讨论】:
-
没人能帮忙吗?我头疼:-)
标签: javascript node.js express passport.js jwt