JWT 对 mongoose 数据的不正确解码

JWT improper decoding with mongoose data

这是我正在编码的数据

{ _id: 5880c2562f109c2e17489155,
  password: 'aTGM/Nnoii/ERt5YZFqaROJA0176bXw5wn7fF9B7.DrikVcW/Va4e',
  verified: false,
  __v: 0 }

以及我使用jsonwebtoken解码得到的数据。

{ '$__': 
   { strictMode: true,
     getters: {},
     wasPopulated: false,
     activePaths: { paths: [Object], states: [Object], stateNames: [Object] },
     emitter: { domain: null, _events: {}, _eventsCount: 0, _maxListeners: 0 } },
  isNew: false,
  _doc: 
   { __v: 0,
     verified: false,
     password: 'aTGM/Nnoii/ERt5YZFqaROJA0176bXw5wn7fF9B7.DrikVcW/Va4e',
     _id: '5880c2562f109c2e17489155' },
  _pres: 
   { '$__original_save': [ null, null ],
     '$__original_validate': [ null ],
     '$__original_remove': [ null ] },
  _posts: 
   { '$__original_save': [],
     '$__original_validate': [],
     '$__original_remove': [] },
  iat: 1484834592 }

如果您注意到文档,我应该能够使用 decoded.password 访问解码的 password 字段,但在这种情况下我必须使用 decoded._doc.password。发生这种情况是因为我直接将猫鼬对象传递给 jwt 还是输出正常,我应该通过添加 _doc 来访问数据。相关代码为

module.exports['generateToken'] = (data)=>{
  return new Promise((fullfill,reject)=>{
    console.log(data.user);
    var token = jwt.sign(data.user,'shhhhhh');
    fullfill(token);
  });
}

module.exports['decodeToken'] = (token)=>{
 return new Promise((fullfill,reject)=>{
   jwt.verify(token,'shhhhhh',(err,decoded)=>{
     if(err)
       reject(err);
     console.log(decoded);
     fullfill(token);
   });
 });
}

data.user 是我从 mongoose 查询 findOne.

得到的文档

Is this happening somehow because i am directly passing in the mongoose object into jwt

是的,猫鼬模型的实例内部结构相当复杂。 _doc 是对内部文档的引用。

为避免被 ._doc 访问,您应该对转换为普通对象的文档进行编码:

module.exports['generateToken'] = (data)=>{
  return new Promise((fullfill,reject)=>{
    console.log(data.user);
    var token = jwt.sign(data.user.toObject(),'shhhhhh');
    fullfill(token);
  });
}