jsonwebtoken中的有效负载错误

eve*_*Bit 20 javascript node.js jwt passport.js angular

我正在使用nodejs和angular cli创建一个Web应用程序我正在使用JWT来验证我的登录功能.但是当我处理它时抛出了这个错误

错误:期望"有效负载"成为普通对象.在验证(D:\ Mean_Projects\meanauthapp \node_modules\jsonwebtoken\sign.js:34:11)在object.module.exports上的validatePayload(D:\ Mean_Projects\meanauthapp \node_modules\jsonwebtoken\sign.js:56:10) [as sign](D:\ Mean_Projects\meanauthapp \node_modules\jsonwebtoken\sign.js:108:7)位于bcrypt.compare的User.comparePassword(D:\ Mean_Projects\meanauthapp\routes\users.js:86:27) D:\ Mean_Projects\meanauthapp \node_modules\bcryptjs\dist\bcrypt.js:(D:\ Mean_Projects\meanauthapp\dist\bcrypt.js:1353:21 at Immediate.allxt [as _onImmediate](D:\ Mean_Projects\meanauthapp \node_modules\bcryptjs\dist\bcrypt.js:1233:21)at runCallback(timers.js:785:20) )在processImmediate的tryOnImmediate(timers.js:747:5)[as _immediateCallback](timers.js:718:5)

这是我的护照密码

    const JwtStrategy= require('passport-jwt').Strategy;
    const ExtractJwt=require('passport-jwt').ExtractJwt;
    const User= require('../models/user');
    const config=require('../config/database');        
    module.exports=function(passport){
    let opts={};
    opts.jwtFromRequest=ExtractJwt.fromAuthHeader();
    opts.secretOrKey=config.secret;
    opts.issuer = 'accounts.examplesoft.com';
    opts.audience = 'yoursite.net';
    passport.use(new JwtStrategy(opts,(jwt_payload,done)=>{
        console.log(jwt_payload);
        User.getUserById(jwt_payload._doc._id,(err,user)=>{
            if(err){
                return done(err,false);
            }
            if(user){
                return done(null,user);
            }
            else{
                return done(null,false);
            }
        });
    }));
}
Run Code Online (Sandbox Code Playgroud)

我的验证和获取配置文件的代码

// Authenticate
router.post('/authenticate', (req, res, next) => {
  const username = req.body.username;
  const password = req.body.password;

  User.getUserByUsername(username, (err, user) => {
    if(err) throw err;
    if(!user){
      return res.json({success: false, msg: 'User not found'});
    }

    User.comparePassword(password, user.password, (err, isMatch) => {
      if(err) throw err;
      if(isMatch){
        const token = jwt.sign(user, config.secret, {
          expiresIn: 604800 // 1 week
        });

        res.json({
          success: true,
          token: 'JWT '+token,
          user: {
            id: user._id,
            name: user.name,
            username: user.username,
            email: user.email
          }
        });
      } else {
        return res.json({success: false, msg: 'Wrong password'});
      }
    });
  });
});

// Profile
router.get('/profile', passport.authenticate('jwt', {session:false}), (req, res, next) => {
  res.json({user: req.user});
});
Run Code Online (Sandbox Code Playgroud)

Zil*_*nas 89

它失败了

const token = jwt.sign(user, config.secret, {
Run Code Online (Sandbox Code Playgroud)

错误"预期"有效负载"成为普通对象"

您的user对象在此初始化:

User.getUserByUsername(username, (err, user)
Run Code Online (Sandbox Code Playgroud)

我假设它是mongoosejs对象,它包含许多方法并且不是"可序列化的".您可以通过使用.lean()from mongoose或plain toJSON方法传递普通对象来处理此问题:

const token = jwt.sign(user.toJSON(), config.secret, {
  expiresIn: 604800 // 1 week
});
Run Code Online (Sandbox Code Playgroud)


Jos*_*gas 15

我也有这个问题,来自mongoose的返回用户,只需添加toJSON()toObject()将解决问题,但如果您的用户并非总是来自mongoose会发生什么?

你会得到一个

user.toJson/user.ToObject不是函数

如果您尝试在普通对象上执行此操作.

如果您的用户来自不同的来源并且您不知道它是否是普通对象,您可以像这样解决:

JSON.parse(JSON.stringify(user));
Run Code Online (Sandbox Code Playgroud)