Spring JWT承認アプリケーションを作成しました。 JWTにはいくつかのカスタムクレームが含まれています。リソースサーバー側では、これらの要求を収集および確認するためにJWTトークンをどこで解析する必要があるのでしょうか。これをコントローラーまたはフィルターで行う必要がありますか?ベストプラクティスは何ですか?多分あなたはいくつかの例がありますか?
Jackson Object MapperとSpring Securityクラスの組み合わせ、つまりJwt、JwtHelper、Authenticationを使用できます。 Spring Securityの静的コンテキストオブジェクトを使用して認証を取得し、JwtHelperを使用して受信したトークンを解析できます。
ObjectMapper objectMapper = new ObjectMapper();
Authentication authentication =
SecurityContextHolder.getContext().getAuthentication();
Map<String, Object> map =
objectMapper.convertValue(authentication.getDetails(), Map.class);
// create a token object to represent the token that is in use.
Jwt jwt = JwtHelper.decode((String) map.get("tokenValue"));
// jwt.getClaims() will return a JSON object of all the claims in your token
// Convert claims JSON object into a Map so we can get the value of a field
Map<String, Object> claims = objectMapper.readValue(jwt.getClaims(), Map.class);
String customField = (String) claims.get("you_custom_field_name");
上記のコードの3行目にデバッグとブレークポイントを設定することをお勧めします。その時点で、認証オブジェクトを公開します。後で必要になる詳細情報があるかもしれません。
これはすべてコントローラーで行うことができます。フィルターを使用してこれを行う方法がわかりません。
また、springframework.boot.json.JsonParserを使用することもできます。
JsonParser parser = JsonParserFactory.getJsonParser();
Map<String, ?> tokenData = parser.parseMap(JwtHelper.decode(token).getClaims());
> tokenData.get("VALID_KEY");
私はこれを使っています:
private Claim getClaim(String claimKey) {
Authentication token = SecurityContextHolder.getContext().getAuthentication();
try {
DecodedJWT jwt = JWT.decode(token.getCredentials().toString());
return jwt.getClaim(claimKey);
} catch (JWTVerificationException ex) {
ex.printStackTrace();
return null;
}
}