Skip to content

Commit 71eb71d

Browse files
author
Steve Riesenberg
committed
Merge branch '5.7.x' into 5.8.x
Closes gh-12206
2 parents 60e573d + 67a1f08 commit 71eb71d

File tree

3 files changed

+34
-3
lines changed

3 files changed

+34
-3
lines changed

oauth2/oauth2-client/src/main/java/org/springframework/security/oauth2/client/oidc/userinfo/OidcUserService.java

+6
Original file line numberDiff line numberDiff line change
@@ -173,8 +173,14 @@ private boolean shouldRetrieveUserInfo(OidcUserRequest userRequest) {
173173
.equals(userRequest.getClientRegistration().getAuthorizationGrantType())) {
174174
// Return true if there is at least one match between the authorized scope(s)
175175
// and accessible scope(s)
176+
//
177+
// Also return true if authorized scope(s) is empty, because the provider has
178+
// not indicated which scopes are accessible via the access token
179+
// @formatter:off
176180
return this.accessibleScopes.isEmpty()
181+
|| CollectionUtils.isEmpty(userRequest.getAccessToken().getScopes())
177182
|| CollectionUtils.containsAny(userRequest.getAccessToken().getScopes(), this.accessibleScopes);
183+
// @formatter:on
178184
}
179185
return false;
180186
}

oauth2/oauth2-client/src/test/java/org/springframework/security/oauth2/client/oidc/userinfo/OidcUserServiceTests.java

+24-2
Original file line numberDiff line numberDiff line change
@@ -458,14 +458,36 @@ public void loadUserWhenTokenContainsScopesThenIndividualScopeAuthorities() {
458458
@Test
459459
public void loadUserWhenTokenDoesNotContainScopesThenNoScopeAuthorities() {
460460
OidcUserService userService = new OidcUserService();
461-
OidcUserRequest request = new OidcUserRequest(TestClientRegistrations.clientRegistration().build(),
462-
TestOAuth2AccessTokens.noScopes(), TestOidcIdTokens.idToken().build());
461+
OidcUserRequest request = new OidcUserRequest(this.clientRegistrationBuilder.build(),
462+
TestOAuth2AccessTokens.noScopes(), this.idToken);
463463
OidcUser user = userService.loadUser(request);
464464
assertThat(user.getAuthorities()).hasSize(1);
465465
Iterator<? extends GrantedAuthority> authorities = user.getAuthorities().iterator();
466466
assertThat(authorities.next()).isInstanceOf(OidcUserAuthority.class);
467467
}
468468

469+
@Test
470+
public void loadUserWhenTokenDoesNotContainScopesAndUserInfoUriThenUserInfoRequested() {
471+
// @formatter:off
472+
String userInfoResponse = "{\n"
473+
+ " \"sub\": \"subject1\",\n"
474+
+ " \"name\": \"first last\",\n"
475+
+ " \"given_name\": \"first\",\n"
476+
+ " \"family_name\": \"last\",\n"
477+
+ " \"preferred_username\": \"user1\",\n"
478+
+ " \"email\": \"[email protected]\"\n"
479+
+ "}\n";
480+
// @formatter:on
481+
this.server.enqueue(jsonResponse(userInfoResponse));
482+
String userInfoUri = this.server.url("/user").toString();
483+
ClientRegistration clientRegistration = this.clientRegistrationBuilder.userInfoUri(userInfoUri).build();
484+
OidcUserService userService = new OidcUserService();
485+
OidcUserRequest request = new OidcUserRequest(clientRegistration, TestOAuth2AccessTokens.noScopes(),
486+
this.idToken);
487+
OidcUser user = userService.loadUser(request);
488+
assertThat(user.getUserInfo()).isNotNull();
489+
}
490+
469491
private MockResponse jsonResponse(String json) {
470492
// @formatter:off
471493
return new MockResponse()

oauth2/oauth2-core/src/test/java/org/springframework/security/oauth2/core/endpoint/TestOAuth2AccessTokenResponses.java

+4-1
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,12 @@
1616

1717
package org.springframework.security.oauth2.core.endpoint;
1818

19+
import java.util.Collections;
1920
import java.util.HashMap;
2021
import java.util.Map;
2122

2223
import org.springframework.security.oauth2.core.OAuth2AccessToken;
24+
import org.springframework.security.oauth2.core.oidc.OidcScopes;
2325
import org.springframework.security.oauth2.core.oidc.endpoint.OidcParameterNames;
2426

2527
/**
@@ -42,7 +44,8 @@ public static OAuth2AccessTokenResponse.Builder accessTokenResponse() {
4244
public static OAuth2AccessTokenResponse.Builder oidcAccessTokenResponse() {
4345
Map<String, Object> additionalParameters = new HashMap<>();
4446
additionalParameters.put(OidcParameterNames.ID_TOKEN, "id-token");
45-
return accessTokenResponse().additionalParameters(additionalParameters);
47+
return accessTokenResponse().scopes(Collections.singleton(OidcScopes.OPENID))
48+
.additionalParameters(additionalParameters);
4649
}
4750

4851
}

0 commit comments

Comments
 (0)