我无法使用jose4j从JWT访问嵌套声明。我有一个JWT,其声明集如下:
{
"iss": "awesome.issuer",
"iat": 1300819370,
"exp": 1300819380,
"clm": "string claim",
"sub": "batman",
"context": {
"username": "mpdavis",
"firstName": "Michael",
"lastName": "Davis
}
}
当我尝试访问context
声明中的嵌套声明时,我遇到了问题。我可以使用getClaimValue
轻松访问顶级声明。
private String qsh;
qsh = jwtClaims.getClaimValue("qsh", String.class);
如果我想获得嵌套声明,似乎我有两个选择。
第一个选项是找到一种方法将context
声明作为Map<String,Object>
返回,并将每个声明从该对象中拉出来。另一种方法是使用flattenClaims
将所有声明展平为Map<String,List<Object>>
,并从地图中抓取第一个对象以获取嵌套声明。
如果授予这些JWT的服务非常多地改变了架构,那么这些选项中的任何一个都不会特别有弹性。
有更好的方法吗?
答案 0 :(得分:2)
关于正确的。
您可以将声明值作为地图获取,并像这样访问其内容(或迭代它)。
@SuppressWarnings("unchecked")
Map<String,String> context = claims.getClaimValue("context", Map.class);
String username = context.get("username");
String firstName = context.get("firstName");
使用flattenClaims
可能如下所示:
Map<String,List<Object>> flattened = claims.flattenClaims();
String username = (String)flattened.get("context.username").iterator().next();
String firstName = (String)flattened.get("context.firstName").iterator().next();
或者您可以迭代整个事物并将其转换为适合您的应用程序的任何数据结构。
您可以通过isClaimValueOfType(...)
和hasClaim(...)
以及类似JwtClaims
之类的内容,使声明JSON中的更改更具弹性。
或者您也可以在getRawJson()
上使用JwtClaims
,并根据需要将JSON传递给您选择的JSON处理器。