我目前正在使用节点4中的node-jsonwebtoken生成JWT。当我尝试升级到节点8时,我无法签署节点4中生成的JWT(使用相同的秘密) & payload,签名不同)。这是一个问题,因为我不想让旧代币无效。
问题来自node-jwa library,一个依赖节点-jws,它是node-jsonwebtoken的依赖。我在GitHub上引用了这个问题,正如您所看到的,该模块的作者能够重现该问题。如果你想测试,这是代码:
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的主要人员不再回复,我试图寻找一种解决方法,因为我真的不想永远坚持在Node 4中(不再是LTS)。 / p>
我试图找到修改node-jwa库的位置,以便它可以像Node 4一样在Node 8中签名。
似乎影响我的问题的行在这里的库=> github.com/brianloveswords/node-jwa/blob/master/index.js#L35
我试图做一些改变,但却无法完成这项工作......
如果你有任何好的解决方法,
非常感谢!