我正在使用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/