Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 0ec5d24

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

File tree

Expand file treeCollapse file tree

5 files changed

+162
-4
lines changed
Open diff view settings
Filter options
Expand file treeCollapse file tree

5 files changed

+162
-4
lines changed
Open diff view settings
Collapse file

‎spring-5-security-oauth/pom.xml‎

Copy file name to clipboardExpand all lines: spring-5-security-oauth/pom.xml
+3-2Lines 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

Collapse file
+50Lines 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+
}
Collapse file
+26Lines 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+
}
Collapse file
+67Lines 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+
}
Collapse file

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

Copy file name to clipboardExpand all lines: spring-5-security-oauth/src/main/java/com/baeldung/oauth2/SecurityConfig.java
+16-2Lines 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 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.