Skip to content

Commit d681d7b

Browse files
committed
BSR
1 parent 478be90 commit d681d7b

2 files changed

Lines changed: 35 additions & 20 deletions

File tree

oidc/src/main/java/oidc/endpoints/UserInfoEndpoint.java

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,11 @@
2525

2626
import java.io.IOException;
2727
import java.time.Clock;
28-
import java.util.*;
28+
import java.util.HashMap;
29+
import java.util.List;
30+
import java.util.Map;
31+
import java.util.Optional;
32+
import java.util.TreeMap;
2933

3034
@RestController
3135
public class UserInfoEndpoint {
@@ -43,64 +47,62 @@ public UserInfoEndpoint(AccessTokenRepository accessTokenRepository, TokenGenera
4347
@GetMapping("oidc/userinfo")
4448
public ResponseEntity<Map<String, Object>> getUserInfo(HttpServletRequest request)
4549
throws IOException, java.text.ParseException {
46-
try {
47-
return userInfo(request);
48-
} catch (com.nimbusds.oauth2.sdk.ParseException e) {
49-
return handleMissingToken(e, request);
50-
}
50+
return userInfo(request);
5151
}
5252

5353
@PostMapping(value = {"oidc/userinfo"}, consumes = {MediaType.APPLICATION_FORM_URLENCODED_VALUE})
5454
public ResponseEntity<Map<String, Object>> postUserInfo(HttpServletRequest request)
5555
throws IOException, java.text.ParseException {
56-
try {
57-
return userInfo(request);
58-
} catch (com.nimbusds.oauth2.sdk.ParseException e) {
59-
return handleMissingToken(e, request);
60-
}
56+
return userInfo(request);
6157
}
6258

6359
private ResponseEntity<Map<String, Object>> handleMissingToken(com.nimbusds.oauth2.sdk.ParseException e, HttpServletRequest request) {
6460
LOG.warn(String.format("UserInfo request failed: %s | Path: %s | IP: %s",
6561
e.getMessage(), request.getRequestURI(), request.getRemoteAddr()));
6662

67-
Map<String, Object> body = new HashMap<>();
68-
body.put("error", "invalid_request");
69-
body.put("error_description", e.getMessage());
63+
Map<String, Object> body = Map.of(
64+
"error", "invalid_request",
65+
"error_description", e.getMessage()
66+
);
7067

7168
return ResponseEntity
7269
.status(HttpStatus.UNAUTHORIZED)
7370
.header("WWW-Authenticate", "Bearer error=\"invalid_request\", error_description=\"Missing access token\"")
7471
.body(body);
7572
}
7673

77-
private ResponseEntity<Map<String, Object>> userInfo(HttpServletRequest request) throws ParseException, IOException, java.text.ParseException {
74+
private ResponseEntity<Map<String, Object>> userInfo(HttpServletRequest request) throws IOException, java.text.ParseException {
7875
HTTPRequest httpRequest = JakartaServletUtils.createHTTPRequest(request);
7976
if (request.getMethod().equalsIgnoreCase("GET")) {
8077
//Otherwise the query parameters are not read by the nimbus parser
8178
httpRequest.setEntityContentType(null);
8279
}
83-
UserInfoRequest userInfoRequest = UserInfoRequest.parse(httpRequest);
80+
UserInfoRequest userInfoRequest;
81+
try {
82+
userInfoRequest = UserInfoRequest.parse(httpRequest);
83+
} catch (ParseException e) {
84+
return handleMissingToken(e, request);
85+
}
8486

8587
String accessTokenValue = userInfoRequest.getAccessToken().getValue();
8688

8789
MDCContext.mdcContext("action", "Userinfo", "accessTokenValue", accessTokenValue);
8890
Optional<SignedJWT> optionalSignedJWT;
89-
try {
91+
try {
9092
optionalSignedJWT = tokenGenerator.parseAndValidateSignedJWT(accessTokenValue);
9193
} catch (IllegalArgumentException e) {
9294
//Thrown when the signing key has been deleted, which only happens when all access_tokens with that key are gone
9395
return errorResponse("Access Token not found");
9496
}
9597

96-
if (!optionalSignedJWT.isPresent()) {
98+
if (optionalSignedJWT.isEmpty()) {
9799
return errorResponse("Access Token not found");
98100
}
99101
SignedJWT signedJWT = optionalSignedJWT.get();
100102
String jwtId = signedJWT.getJWTClaimsSet().getJWTID();
101103
Optional<AccessToken> optionalAccessToken = accessTokenRepository.findByJwtId(jwtId);
102104

103-
if (!optionalAccessToken.isPresent()) {
105+
if (optionalAccessToken.isEmpty()) {
104106
return errorResponse("Access Token not found");
105107
}
106108
AccessToken accessToken = optionalAccessToken.get();
@@ -122,7 +124,7 @@ private ResponseEntity<Map<String, Object>> userInfo(HttpServletRequest request)
122124
attributes.put("authenticating_authority", user.getAuthenticatingAuthority());
123125
attributes.put("updated_at", user.getUpdatedAt());
124126
attributes.put("sub", user.getSub());
125-
return ResponseEntity.ok(new TreeMap(attributes));
127+
return ResponseEntity.ok(new TreeMap<>(attributes));
126128
}
127129

128130
private ResponseEntity<Map<String, Object>> errorResponse(String errorDescription) {

oidc/src/test/java/oidc/endpoints/UserInfoEndpointTest.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import ch.qos.logback.classic.spi.ILoggingEvent;
55
import ch.qos.logback.core.read.ListAppender;
66
import com.nimbusds.oauth2.sdk.GrantType;
7+
import io.restassured.common.mapper.TypeRef;
78
import io.restassured.response.Response;
89
import io.restassured.specification.RequestSpecification;
910
import oidc.AbstractIntegrationTest;
@@ -13,6 +14,7 @@
1314
import org.springframework.http.HttpStatus;
1415

1516
import java.io.IOException;
17+
import java.lang.reflect.Type;
1618
import java.text.ParseException;
1719
import java.util.Map;
1820

@@ -33,6 +35,17 @@ public void postUserInfo() throws IOException {
3335
userInfo("POST");
3436
}
3537

38+
@Test
39+
public void getUserInfoParseException() {
40+
Map<String, Object> response = given()
41+
.when()
42+
.header("Content-type", "application/x-www-form-urlencoded")
43+
.get("oidc/userinfo")
44+
.as(new TypeRef<>() {
45+
});
46+
assertEquals("Missing access token", response.get("error_description"));
47+
}
48+
3649
@Test
3750
public void signingKeyNotFound() throws IOException {
3851
String accessToken = getAccessToken();

0 commit comments

Comments
 (0)