Node.js nodejs jsonwebtoken使用某些令牌验证错误

Node.js nodejs jsonwebtoken使用某些令牌验证错误,node.js,jwt,json-web-token,Node.js,Jwt,Json Web Token,我有一个java服务,它生成用RS256签名的json web令牌。 然后,节点中的服务使用jsonwebtoken模块使用公钥验证令牌 问题是有些令牌有效,有些则无效。根据jwt.io,每个令牌都是正确的 这是一个示例代码,其中一个正常,一个失败 var sanitize = function(data){ return data.replace(/\+/g, '-').replace(/\//g, '_').replace(/=*$/g, '') } var jwtGood = sani

我有一个java服务,它生成用RS256签名的json web令牌。 然后,节点中的服务使用jsonwebtoken模块使用公钥验证令牌

问题是有些令牌有效,有些则无效。根据jwt.io,每个令牌都是正确的

这是一个示例代码,其中一个正常,一个失败

var sanitize = function(data){
  return data.replace(/\+/g, '-').replace(/\//g, '_').replace(/=*$/g, '')
}
var jwtGood = sanitize("eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJ1c2VybmFtZSI6InBlbGF5by11c2VybmFtZTMiLCJlbWFpbCI6InBlbGF5by5yYW1vbisxMkBjbG91ZGRpc3RyaWN0LmNvbSIsInJvbGVzIjpbIlJPTEVfVVNFUiJdLCJpZCI6InVhb2V1YW9lb2FldTMiLCJpYXQiOjE0NTYxNDkwMjR9.tmvgtpuyuUiql2aYeR38kGTeQUwyb7XZr6Df2iv09_nxDn4HltHZm7Fvbj07ZQ5Hh_DmvlqZHz7EVSV6mERdjkohxf8tt9-J6NW_ftnUurCfLIzCcqEJ4xlKOzIgGsGrRd4ZUhw2hs4ZNTIscUb37csvKV-jPdSdQ-TxzuWZen4QnEUGvyg0VhdlU90TGZmpzobfpbHMQ3C0qhGRDMjghgej8zjWHbRDFRIGtAHLDbYVMiQRdI_GODIco2uSVh0_9PATSeRhFosHf3P3R4ohyBMrn9rxmBW4bQyFEMXWtsl4_PrKsdsaTtKjVQ2YuL5GjKQJqkWp6vx2vIxRabHz7w==");
var jwtBad  = sanitize("eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJ1c2VybmFtZSI6InBlbGF5by11c2VybmFtZSIsImVtYWlsIjpudWxsLCJyb2xlcyI6WyJST0xFX1VTRVIiXSwiaWQiOm51bGwsImlhdCI6MTQ1NjMwMTUwN30=.X_vogPRHoE-ws2DxB8Q3wlm5JCQdOvuedhUC-1BlGa9qPdg5nmAGLoLuuGmQZ9r2yUD45OqKQ8_PVd05b0gQBhlIIWtQsXMSWypN6o43noZqMG6aM-GeAK-edDg2C7zw0yGQDD1BNLKBeWc8lNPzJAqQV0il_lg6bytIeN2LMAgxj78RZro3snkXN4woe6afCefW78z3KiOIQ2qI3pcA6Kf4j9NErHwfe9BP2dnV3mXTOZ8SIds_C9JWb7nt9o6Z4oCpskmXxhRCpP4ptTS0krGKfzfhYMKj2e7uOwS1pV4MdpQBeLlhZaGn3pmG5kwl3ZzEeIANfE7N8a9LofmFsQ==");

var jsonwebtoken = require('jsonwebtoken');
var fs = require('fs');

var pubKey = fs.readFileSync('public.pem');

console.log(jwtGood);
jsonwebtoken.verify(jwtGood, pubKey,{ algorithms: ['RS256'] },function(err, decoded){
  console.log(err,decoded);
});

console.log(jwtBad);
jsonwebtoken.verify(jwtBad, pubKey,{ algorithms: ['RS256'] },function(err, decoded){
  console.log(err,decoded);
});
仅通过查看它们的主要区别就是编码负载末尾的“=”字符。工作一个有效载荷以“MjR9”结尾,失败一个以“wN30=”结尾

手动删除了“=”(正如我对结尾部分所做的那样),但是根据jwt.io,没有它,令牌就无法验证

尝试了更多的消毒功能,但都不起作用


我猜这里有一个base64编码问题,但我找不到。

为什么要对它们进行消毒?我正在使用jwt简单节点模块,我只是将编码的令牌(没有任何修改)放入cookie中,当它返回时,我获取cookie内容并直接解码它。效果很好。需要删除结尾“==”。令牌在离开时未进行验证。通过在jwt.io中创建令牌注意到,它们的令牌不包含结尾“==”,该结尾来自于填充最后4个字符块的base64编码。此外,sanitize还会更改要进行url编码的令牌的一些字符。前2个替换可以删除,不会影响结果,因为示例令牌中没有“+”或“/”。切换到jwt simple,工作起来像个符咒,但我不喜欢它强制执行的try-catch代码。当有人提出一个“真正的”解决方案时,我把这个问题留着。