Payload error in jsonwebtoken

I am building a web application using nodejs and angular cli. I am using JWT to authenticate my login function. But when I process it, this error was a mistake

Error: The expected "payload" should be a simple object. when validating (D: \ Mean_Projects \ meanauthapp \ node_modules \ jsonwebtoken \ sign.js: 34: 11) at validatePayload (D: \ Mean_Projects \ meanauthapp \ node_modules \ jsonwebtoken \ sign.js: 56: 10) in Object.module.exports [as a sign] (D: \ Mean_Projects \ meanauthapp \ node_modules \ jsonwebtoken \ sign.js: 108: 7) on the User.comparePassword page (D: \ Mean_Projects \ meanauthapp \ routes \ users.js: 86: 27) in bcrypt. compare (D: \ Mean_Projects \ meanauthapp \ models \ user.js: 53: 9) to D: \ Mean_Projects \ meanauthapp \ node_modules \ bcryptjs \ dist \ bcrypt.js: 297: 21 to D: \ Mean_Projects \ meanauthapp \ node_modules \ bcryptjs \ dist \ bcrypt.js: 1353: 21 in Immediate.next [as _onImmediate] (D: \ Mean_Projects \ meanauthapp \ node_modules \ bcryptjs \ dist \ bcrypt.js: 1233: 21) on runCallback (timers.js: 785:20) in tryOnImmediate (timers.js: 747: 5) on processImmediate [as _immediateCallback] (timers.js: 718: 5)

Here is my passport code

    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);
            }
        });
    }));
}

My authentication and profile code

// 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});
});
+6
source share
3 answers

It does not work in line

const token = jwt.sign(user, config.secret, {

With the error "Expected" payload "be a simple object"

The object is userinitialized here:

User.getUserByUsername(username, (err, user)

I assume this is an object mongoosejsthat contains many methods and is not "serializable". You can handle this by passing a simple object using the .lean()from mongooseor plain method toJSON:

const token = jwt.sign(user.toJSON(), config.secret, {
  expiresIn: 604800 // 1 week
});
+30
source

this is explicitly mentioned in the passport-jwt migration document

ExtractJwt.fromAuthHeader() 2 3, ExtractJwt.fromAuthHeaderAsBearerToken() , . compelte reference

User.comparePassword (D:\Mean_Projects\meanauthapp\routes\users.js:86:27) at 

@every Bit


package.json
* ,

  npm install passport-jwt --save
    "dependencies": {
    ....     
        "passport-jwt": "^3.0.1"
      }

commadn

`npm install`
    "dependencies": {
        ....     
            "passport-jwt": "*"
          }

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

ExtractJwt.fromAuthHeader();

, doc opts.jwtFromRequest=ExtractJwt.fromAuthHeaderWithScheme('jwt');

User.getUserById(jwt_payload._id,(err,user)=>{

<


  • ,


-jwt package.json 1.xx(x nuber) , 2,
, npm install
, , payload_jwt, , , , jwt_payload.
, , User.getUserById(jwt_payload._doc._id,(err,user)=>{

+1

, mongoose toJSON() toObject(), , , ?

user.toJson/user.ToObject

.

, , :

JSON.parse(JSON.stringify(user));
0
source

All Articles