oauth2.0 如何验证具有空有效负载的JWT令牌

ebdffaop  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(172)

下面的代码在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;
        }
    }

字符串

a0x5cqrl

a0x5cqrl1#

您共享的令牌是一个JWS,即数字签名的JWT。数字签名是使用头部和有效载荷计算的。
分离的有效载荷并不常见,但仍然有效。在RFC 7515的附录F中提到。当有效载荷大小太大而无法通过HTTP请求传输时,这非常有用。它通过规范范围之外的其他方式发送。当与跳过Base64 URl Safe编码的RFC7797组合时,此行为更有用。
但在所有情况下,应提供所有部分(报头、有效载荷和签名)用于签名验证。
这就是为什么我们不明白你期望通过剥离有效载荷。它是强制性的,以提供这些部分(未经篡改)验证令牌,否则它无疑会失败。

oxcyiej7

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类

相关问题