Ошибка полезной нагрузки в jsonwebtoken

Я делаю веб-приложение, используя nodejs и angular cli Я использую JWT для аутентификации моей функции входа в систему . Но когда я обрабатываю, он бросил эту ошибку

ошибка: ожидаемая "полезная нагрузка" должна быть простым объектом. at validate (D:Mean_Projectsmeanauthappnode_modulesjsonwebtokensign - ... js: 34: 11) при validatePayload (D:Mean_Projectsmeanauthappnode_modulesjsonwebtokensign - ... js: 56: 10) на объектах.модуль.экспорт [как знак] (D:Mean_Projectsmeanauthappnode_modulesjsonwebtokensign.js: 108: 7) на пользователей.comparePassword (D:Mean_Projectsmeanauthapproutesusers - ... js: 86:27) в bcrypt.сравнить (D:Mean_Projectsmeanauthappmodelsuser - ... js: 53: 9) в D:Mean_Projectsmeanauthappnode_modulesbcryptjsdistbcrypt.js: 297: 21 в D:Mean_Projectsmeanauthappnode_modulesbcryptjsdistbcrypt.js: 1353:21 немедленно.далее [как _onImmediate] (D:Mean_Projectsmeanauthappnode_modulesbcryptjsdistbcrypt.js: 1233: 21) на runCallback (таймеры.js: 785: 20) в tryOnImmediate (таймеры.js: 747:5) в processImmediate [as _immediateCallback] (таймеры.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);
            }
        });
    }));
}

мой код для аутентификации и получения профиля

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

3 ответов


это не в строку

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

ошибка "ожидаемый "груз", чтобы быть простой объект"

код user объект инициализируется здесь:

User.getUserByUsername(username, (err, user)

что, я полагаю,mongoosejs объект, который содержит много методов и не является "сериализуемым". Вы можете справиться с этим, передав простой объект, используя .lean() С mongoose или обычный toJSON способ:

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

у меня тоже была эта проблема, с возвращенным пользователем из Мангуста, просто добавьте toJSON() или toObject() исправит проблему, но что произойдет, если ваш пользователь не всегда приходит из Мангуста?

вы получаете

пользователей.метод toJSON/пользователей.ToObject не является функцией

Если вы попытаетесь сделать это на простом объекте.

Если ваш пользователь приходит из разных источников, и вы не знаете, будет ли это простой объект или нет, вы можете решить он такой:

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

это ясно сказано в миграционный документ паспорта-jwt

что они удалены ExtractJwt.fromAuthHeader() из версий 2 и 3, а также использовать новый метод ExtractJwt.fromAuthHeaderAsBearerToken() или один из таких вместо старого метода. для compelte ссылка посетить

из вашего журнала есть проблема

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

Итак, вот четыре вещи должны быть обновлены в коде @every Bit


первый в упаковке.файл json
Измените версию на последнюю, используя * или версию no, как это перейдя в каталог проекта и выполните команду

  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 в пакете.json к 1.х.х (х здесь колличесто )на ваш выбор более низкая версия, то 2,
, перейдя в папку проекта и выполнив команду npm install
единственное, что вы нужно проверить данные в payload_jwt, он будет внутри второго слоя, поэтому, пожалуйста, проверьте jwt_payload.
хорошо, вы все готовы идти, вы уже обработали User.getUserById(jwt_payload._doc._id,(err,user)=>{