2

我无法使用 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声明作为 a返回Map<String,Object>并将每个声明从该对象中提取出来。另一个选项是使用flattenClaims将所有声明展平为 aMap<String,List<Object>>并从地图中抓取第一个对象以用于嵌套声明。

如果授予这些 JWT 的服务对架构进行了很大的更改,那么这些选项中的任何一个都不会显得特别有弹性。

有没有更好的办法?

4

1 回答 1

3

这差不多。

您可以将声明值作为 Map 获取并像这样访问其内容(或对其进行迭代)。

@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();

或者您可以迭代整个事物并将其转换为对您的应用程序有意义的任何数据结构。

您可能会使用 和 之类的东西使事情对声明 JSON 中的变化isClaimValueOfType(...)更具hasClaim(...)弹性JwtClaims

或者,如果需要,您也可以使用getRawJson()onJwtClaims并将 JSON 传递给您选择的 JSON 处理器。

于 2016-04-20T19:53:00.143 回答