【问题标题】:jose4j JWT's claims set's attribute type other than string objectjose4j JWT 的声明集的属性类型不是字符串对象
【发布时间】:2020-01-11 21:31:13
【问题描述】:

我一直在使用 jose4j 0.6.0 版来生成 Json Web Token(JWT)。直到令牌生成,令牌验证,一切都很好。 JWT 的声明有效负载可以包含许多元素,例如版本、tokenId、颁发者、权限等。我正在传递 TokenPermissions 对象,它是 oneM2M 第 2 版规范中的标准对象,即

JwtClaims claims = new JwtClaims();
claims.setIssuer("DAS@ServiceProvider");  
claims.setAudience("CSE001"); //
.....
.........
TokenPermissions tokenPerms = new TokenPermissions();
TokenPermission tokenPerm = new TokenPermission();
tokenPerm.getResourceIDs().add("RXYZ");
tokenPerm.setPrivileges(setOfAcr);// setOfACr is another object on oneM2M    
tokenPerms.getPermission().add(tokenPerm);
claims.setClaim("permissions",tokenPerms);

上面的 sn-p 代码生成以下 JWT 声明集 {iss=DAS@ServiceProvider, aud=CSE001, exp=1508999613, jti=H1wm_yaOe61Co-wND7wBAw@DAS@CDOT-SP, iat=1508996013, nbf=1508995953, sub=subject, email=mail@example.com, groups=[ group-one, other-group, group-three], version=1.0.0, permissions=cdot.onem2m.resource.xsd.TokenPermissions@7f3b97fd}

token 的整体通过了签名和声明验证,但是我什么时候尝试通过错误将 typecast 权限属性传递给 TokenPermissions。

tokenPermsObject =     jwtClaims.getClaimValue("permissions",TokenPermissions.class);

它通过以下错误: org.jose4j.jwt.MalformedClaimException:“权限”声明的值不是预期的类型(xyz.xsd.TokenPermissions@7f3b97fd - 无法将 java.lang.String 转换为 xyz.xsd.TokenPermissions.TokenPermissions)

可以在 jose4j JWT 中传递什么类型的声明对象,我是否必须强制在声明集中传递文本。任何帮助将不胜感激。

【问题讨论】:

    标签: jwt jose4j onem2m


    【解决方案1】:

    jose4j 的 JSON 处理源自 JSON.simple 工具包,它在 JSON 和 Java 对象之间转换的方式相当基础。它将处理字符串、数字、布尔值、映射和列表。

    如果您想要/需要使用更复杂的 JSON 库,您可以在创建 JWT 时在 JsonWebSignature 上使用 setPayload(...),并为其提供您在其他地方生成的 JSON 字符串。在使用 JWT 时,JwtClaims 上的 String getRawJson() 将为您提供 JSON 字符串有效负载,您可以将其移交给其他一些库。

    【讨论】:

    • 感谢 Brain 的回复和帮助,我还尝试在发送方端序列化复杂的 java 对象并将其反序列化回接收端。你知道为什么 Jose4J 不支持 Json 序列化吗?他们有计划在未来的版本中支持吗?
    猜你喜欢
    • 2020-01-07
    • 1970-01-01
    • 2012-11-26
    • 2020-04-23
    • 2022-01-15
    • 2016-08-11
    • 2015-07-07
    • 1970-01-01
    • 2016-12-09
    相关资源
    最近更新 更多