Skip to content

Commit 26e2f34

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

File tree

3 files changed

+66
-2
lines changed

3 files changed

+66
-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: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,9 +102,9 @@ public final class OAuth2TokenEndpointFilter extends OncePerRequestFilter {
102102
private static final String DEFAULT_ERROR_URI = "https://datatracker.ietf.org/doc/html/rfc6749#section-5.2";
103103
private final AuthenticationManager authenticationManager;
104104
private final RequestMatcher tokenEndpointMatcher;
105-
private final HttpMessageConverter<OAuth2AccessTokenResponse> accessTokenHttpResponseConverter =
105+
private HttpMessageConverter<OAuth2AccessTokenResponse> accessTokenHttpResponseConverter =
106106
new OAuth2AccessTokenResponseHttpMessageConverter();
107-
private final HttpMessageConverter<OAuth2Error> errorHttpResponseConverter =
107+
private HttpMessageConverter<OAuth2Error> errorHttpResponseConverter =
108108
new OAuth2ErrorHttpMessageConverter();
109109
private AuthenticationDetailsSource<HttpServletRequest, ?> authenticationDetailsSource =
110110
new WebAuthenticationDetailsSource();
@@ -175,6 +175,26 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse
175175
}
176176
}
177177

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

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)