在使用护照jwt策略进行身份验证后,req.body未定义

时间:2018-06-15 04:04:17

标签: node.js express jwt passport.js

我正在使用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.paramsreq.query。我尝试了很多方法,包括将req与策略一起传递:

new JwtStrategy(opts, (req, jwt_payload, done) => ...

所以问题是,如果没有从上面得到,我是如何访问req对象,而不只是req.user,以便我能够处理参数化的URL和查询?

1 个答案:

答案 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之类的内容,以确保其正确解码。