web-dev-qa-db-ja.com

Spring Framework-カスタムクレームのJWTを解析する場所

Spring JWT承認アプリケーションを作成しました。 JWTにはいくつかのカスタムクレームが含まれています。リソースサーバー側では、これらの要求を収集および確認するためにJWTトークンをどこで解析する必要があるのでしょうか。これをコントローラーまたはフィルターで行う必要がありますか?ベストプラクティスは何ですか?多分あなたはいくつかの例がありますか?

9
dplesa

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行目にデバッグとブレークポイントを設定することをお勧めします。その時点で、認証オブジェクトを公開します。後で必要になる詳細情報があるかもしれません。

これはすべてコントローラーで行うことができます。フィルターを使用してこれを行う方法がわかりません。

9
Chillz

また、springframework.boot.json.JsonParserを使用することもできます。

JsonParser parser = JsonParserFactory.getJsonParser();
Map<String, ?> tokenData = parser.parseMap(JwtHelper.decode(token).getClaims());

> tokenData.get("VALID_KEY");
2
Lucas

私はこれを使っています:

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;
    }
}
0
Stephen Paul