Skip to content

Commit 0ec5d24

Browse files
authored
Merge pull request eugenp#5768 from Doha2012/master
customize oauth2 requests
2 parents 74d250b + 777b9ec commit 0ec5d24

File tree

5 files changed

+162
-4
lines changed

5 files changed

+162
-4
lines changed

spring-5-security-oauth/pom.xml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
</dependency>
3232
<dependency>
3333
<groupId>org.thymeleaf.extras</groupId>
34-
<artifactId>thymeleaf-extras-springsecurity4</artifactId>
34+
<artifactId>thymeleaf-extras-springsecurity5</artifactId>
3535
</dependency>
3636

3737
<!-- oauth2 -->
@@ -66,7 +66,8 @@
6666
</dependencies>
6767

6868
<properties>
69-
<oauth-auto.version>2.0.1.RELEASE</oauth-auto.version>
69+
<spring-boot.version>2.1.0.RELEASE</spring-boot.version>
70+
<oauth-auto.version>2.1.0.RELEASE</oauth-auto.version>
7071
<start-class>com.baeldung.oauth2.SpringOAuthApplication</start-class>
7172
</properties>
7273

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package com.baeldung.oauth2;
2+
3+
import java.util.HashMap;
4+
import java.util.Map;
5+
6+
import javax.servlet.http.HttpServletRequest;
7+
8+
import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository;
9+
import org.springframework.security.oauth2.client.web.DefaultOAuth2AuthorizationRequestResolver;
10+
import org.springframework.security.oauth2.client.web.OAuth2AuthorizationRequestResolver;
11+
import org.springframework.security.oauth2.core.endpoint.OAuth2AuthorizationRequest;
12+
13+
public class CustomAuthorizationRequestResolver implements OAuth2AuthorizationRequestResolver {
14+
15+
private OAuth2AuthorizationRequestResolver defaultResolver;
16+
17+
public CustomAuthorizationRequestResolver(ClientRegistrationRepository repo, String authorizationRequestBaseUri){
18+
defaultResolver = new DefaultOAuth2AuthorizationRequestResolver(repo, authorizationRequestBaseUri);
19+
}
20+
21+
@Override
22+
public OAuth2AuthorizationRequest resolve(HttpServletRequest request) {
23+
OAuth2AuthorizationRequest req = defaultResolver.resolve(request);
24+
if(req != null){
25+
req = customizeAuthorizationRequest(req);
26+
}
27+
return req;
28+
}
29+
30+
@Override
31+
public OAuth2AuthorizationRequest resolve(HttpServletRequest request, String clientRegistrationId) {
32+
OAuth2AuthorizationRequest req = defaultResolver.resolve(request, clientRegistrationId);
33+
if(req != null){
34+
req = customizeAuthorizationRequest(req);
35+
}
36+
return req;
37+
}
38+
39+
private OAuth2AuthorizationRequest customizeAuthorizationRequest(OAuth2AuthorizationRequest req) {
40+
Map<String,Object> extraParams = new HashMap<String,Object>();
41+
extraParams.putAll(req.getAdditionalParameters()); //VIP note
42+
extraParams.put("test", "extra");
43+
System.out.println("here =====================");
44+
return OAuth2AuthorizationRequest.from(req).additionalParameters(extraParams).build();
45+
}
46+
47+
private OAuth2AuthorizationRequest customizeAuthorizationRequest1(OAuth2AuthorizationRequest req) {
48+
return OAuth2AuthorizationRequest.from(req).state("xyz").build();
49+
}
50+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.baeldung.oauth2;
2+
3+
import org.springframework.core.convert.converter.Converter;
4+
import org.springframework.http.RequestEntity;
5+
import org.springframework.security.oauth2.client.endpoint.OAuth2AuthorizationCodeGrantRequest;
6+
import org.springframework.security.oauth2.client.endpoint.OAuth2AuthorizationCodeGrantRequestEntityConverter;
7+
import org.springframework.util.MultiValueMap;
8+
9+
public class CustomRequestEntityConverter implements Converter<OAuth2AuthorizationCodeGrantRequest, RequestEntity<?>> {
10+
11+
private OAuth2AuthorizationCodeGrantRequestEntityConverter defaultConverter;
12+
13+
public CustomRequestEntityConverter() {
14+
defaultConverter = new OAuth2AuthorizationCodeGrantRequestEntityConverter();
15+
}
16+
17+
@Override
18+
public RequestEntity<?> convert(OAuth2AuthorizationCodeGrantRequest req) {
19+
RequestEntity<?> entity = defaultConverter.convert(req);
20+
MultiValueMap<String, String> params = (MultiValueMap<String,String>) entity.getBody();
21+
params.add("test2", "extra2");
22+
System.out.println(params.entrySet());
23+
return new RequestEntity<>(params, entity.getHeaders(), entity.getMethod(), entity.getUrl());
24+
}
25+
26+
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package com.baeldung.oauth2;
2+
3+
import java.util.Arrays;
4+
import java.util.Collections;
5+
import java.util.LinkedHashMap;
6+
import java.util.Map;
7+
import java.util.Set;
8+
import java.util.stream.Collectors;
9+
import java.util.stream.Stream;
10+
11+
import org.springframework.core.convert.converter.Converter;
12+
import org.springframework.security.oauth2.core.OAuth2AccessToken;
13+
import org.springframework.security.oauth2.core.endpoint.OAuth2AccessTokenResponse;
14+
import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames;
15+
import org.springframework.util.StringUtils;
16+
17+
public class CustomTokenResponseConverter implements Converter<Map<String, String>, OAuth2AccessTokenResponse> {
18+
private static final Set<String> TOKEN_RESPONSE_PARAMETER_NAMES = Stream.of(
19+
OAuth2ParameterNames.ACCESS_TOKEN,
20+
OAuth2ParameterNames.TOKEN_TYPE,
21+
OAuth2ParameterNames.EXPIRES_IN,
22+
OAuth2ParameterNames.REFRESH_TOKEN,
23+
OAuth2ParameterNames.SCOPE) .collect(Collectors.toSet());
24+
25+
@Override
26+
public OAuth2AccessTokenResponse convert(Map<String, String> tokenResponseParameters) {
27+
String accessToken = tokenResponseParameters.get(OAuth2ParameterNames.ACCESS_TOKEN);
28+
29+
OAuth2AccessToken.TokenType accessTokenType = null;
30+
if (OAuth2AccessToken.TokenType.BEARER.getValue()
31+
.equalsIgnoreCase(tokenResponseParameters.get(OAuth2ParameterNames.TOKEN_TYPE))) {
32+
accessTokenType = OAuth2AccessToken.TokenType.BEARER;
33+
}
34+
35+
long expiresIn = 0;
36+
if (tokenResponseParameters.containsKey(OAuth2ParameterNames.EXPIRES_IN)) {
37+
try {
38+
expiresIn = Long.valueOf(tokenResponseParameters.get(OAuth2ParameterNames.EXPIRES_IN));
39+
} catch (NumberFormatException ex) {
40+
}
41+
}
42+
43+
Set<String> scopes = Collections.emptySet();
44+
if (tokenResponseParameters.containsKey(OAuth2ParameterNames.SCOPE)) {
45+
String scope = tokenResponseParameters.get(OAuth2ParameterNames.SCOPE);
46+
scopes = Arrays.stream(StringUtils.delimitedListToStringArray(scope, " "))
47+
.collect(Collectors.toSet());
48+
}
49+
50+
String refreshToken = tokenResponseParameters.get(OAuth2ParameterNames.REFRESH_TOKEN);
51+
52+
Map<String, Object> additionalParameters = new LinkedHashMap<>();
53+
tokenResponseParameters.entrySet()
54+
.stream()
55+
.filter(e -> !TOKEN_RESPONSE_PARAMETER_NAMES.contains(e.getKey()))
56+
.forEach(e -> additionalParameters.put(e.getKey(), e.getValue()));
57+
58+
return OAuth2AccessTokenResponse.withToken(accessToken)
59+
.tokenType(accessTokenType)
60+
.expiresIn(expiresIn)
61+
.scopes(scopes)
62+
.refreshToken(refreshToken)
63+
.additionalParameters(additionalParameters)
64+
.build();
65+
}
66+
67+
}

spring-5-security-oauth/src/main/java/com/baeldung/oauth2/SecurityConfig.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,22 @@
99
import org.springframework.context.annotation.Configuration;
1010
import org.springframework.context.annotation.PropertySource;
1111
import org.springframework.core.env.Environment;
12+
import org.springframework.http.converter.FormHttpMessageConverter;
1213
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
1314
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
1415
import org.springframework.security.config.oauth2.client.CommonOAuth2Provider;
15-
import org.springframework.security.oauth2.client.endpoint.NimbusAuthorizationCodeTokenResponseClient;
16+
import org.springframework.security.oauth2.client.endpoint.DefaultAuthorizationCodeTokenResponseClient;
1617
import org.springframework.security.oauth2.client.endpoint.OAuth2AccessTokenResponseClient;
1718
import org.springframework.security.oauth2.client.endpoint.OAuth2AuthorizationCodeGrantRequest;
19+
import org.springframework.security.oauth2.client.http.OAuth2ErrorResponseErrorHandler;
1820
import org.springframework.security.oauth2.client.registration.ClientRegistration;
1921
import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository;
2022
import org.springframework.security.oauth2.client.registration.InMemoryClientRegistrationRepository;
2123
import org.springframework.security.oauth2.client.web.AuthorizationRequestRepository;
2224
import org.springframework.security.oauth2.client.web.HttpSessionOAuth2AuthorizationRequestRepository;
2325
import org.springframework.security.oauth2.core.endpoint.OAuth2AuthorizationRequest;
26+
import org.springframework.security.oauth2.core.http.converter.OAuth2AccessTokenResponseHttpMessageConverter;
27+
import org.springframework.web.client.RestTemplate;
2428

2529
@Configuration
2630
@PropertySource("application-oauth2.properties")
@@ -37,6 +41,8 @@ protected void configure(HttpSecurity http) throws Exception {
3741
.oauth2Login()
3842
.loginPage("/oauth_login")
3943
.authorizationEndpoint()
44+
.authorizationRequestResolver( new CustomAuthorizationRequestResolver(clientRegistrationRepository(),"/oauth2/authorize-client"))
45+
4046
.baseUri("/oauth2/authorize-client")
4147
.authorizationRequestRepository(authorizationRequestRepository())
4248
.and()
@@ -54,7 +60,15 @@ public AuthorizationRequestRepository<OAuth2AuthorizationRequest> authorizationR
5460

5561
@Bean
5662
public OAuth2AccessTokenResponseClient<OAuth2AuthorizationCodeGrantRequest> accessTokenResponseClient() {
57-
return new NimbusAuthorizationCodeTokenResponseClient();
63+
DefaultAuthorizationCodeTokenResponseClient accessTokenResponseClient = new DefaultAuthorizationCodeTokenResponseClient();
64+
accessTokenResponseClient.setRequestEntityConverter(new CustomRequestEntityConverter());
65+
66+
OAuth2AccessTokenResponseHttpMessageConverter tokenResponseHttpMessageConverter = new OAuth2AccessTokenResponseHttpMessageConverter();
67+
tokenResponseHttpMessageConverter.setTokenResponseConverter(new CustomTokenResponseConverter());
68+
RestTemplate restTemplate = new RestTemplate(Arrays.asList(new FormHttpMessageConverter(), tokenResponseHttpMessageConverter));
69+
restTemplate.setErrorHandler(new OAuth2ErrorResponseErrorHandler());
70+
accessTokenResponseClient.setRestOperations(restTemplate);
71+
return accessTokenResponseClient;
5872
}
5973

6074

0 commit comments

Comments
 (0)