JSON Web Tokens - jwt.io のJSON読込みについて、、、
デコードしたJWT の getClaims() が返す Mapが、Claimインスタンスのマップであるが、 この Claimインスタンスは、隠されたクラス com.auth0.jwt.impl.JsonNodeClaim である。 この JsonNodeClaim が値を格納するフィールドが、
private final JsonNode data であり
これを直接参照することは許されていない。
値が、double か、整数の long / int のJSONなのかを見極めるためには、 Jackson のJSONノード解析が必要だ。
先日のJsonNodeParse
Jackson JSON読込み、key-value 解析を柔軟にする - Oboe吹きプログラマの黙示録
に以下を追加する。
public Stream<Entry<String, Object>> jsonStream(String path, JsonNode node){ Stream.Builder<Entry<String, Object>> builder = Stream.builder(); parseJson(node, path, builder); return builder.build(); } public void readJson(JsonNode node, String path, BiConsumer<String, Object> con){ parseJson(node, path, con); }
さらに、、隠されたクラス com.auth0.jwt.impl.JsonNodeClaim の参照の為に、以下メソッドを用意する。
かなり強引なメソッドだ。
public static JsonNode claimToJsonNode(Claim cliam) { JsonNode node = null; try{ Field fd = cliam.getClass().getDeclaredField("data"); fd.setAccessible(true); Object o = fd.get(cliam); node = (JsonNode)o; }catch(NoSuchFieldException e){ throw new RuntimeException(e); }catch(SecurityException e){ throw new RuntimeException(e); }catch(IllegalArgumentException e){ throw new RuntimeException(e); }catch(IllegalAccessException e){ throw new RuntimeException(e); } return node; }
上記メソッドとメソッド追加したJsonNodeParse を利用して、
JWTのトークンは、以下のように、Streamで値参照の処理を書くことができる。
DecodedJWT jwt = JWT.decode(token); Map<String, Claim> map = jwt.getClaims(); map.entrySet().stream() .flatMap(e->jp.jsonStream("."+e.getKey(), claimToJsonNode(e.getValue()))) .forEach(e->{ // TODO e.getKey() = JSONパス、 e.getValue() = JSON の値Object });
pom.xml は、、、
<dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId> <version>3.15.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.12.3</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.12.3</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.12.3</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jsr310</artifactId> <version>2.12.3</version> </dependency>