JsonWebToken在节点4和节点6/8中以不同的方式签名

我目前在节点4中使用node-jsonwebtoken生成JWT。当我尝试升级到节点8时,我无法签署节点4中生成的JWT(使用相同的秘密&有效载荷,签名是不同的)。 这是一个问题,因为我不想让旧的令牌失效。

问题来自node-jwa库 ,一个依赖节点-jws,它是node-jsonwebtoken的依赖。 我在GitHub上引用了这个问题,正如你所看到的,模块的作者能够重现这个问题。 这里是代码,如果你想testing:

const crypto = require('crypto'); const jwa = require('jwa'); const secret = crypto.createHash('sha256').update('secret').digest('binary'); const payload = { uid: 'test', iat: 1455988418, iss: 'test' }; const algo = jwa('HS256'); const sig = algo.sign(payload, secret); console.log(sig); // Node v4 => "_zPq9vDP4_Ve0mTVTF_9H3NRkluQhoR4yAg8X4yqR8Q" // Node v6 => "hk9bpxID-HOmvNpJUy7x80KqT5JP8tb_BoAJLYVIYsE" 

据我所知,问题是在v5 / v6中,摘要的默认编码被改为utf8。 在v4和更早版本中,它是二进制的。

Cf => github.com/nodejs/node/issues/6813

作为node-jwa的主持人不再回复,我试图find一个解决方法,因为我真的不想永远粘在Node 4(这不再是LTS)。

我试图find修改node-jwa库的位置,以便它可以像Node 4一样在Node 8中对我的令牌进行签名。

似乎影响我的问题的线是在这里库=> github.com/brianloveswords/node-jwa/blob/master/index.js#L35

我试图做一些改变,但无法做到这一点…

如果您对解决方法有所了解,

非常感谢你!