使用ObjectID与jwt.sign()和verify()

login到我的系统后,我通过jsonwebtoken的sign方法运行login用户的MongoDB _id 。 它返回给我一个散列,然后我把它放到客户端对我的服务器进行的每个后续请求的会话头中。

我现在想解码会话,并从头中恢复string_id ,所以我运行它对jsonwebtoken的verify方法。 我没有这样做的身份validation(这已经通过查看数据库中的会话处理)。 我正在恢复_id这样我就可以将用户的活动logging在一个单独的集合中。 我通过中间件运行verifyfunction,并将解码结果保存在req.decoded

但是,当我loggingreq.decoded ,它是一个BSON对象,而不是一个string:

 { _bsontype: 'ObjectID', id: { type: 'Buffer', data: [ 89, 128, 145, 134, 118, 9, 216, 20, 175, 174, 247, 33 ] }, iat: 1501903389, exp: 1501989789 } 

我怎样才能从这个对象恢复_id值,以便我可以再次在我的集合中查找这个logging?

我试过了

我试过以下,没有成功:

  • model.find(req.decoded).then()给我这个错误:

    错误:对象[此处req.decoded的内容]不是有效的ObjectId

  • model.find({_id: req.decoded})给了我这个错误:

    {CastError:对于model [model here]的path“_id”,Cast to ObjectId对于[req.decoded的内容]

  • req.decoded.toString() logs [object Object]

  • JSON.stringify(req.decoded)只是把BSON变成一个string

这当然对于如何实际提供数据到.sign()首先是主观的,就是简单地提供ObjectID的“对象” 通过提供值的差异。

这实际上在.sign()的一般用法中被覆盖为:

如果有效负载不是缓冲区或string,它将被强制使用JSON.stringifystring。

所以简而言之,该版本将“对象”格式化为“需要一些”挖掘“。 在你的表单中,解码的对象具有id属性,并且包含一个字节数组的data的子属性,而不是被转换成一个Buffer 。 这就是你所做的:

  let newId = Buffer.from(req.decoded.id.data).toString('hex'); 

然后newId将成为由字节的'hex'编码值表示的“string”。 这当然会在任何“查询”或“更新”中发布为与_id的模式相匹配时被mongoose翻译成ObjectId

当然,“替代”只是使用ObjectId中的.toString().sign() 。 那么.verify()的结果就是提供的“hexstring”,而不是ObjectID本身的JSON.stringify结果。

用列表来演示:

 const bson = require('bson'), jwt = require('jsonwebtoken'); // Stored ObjectID console.log("Round 1"); (function() { let id = new bson.ObjectID(); console.log("Created: %s", id); let token = jwt.sign(id,'shhh'); // Supply value as ObjectID let decoded = jwt.verify(token,'shhh'); console.log("Interim"); console.log(decoded); let newId = Buffer.from(decoded.id.data).toString('hex'); console.log("Decoded: %s", newId); })(); console.log("\nRound 2"); // Stored String value (function() { let id = new bson.ObjectID(); console.log("Created: %s", id); let token = jwt.sign(id.toString(), 'shhh'); // Supply value as string let decoded = jwt.verify(token,'shhh'); console.log("Decoded: %s", decoded); })(); 

给出输出,显示input值和解码值:

 Round 1 Created: 59857328090c497ce787d087 Interim { _bsontype: 'ObjectID', id: { type: 'Buffer', data: [ 89, 133, 115, 40, 9, 12, 73, 124, 231, 135, 208, 135 ] }, iat: 1501917992 } Decoded: 59857328090c497ce787d087 Round 2 Created: 59857328090c497ce787d088 Decoded: 59857328090c497ce787d088 

并演示了向.sign()提供值的用法以及后续.verify()调用的.verify()