【问题标题】:Using ByteBuffer as a JWT claim使用 ByteBuffer 作为 JWT 声明
【发布时间】:2018-06-02 07:11:52
【问题描述】:

我正在使用 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 吗?还是我做错了什么?

任何帮助将不胜感激。

【问题讨论】:

  • claims.get("myObject") 正在返回 JSONObject 对象,但您将其转换为 ByteBuffer。尝试获取它 JSONObjectencryptedText = (JSONObject) claims.get("myObject"); 并查看 JSONObject 包含的内容。

标签: java json jwt


【解决方案1】:

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)

【讨论】:

  • 不要使用DataTypeConverter。使用java.util.Base64
【解决方案2】:

这个答案有帮助。这是我为使代码正常工作所做的修改:

    ByteBuffer encryptedText = getEncryptedTextAsByteBuffer();
    String encodedText = Base64.getEncoder().encodeToString(encryptedText .array());
    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", );

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

验证部分更改为:

    PlainJWT jwtToken = PlainJWT.parse(jwtToken);
    ReadOnlyJWTClaimsSet claimsSet = jwtToken.getJWTClaimsSet();
    String claim = (String)claimsSet.getClaim("myObject");
    byte[] emailBinary = Base64.getDecoder().decode(claim);

【讨论】:

    猜你喜欢
    • 2021-04-30
    • 2015-01-31
    • 1970-01-01
    • 1970-01-01
    • 2015-05-08
    • 2016-08-11
    • 1970-01-01
    • 2018-05-08
    • 2019-07-18
    相关资源
    最近更新 更多