当有效负载存在时,下面的代码工作正常。但是当有效负载为空时,我会收到错误消息 “主体/有效负载丢失” 如何修复错误。我能够在 jwt.io 网站上验证令牌 具有“”空负载的示例 JWT 令牌
eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9..eoZhroqrfGu9P5dEeCceFZ8oG3XULvOS6vKUSp4dwO86p_DDy_blNSvez3QLQBgxmaL_VRXxPNXBpDKIc3FHa9vmbEligItW5mrtamAlt_NrvSu XBYMHJrUkc6GHamVHYF4-g7PrrgycevIFCmoquZY1bUr0gb0Foo50oPhcA5vO2DMso6PuevdFQ2NBH5uSdHterfClR1KjxUzguNm4a0FafMKj5oM6d1p4HVanUMyR8LJMduqrEuSfTPXxV_hVz2p YqxibQ3u9U2_BbHLt0Phmq8ENG_arxd0nY4VDnUq8WpydhR2Q8ilHEOQjG4tvkLrdstgwWJaMLJtzr-xAFw
import io.jsonwebtoken.*;
public static boolean verify(String jwtToken, String publicKeyString) throws Exception {
try {
byte[] publicKeyBytes = Base64.getDecoder().decode(publicKeyString
.replace("-----BEGIN PUBLIC KEY-----", "")
.replace("-----END PUBLIC KEY-----", "")
.replaceAll("\\s+", ""));
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKeyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(keySpec);
Jws<Claims> claimsJws = Jwts.parserBuilder()
.setSigningKey(publicKey)
.build()
.parseClaimsJws(jwtToken);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
由于签名是通过将函数应用于标头和有效负载的组合来生成的,因此对空有效负载进行签名会产生固定字符串,因此 JWT 变得无用且存在安全风险
我认为每个可用的库都假设有效负载是一个 json 对象(即使是空的)。用“{}”替换空字符串
在我看来,这种情况的解决方案很简单,因为它是一个
String
我的意思是 JWT
令牌,你总是可以做类似下一个的事情:
使用 String contains() 方法等等。
if(jwtToken.contains(".."))
{
System.out.println("JWT Token not contains payload");
}
因为当编码的 jwt 令牌中不存在有效负载时,我们会提供类似您提供的示例(
..
)