如何使用空负载验证 JWT 令牌

问题描述 投票:0回答:2

当有效负载存在时,下面的代码工作正常。但是当有效负载为空时,我会收到错误消息 “主体/有效负载丢失” 如何修复错误。我能够在 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;
        }
    }
java spring-boot oauth-2.0 jwt access-token
2个回答
0
投票

由于签名是通过将函数应用于标头和有效负载的组合来生成的,因此对空有效负载进行签名会产生固定字符串,因此 JWT 变得无用且存在安全风险

我认为每个可用的库都假设有效负载是一个 json 对象(即使是空的)。用“{}”替换空字符串


0
投票

在我看来,这种情况的解决方案很简单,因为它是一个

String
我的意思是
JWT
令牌,你总是可以做类似下一个的事情:

使用 String contains() 方法等等。

if(jwtToken.contains(".."))
{
    System.out.println("JWT Token not contains payload");
}

因为当编码的 jwt 令牌中不存在有效负载时,我们会提供类似您提供的示例(

..

© www.soinside.com 2019 - 2024. All rights reserved.