1111import oidc .model .AccessToken ;
1212import oidc .model .User ;
1313import oidc .repository .AccessTokenRepository ;
14+ import oidc .saml .AuthnRequestContextConsumer ;
1415import oidc .secure .TokenGenerator ;
16+ import org .apache .commons .logging .Log ;
17+ import org .apache .commons .logging .LogFactory ;
1518import org .springframework .http .HttpStatus ;
1619import org .springframework .http .MediaType ;
1720import org .springframework .http .ResponseEntity ;
@@ -30,19 +33,45 @@ public class UserInfoEndpoint {
3033 private final AccessTokenRepository accessTokenRepository ;
3134 private final TokenGenerator tokenGenerator ;
3235
36+ private static final Log LOG = LogFactory .getLog (AuthnRequestContextConsumer .class );
37+
3338 public UserInfoEndpoint (AccessTokenRepository accessTokenRepository , TokenGenerator tokenGenerator ) {
3439 this .accessTokenRepository = accessTokenRepository ;
3540 this .tokenGenerator = tokenGenerator ;
3641 }
3742
3843 @ GetMapping ("oidc/userinfo" )
39- public ResponseEntity <Map <String , Object >> getUserInfo (HttpServletRequest request ) throws IOException , ParseException , java .text .ParseException {
40- return userInfo (request );
44+ public ResponseEntity <Map <String , Object >> getUserInfo (HttpServletRequest request )
45+ 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+ }
4151 }
4252
4353 @ PostMapping (value = {"oidc/userinfo" }, consumes = {MediaType .APPLICATION_FORM_URLENCODED_VALUE })
44- public ResponseEntity <Map <String , Object >> postUserInfo (HttpServletRequest request ) throws ParseException , IOException , java .text .ParseException {
45- return userInfo (request );
54+ public ResponseEntity <Map <String , Object >> postUserInfo (HttpServletRequest request )
55+ 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+ }
61+ }
62+
63+ private ResponseEntity <Map <String , Object >> handleMissingToken (com .nimbusds .oauth2 .sdk .ParseException e , HttpServletRequest request ) {
64+ LOG .warn (String .format ("UserInfo request failed: %s | Path: %s | IP: %s" ,
65+ e .getMessage (), request .getRequestURI (), request .getRemoteAddr ()));
66+
67+ Map <String , Object > body = new HashMap <>();
68+ body .put ("error" , "invalid_request" );
69+ body .put ("error_description" , e .getMessage ());
70+
71+ return ResponseEntity
72+ .status (HttpStatus .UNAUTHORIZED )
73+ .header ("WWW-Authenticate" , "Bearer error=\" invalid_request\" , error_description=\" Missing access token\" " )
74+ .body (body );
4675 }
4776
4877 private ResponseEntity <Map <String , Object >> userInfo (HttpServletRequest request ) throws ParseException , IOException , java .text .ParseException {
0 commit comments