我正在使用JWT令牌,但我声称其中之一是ByteBuffer。 JWT已成功生成,但是当我尝试解析JWT令牌并验证索赔时,它会抱怨ClaimSet没有值。

这是我的代码的外观:

        ByteBuffer encryptedText = getEncryptedTextAsByteBuffer();

        Instant timestamp = timestampSupplier.get();
        JWTClaimsSet claimsSet = new JWTClaimsSet();
        claimsSet.setAudience("test-audience");
        claimsSet.setIssuer("test-issuer");
        claimsSet.setNotBeforeTime(Date.from(timestamp));
        claimsSet.setExpirationTime(Date.from(Instant.ofEpochSecond(expirationTimestamp)));
        claimsSet.setClaim("myObject", encryptedText );

        PlainJWT jwt = new PlainJWT(claimsSet);
        return jwt.serialize();


验证码如下所示:

        PlainJWT jwtToken = PlainJWT.parse(jwtToken);
        ReadOnlyJWTClaimsSet claimsSet = jwtToken.getJWTClaimsSet();
        Map<String, Object> claims = claimsSet.getAllClaims();
        ByteBuffer encryptedText = (ByteBuffer) claims.get("myObject");


我看到的异常消息是这样的:

java.lang.ClassCastException: net.minidev.json.JSONObject cannot be cast to java.nio.ByteBuffer


我添加了一个调试器,发现Jwt代具有有效的非空ByteBuffer,但最终的声明具有“ myObject”键,但该值是空的json字符串。我们不能将声明用作byteBuffer吗?还是我做错了什么?

任何帮助,将不胜感激。

最佳答案

ByteBuffer包含二进制数据,但JSON是文本格式。您需要将基础字节数组编码为base64,并将其作为JWT的声明包括在内

我是ByteBuffer的新手,所以我回顾了javadoc看看它是如何工作的。请尝试这个

// ByteBuffer to base64
 byte[] data = new byte[encryptedText.remaining()]
 encryptedText.get(data);
 String dataB64 = DataTypeConverter.printBase64Binary(data);

 //Add claim
 claimsSet.setClaim("myObject", dataB64);


要对其进行验证,请从base64转换为byte []。我认为在这种情况下,不需要ByteBuffer,但是可以从byte []构建它

 String dataB64 = (String) claims.get("myObject");
 byte data[] = DataTypeConverter.parseBase64Binary(dataB64)

关于java - 使用ByteBuffer作为JWT声明,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47893942/

10-12 05:05