jsonwebtoken 中的有效负载错误

Payload error in jsonwebtoken(jsonwebtoken 中的有效负载错误)
本文介绍了jsonwebtoken 中的有效负载错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

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

I am making a web application using nodejs and angular cli I'm using JWT to authenticate my login function . But when I process it threw this error

错误:预期的有效负载"是一个普通对象.验证时 (D:Mean_Projectsmeanauthapp ode_modulesjsonwebtokensign.js:34:11)在 validatePayload (D:Mean_Projectsmeanauthapp ode_modulesjsonwebtokensign.js:56:10)在 Object.module.exports [作为符号] (D:Mean_Projectsmeanauthapp ode_modulesjsonwebtokensign.js:108:7)在 User.comparePassword (D:Mean_Projectsmeanauthapp outesusers.js:86:27)在 bcrypt.compare (D:Mean_Projectsmeanauthappmodelsuser.js:53:9)在 D:Mean_Projectsmeanauthapp ode_modulescryptjsdistcrypt.js:297:21在 D:Mean_Projectsmeanauthapp ode_modulescryptjsdistcrypt.js:1353:21在 Immediate.next [as _onImmediate] (D:Mean_Projectsmeanauthapp ode_modulescryptjsdistcrypt.js:1233:21)在 runCallback (timers.js:785:20)在 tryOnImmediate (timers.js:747:5)在 processImmediate [as _immediateCallback] (timers.js:718:5)

Error: Expected "payload" to be a plain object. at validate (D:Mean_Projectsmeanauthapp ode_modulesjsonwebtokensign.js:34:11) at validatePayload (D:Mean_Projectsmeanauthapp ode_modulesjsonwebtokensign.js:56:10) at Object.module.exports [as sign] (D:Mean_Projectsmeanauthapp ode_modulesjsonwebtokensign.js:108:7) at User.comparePassword (D:Mean_Projectsmeanauthapp outesusers.js:86:27) at bcrypt.compare (D:Mean_Projectsmeanauthappmodelsuser.js:53:9) at D:Mean_Projectsmeanauthapp ode_modulescryptjsdistcrypt.js:297:21 at D:Mean_Projectsmeanauthapp ode_modulescryptjsdistcrypt.js:1353:21 at Immediate.next [as _onImmediate] (D:Mean_Projectsmeanauthapp ode_modulescryptjsdistcrypt.js:1233:21) at runCallback (timers.js:785:20) at tryOnImmediate (timers.js:747:5) at processImmediate [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);
            }
        });
    }));
}

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

My code for authenticate and get profile

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

推荐答案

在线失败

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

出现错误预期有效负载"是一个普通对象"

您的 user 对象在此处初始化:

Your user object is initialized here:

User.getUserByUsername(username, (err, user)

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

Which I assume is mongoosejs object, which contains many methods and is not "serializable". You could handle this by passing a plain object, by either using .lean() from mongoose or plain toJSON method:

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

这篇关于jsonwebtoken 中的有效负载错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

相关文档推荐

在开发JS过程中,会经常遇到两个小数相运算的情况,但是运算结果却与预期不同,调试一下发现计算结果竟然有那么长一串尾巴。如下图所示: 产生原因: JavaScript对小数运算会先转成二进制,运算完毕再转回十进制,过程中会有丢失,不过不是所有的小数间运算会
问题描述: 在javascript中引用js代码,然后导致反斜杠丢失,发现字符串中的所有\信息丢失。比如在js中引用input type=text onkeyup=value=value.replace(/[^\d]/g,) ,结果导致正则表达式中的\丢失。 问题原因: 该字符串含有\,javascript对字符串进行了转
Rails/Javascript: How to inject rails variables into (very) simple javascript(Rails/Javascript:如何将 rails 变量注入(非常)简单的 javascript)
CoffeeScript always returns in anonymous function(CoffeeScript 总是以匿名函数返回)
Ordinals in words javascript(javascript中的序数)
getFullYear returns year before on first day of year(getFullYear 在一年的第一天返回前一年)