22
33import jakarta .enterprise .context .ApplicationScoped ;
44
5+ import org .jboss .logging .Logger ;
6+
57import io .quarkus .oidc .AuthorizationCodeTokens ;
68import io .quarkus .oidc .OidcRequestContext ;
79import io .quarkus .oidc .OidcTenantConfig ;
810import io .quarkus .oidc .TokenStateManager ;
911import io .quarkus .oidc .runtime .OidcTenantConfig .TokenStateManager .Strategy ;
10- import io .quarkus .security .AuthenticationCompletionException ;
1112import io .quarkus .security .AuthenticationFailedException ;
1213import io .smallrye .jwt .algorithm .KeyEncryptionAlgorithm ;
1314import io .smallrye .mutiny .Uni ;
1718
1819@ ApplicationScoped
1920public class DefaultTokenStateManager implements TokenStateManager {
21+ private static final Logger LOG = Logger .getLogger (DefaultTokenStateManager .class );
2022
2123 @ Override
2224 public Uni <String > createTokenState (RoutingContext routingContext , OidcTenantConfig oidcConfig ,
@@ -125,13 +127,17 @@ public Uni<AuthorizationCodeTokens> getTokens(RoutingContext routingContext, Oid
125127
126128 if (oidcConfig .tokenStateManager ().strategy () == Strategy .KEEP_ALL_TOKENS ) {
127129 accessToken = tokens [1 ];
128- accessTokenExpiresIn = tokens [2 ].isEmpty () ? null : Long . valueOf (tokens [2 ]);
130+ accessTokenExpiresIn = tokens [2 ].isEmpty () ? null : parseAccessTokenExpiresIn (tokens [2 ]);
129131 refreshToken = tokens [3 ];
130132 } else if (oidcConfig .tokenStateManager ().strategy () == Strategy .ID_REFRESH_TOKENS ) {
131133 refreshToken = tokens [3 ];
132134 }
133135 } catch (ArrayIndexOutOfBoundsException ex ) {
134- return Uni .createFrom ().failure (new AuthenticationCompletionException ("Session cookie is malformed" ));
136+ final String error = "Session cookie is malformed" ;
137+ LOG .debug (ex );
138+ return Uni .createFrom ().failure (new AuthenticationFailedException (error ));
139+ } catch (AuthenticationFailedException ex ) {
140+ return Uni .createFrom ().failure (ex );
135141 }
136142 } else {
137143 // Decrypt ID token from the q_session cookie
@@ -147,9 +153,15 @@ public Uni<AuthorizationCodeTokens> getTokens(RoutingContext routingContext, Oid
147153 String [] accessTokenData = CodeAuthenticationMechanism .COOKIE_PATTERN .split (accessTokenState );
148154 accessToken = accessTokenData [0 ];
149155 try {
150- accessTokenExpiresIn = accessTokenData [1 ].isEmpty () ? null : Long .valueOf (accessTokenData [1 ]);
156+ accessTokenExpiresIn = accessTokenData [1 ].isEmpty () ? null
157+ : parseAccessTokenExpiresIn (accessTokenData [1 ]);
151158 } catch (ArrayIndexOutOfBoundsException ex ) {
152- return Uni .createFrom ().failure (new AuthenticationCompletionException ("Session cookie is malformed" ));
159+ final String error = "Session cookie is malformed" ;
160+ LOG .debug (ex );
161+ // Make this error message visible in the dev mode
162+ return Uni .createFrom ().failure (new AuthenticationFailedException (error ));
163+ } catch (AuthenticationFailedException ex ) {
164+ return Uni .createFrom ().failure (ex );
153165 }
154166 }
155167 Cookie rtCookie = getRefreshTokenCookie (routingContext , oidcConfig );
@@ -179,6 +191,19 @@ public Uni<Void> deleteTokens(RoutingContext routingContext, OidcTenantConfig oi
179191 return CodeAuthenticationMechanism .VOID_UNI ;
180192 }
181193
194+ private static Long parseAccessTokenExpiresIn (String accessTokenExpiresInString ) {
195+ try {
196+ return Long .valueOf (accessTokenExpiresInString );
197+ } catch (NumberFormatException ex ) {
198+ final String error = """
199+ Access token expires_in property in the session cookie must be a number, found %s
200+ """ .formatted (accessTokenExpiresInString );
201+ LOG .debug (ex );
202+ // Make this error message visible in the dev mode
203+ throw new AuthenticationFailedException (error );
204+ }
205+ }
206+
182207 private static ServerCookie getAccessTokenCookie (RoutingContext routingContext , OidcTenantConfig oidcConfig ) {
183208 return (ServerCookie ) routingContext .request ().getCookie (getAccessTokenCookieName (oidcConfig ));
184209 }
0 commit comments