下面的代码在payload存在时工作正常。但是当payload为空时,我得到错误**"Body/Payload is missing"**如何修复错误。我能够在www.example.com网站上验证令牌示例JWT令牌"" empty payload
eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9..eoZhroqrfGu9P5dEeCceFZ8oG3XUlvOS6 vKUSp4dwO86p_DDy_blNSvez3QLQBgxmaL_VRXxPNXBpDKIc3FHa9vmb EligItW5mrtamAlt_B1@rvSuXBYMhJrUKc6GHamVHYF4-g7PrrgycevIFCmoquZY1bUr0gb0Foo50oPhcA5vO2DMso6Puevd2NBH5uSdHteRfClR1KjxUzguNm4a0FafMKj5oM6d1p4HVanUMyR8LJMduqrEuSfTPXxV_@Vz2pYqxibQ3u9U2_BbHLt0Phmq8ENG_arxd0nY4VDnUq8WpydhR2Q8ilHEOQjG4tvkLrd@gwWJaMLJtzr-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;
}
}
字符串
2条答案
按热度按时间a0x5cqrl1#
您共享的令牌是一个JWS,即数字签名的JWT。数字签名是使用头部和有效载荷计算的。
分离的有效载荷并不常见,但仍然有效。在RFC 7515的附录F中提到。当有效载荷大小太大而无法通过HTTP请求传输时,这非常有用。它通过规范范围之外的其他方式发送。当与跳过Base64 URl Safe编码的RFC7797组合时,此行为更有用。
但在所有情况下,应提供所有部分(报头、有效载荷和签名)用于签名验证。
这就是为什么我们不明白你期望通过剥离有效载荷。它是强制性的,以提供这些部分(未经篡改)验证令牌,否则它无疑会失败。
oxcyiej72#
从技术上讲,您提供的示例令牌不是JWT:JWT将有效负载定义为JSON。在您的情况下,有效负载为空,这可能被视为无效的JSON。因此JWT例程可能无法验证令牌。
然而,你可以做的是把它当作一个JWS(JSON Web Signature),它是JWT的超集,可以嵌入不透明的内容,比如你在这里提供的有效负载。显然jwt.io能够验证JWS和JWT。
快速搜索显示,io.jsonwebtoken似乎确实支持“原始”JWS和JWTS,参见例如:https://javadoc.io/doc/io.jsonwebtoken/jjwt/0.9.1/io/jsonwebtoken/Jws.html
B -JWS主体内容的类型,String或Claims示例。
所以你应该/也许可以使用JWS类