From c0811fa13b02883166630d299bc48a21640cef55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arnaud=20Cogolu=C3=A8gnes?= Date: Thu, 23 Feb 2023 14:12:08 +0100 Subject: [PATCH] Remove hard dependency on Jackson in OAuth 2 support It's possible to override the token parsing method, to avoid using Jackson, but the class would have a Jackson mapper in its properties. This commit introduces an abstraction to parse the token and the default Jackson implementation is instantianted on the fly. --- ...ntCredentialsGrantCredentialsProvider.java | 33 +++++++++++++------ 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/rabbitmq/client/impl/OAuth2ClientCredentialsGrantCredentialsProvider.java b/src/main/java/com/rabbitmq/client/impl/OAuth2ClientCredentialsGrantCredentialsProvider.java index a76fb81dfd..3d6c699baa 100644 --- a/src/main/java/com/rabbitmq/client/impl/OAuth2ClientCredentialsGrantCredentialsProvider.java +++ b/src/main/java/com/rabbitmq/client/impl/OAuth2ClientCredentialsGrantCredentialsProvider.java @@ -18,6 +18,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.rabbitmq.client.TrustEverythingTrustManager; +import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Function; import javax.net.ssl.*; import java.io.*; import java.net.HttpURLConnection; @@ -72,7 +74,7 @@ public class OAuth2ClientCredentialsGrantCredentialsProvider extends RefreshProt private final Map parameters; - private final ObjectMapper objectMapper = new ObjectMapper(); + private final AtomicReference> tokenExtractor = new AtomicReference<>(); private final String id; @@ -214,14 +216,8 @@ protected String usernameFromToken(Token token) { } protected Token parseToken(String response) { - try { - Map map = objectMapper.readValue(response, Map.class); - int expiresIn = ((Number) map.get("expires_in")).intValue(); - Instant receivedAt = Instant.now(); - return new Token(map.get("access_token").toString(), expiresIn, receivedAt); - } catch (IOException e) { - throw new OAuthTokenManagementException("Error while parsing OAuth 2 token", e); - } + return this.tokenExtractor.updateAndGet(current -> + current == null ? new JacksonTokenLookup() : current).apply(response); } @Override @@ -595,4 +591,21 @@ private SSLSocketFactory sslSocketFactory() { } } -} + + private static class JacksonTokenLookup implements Function { + + private final ObjectMapper objectMapper = new ObjectMapper(); + + @Override + public Token apply(String response) { + try { + Map map = objectMapper.readValue(response, Map.class); + int expiresIn = ((Number) map.get("expires_in")).intValue(); + Instant receivedAt = Instant.now(); + return new Token(map.get("access_token").toString(), expiresIn, receivedAt); + } catch (IOException e) { + throw new OAuthTokenManagementException("Error while parsing OAuth 2 token", e); + } + } + } +} \ No newline at end of file