Skip to content

Commit df5a0f8

Browse files
committed
accessTokenHttpResponseConverter and errorHttpResponseConverter allows custom
1 parent 5251eea commit df5a0f8

File tree

3 files changed

+67
-2
lines changed

3 files changed

+67
-2
lines changed

oauth2-authorization-server/src/main/java/org/springframework/security/oauth2/server/authorization/config/annotation/web/configurers/OAuth2TokenEndpointConfigurer.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import jakarta.servlet.http.HttpServletRequest;
2323

2424
import org.springframework.http.HttpMethod;
25+
import org.springframework.http.converter.HttpMessageConverter;
2526
import org.springframework.security.authentication.AuthenticationManager;
2627
import org.springframework.security.authentication.AuthenticationProvider;
2728
import org.springframework.security.config.annotation.ObjectPostProcessor;
@@ -65,6 +66,8 @@ public final class OAuth2TokenEndpointConfigurer extends AbstractOAuth2Configure
6566
private Consumer<List<AuthenticationConverter>> accessTokenRequestConvertersConsumer = (accessTokenRequestConverters) -> {};
6667
private final List<AuthenticationProvider> authenticationProviders = new ArrayList<>();
6768
private Consumer<List<AuthenticationProvider>> authenticationProvidersConsumer = (authenticationProviders) -> {};
69+
private HttpMessageConverter<OAuth2AccessTokenResponse> accessTokenHttpResponseConverter;
70+
private HttpMessageConverter<OAuth2Error> errorHttpResponseConverter;
6871
private AuthenticationSuccessHandler accessTokenResponseHandler;
6972
private AuthenticationFailureHandler errorResponseHandler;
7073

@@ -132,6 +135,26 @@ public OAuth2TokenEndpointConfigurer authenticationProviders(
132135
return this;
133136
}
134137

138+
/**
139+
* Sets the {@link HttpMessageConverter} used for building a custom the response body from {@link OAuth2AccessTokenResponse}.
140+
*
141+
* @param accessTokenHttpResponseConverter the {@link HttpMessageConverter} used for building a custom the response body from {@link OAuth2AccessTokenResponse}
142+
*/
143+
public OAuth2TokenEndpointConfigurer accessTokenHttpResponseConverter(HttpMessageConverter<OAuth2AccessTokenResponse> accessTokenHttpResponseConverter) {
144+
this.accessTokenHttpResponseConverter = accessTokenHttpResponseConverter;
145+
return this;
146+
}
147+
148+
/**
149+
* Sets the {@link HttpMessageConverter} used for building a custom the response body from {@link OAuth2Error}.
150+
*
151+
* @param errorHttpResponseConverter the {@link HttpMessageConverter} used for building a custom the response body from {@link OAuth2Error}
152+
*/
153+
public OAuth2TokenEndpointConfigurer errorHttpResponseConverter(HttpMessageConverter<OAuth2Error> errorHttpResponseConverter) {
154+
this.errorHttpResponseConverter = errorHttpResponseConverter;
155+
return this;
156+
}
157+
135158
/**
136159
* Sets the {@link AuthenticationSuccessHandler} used for handling an {@link OAuth2AccessTokenAuthenticationToken}
137160
* and returning the {@link OAuth2AccessTokenResponse Access Token Response}.
@@ -187,6 +210,12 @@ void configure(HttpSecurity httpSecurity) {
187210
this.accessTokenRequestConvertersConsumer.accept(authenticationConverters);
188211
tokenEndpointFilter.setAuthenticationConverter(
189212
new DelegatingAuthenticationConverter(authenticationConverters));
213+
if (this.accessTokenHttpResponseConverter != null) {
214+
tokenEndpointFilter.setAccessTokenHttpResponseConverter(this.accessTokenHttpResponseConverter);
215+
}
216+
if (this.errorHttpResponseConverter != null) {
217+
tokenEndpointFilter.setErrorHttpResponseConverter(this.errorHttpResponseConverter);
218+
}
190219
if (this.accessTokenResponseHandler != null) {
191220
tokenEndpointFilter.setAuthenticationSuccessHandler(this.accessTokenResponseHandler);
192221
}

oauth2-authorization-server/src/main/java/org/springframework/security/oauth2/server/authorization/web/OAuth2TokenEndpointFilter.java

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@
8686
* @author Joe Grandja
8787
* @author Madhu Bhat
8888
* @author Daniel Garnier-Moiroux
89+
* @author luamas
8990
* @since 0.0.1
9091
* @see AuthenticationManager
9192
* @see OAuth2AuthorizationCodeAuthenticationProvider
@@ -102,9 +103,9 @@ public final class OAuth2TokenEndpointFilter extends OncePerRequestFilter {
102103
private static final String DEFAULT_ERROR_URI = "https://datatracker.ietf.org/doc/html/rfc6749#section-5.2";
103104
private final AuthenticationManager authenticationManager;
104105
private final RequestMatcher tokenEndpointMatcher;
105-
private final HttpMessageConverter<OAuth2AccessTokenResponse> accessTokenHttpResponseConverter =
106+
private HttpMessageConverter<OAuth2AccessTokenResponse> accessTokenHttpResponseConverter =
106107
new OAuth2AccessTokenResponseHttpMessageConverter();
107-
private final HttpMessageConverter<OAuth2Error> errorHttpResponseConverter =
108+
private HttpMessageConverter<OAuth2Error> errorHttpResponseConverter =
108109
new OAuth2ErrorHttpMessageConverter();
109110
private AuthenticationDetailsSource<HttpServletRequest, ?> authenticationDetailsSource =
110111
new WebAuthenticationDetailsSource();
@@ -175,6 +176,26 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse
175176
}
176177
}
177178

179+
/**
180+
* Sets the {@link HttpMessageConverter} used for building a custom the response body from {@link OAuth2AccessTokenResponse}.
181+
*
182+
* @param accessTokenHttpResponseConverter the {@link HttpMessageConverter} used for building a custom the response body from {@link OAuth2AccessTokenResponse}
183+
*/
184+
public void setAccessTokenHttpResponseConverter(HttpMessageConverter<OAuth2AccessTokenResponse> accessTokenHttpResponseConverter) {
185+
Assert.notNull(accessTokenHttpResponseConverter, "accessTokenHttpResponseConverter cannot be null");
186+
this.accessTokenHttpResponseConverter = accessTokenHttpResponseConverter;
187+
}
188+
189+
/**
190+
* Sets the {@link HttpMessageConverter} used for building a custom the response body from {@link OAuth2Error}.
191+
*
192+
* @param errorHttpResponseConverter the {@link HttpMessageConverter} used for building a custom the response body from {@link OAuth2Error}
193+
*/
194+
public void setErrorHttpResponseConverter(HttpMessageConverter<OAuth2Error> errorHttpResponseConverter) {
195+
Assert.notNull(errorHttpResponseConverter, "errorHttpResponseConverter cannot be null");
196+
this.errorHttpResponseConverter = errorHttpResponseConverter;
197+
}
198+
178199
/**
179200
* Sets the {@link AuthenticationDetailsSource} used for building an authentication details instance from {@link HttpServletRequest}.
180201
*

oauth2-authorization-server/src/test/java/org/springframework/security/oauth2/server/authorization/web/OAuth2TokenEndpointFilterTests.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,21 @@ public void constructorWhenTokenEndpointUriNullThenThrowIllegalArgumentException
117117
.hasMessage("tokenEndpointUri cannot be empty");
118118
}
119119

120+
@Test
121+
public void setAccessTokenHttpResponseConverterWhenNullThenThrowIllegalArgumentException() {
122+
assertThatThrownBy(() -> this.filter.setAccessTokenHttpResponseConverter(null))
123+
.isInstanceOf(IllegalArgumentException.class)
124+
.hasMessage("accessTokenHttpResponseConverter cannot be null");
125+
}
126+
127+
@Test
128+
public void setErrorHttpResponseConverterWhenNullThenThrowIllegalArgumentException() {
129+
assertThatThrownBy(() -> this.filter.setErrorHttpResponseConverter(null))
130+
.isInstanceOf(IllegalArgumentException.class)
131+
.hasMessage("errorHttpResponseConverter cannot be null");
132+
}
133+
134+
120135
@Test
121136
public void setAuthenticationDetailsSourceWhenNullThenThrowIllegalArgumentException() {
122137
assertThatThrownBy(() -> this.filter.setAuthenticationDetailsSource(null))

0 commit comments

Comments
 (0)