我正在使用JWT在我的快递应用中与用户进行身份验证。其中一条路由需要在继续之前进行身份验证,所以我按照以下文档和教程这样做:
router.post('/current/update', passport.authenticate('jwt', { session: false }),(res, req) => {
console.log(req.body) //undefined
}
passport.js
const JwtStrategy = require('passport-jwt').Strategy;
const ExtractJwt = require('passport-jwt').ExtractJwt;
const mongoose = require('mongoose');
const Account = mongoose.model('accounts')
const keys = require('./keys');
const opts = {};
opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();
opts.secretOrKey = keys.secretOrKey;
module.exports = passport => {
passport.use(
new JwtStrategy(opts, (jwt_payload, done) => {
Account.findById(jwt_payload.id)
.then(account => {
if(account){
return done(null, account)
}
return done(null, false)
}).catch(err => {
console.log(err)
return done(err)
})
})
);
};
不知道如何访问请求正文是令人不安的,因为这意味着我不知道如何访问req.params
和req.query
。我尝试了很多方法,包括将req
与策略一起传递:
new JwtStrategy(opts, (req, jwt_payload, done) => ...
所以问题是,如果没有从上面得到,我是如何访问req
对象,而不只是req.user
,以便我能够处理参数化的URL和查询?
答案 0 :(得分:1)
您需要告诉JwtStrategy将req
对象传递给您的回调。您可以通过提供给策略的选项对象来执行此操作。您的代码将如下所示:
const opts = {};
opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();
opts.secretOrKey = keys.secretOrKey;
opts.passReqToCallback = true; // New option!
然后在你的回调函数中,你还需要接受req
字段作为函数的第一个参数。所以你的回调初始化来自
new JwtStrategy(opts, (jwt_payload, done)
并成为
new JwtStrategy(opts, (req, jwt_payload, done)
然后,您可以通过req
访问完整的快速请求对象。如评论中所述,您还需要body-parser
之类的内容,以确保其正确解码。