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);
});
}
这是我正在编码的数据
{ _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);
});
}