@@ -329,15 +329,17 @@ enum MiddlewareResponse {
329329async fn handle_request ( oidc_state : & OidcState , request : ServiceRequest ) -> MiddlewareResponse {
330330 log:: trace!( "Started OIDC middleware request handling" ) ;
331331 oidc_state. refresh_if_expired ( & request) . await ;
332+
333+ if request. path ( ) == SQLPAGE_REDIRECT_URI {
334+ let response = handle_oidc_callback ( oidc_state, request) . await ;
335+ return MiddlewareResponse :: Respond ( response) ;
336+ }
337+
332338 match get_authenticated_user_info ( oidc_state, & request) . await {
333339 Ok ( Some ( claims) ) => {
334- if request. path ( ) == SQLPAGE_REDIRECT_URI {
335- MiddlewareResponse :: Respond ( handle_authenticated_oidc_callback ( request) )
336- } else {
337- log:: trace!( "Storing authenticated user info in request extensions: {claims:?}" ) ;
338- request. extensions_mut ( ) . insert ( claims) ;
339- MiddlewareResponse :: Forward ( request)
340- }
340+ log:: trace!( "Storing authenticated user info in request extensions: {claims:?}" ) ;
341+ request. extensions_mut ( ) . insert ( claims) ;
342+ MiddlewareResponse :: Forward ( request)
341343 }
342344 Ok ( None ) => {
343345 log:: trace!( "No authenticated user found" ) ;
@@ -356,11 +358,6 @@ async fn handle_unauthenticated_request(
356358 request : ServiceRequest ,
357359) -> MiddlewareResponse {
358360 log:: debug!( "Handling unauthenticated request to {}" , request. path( ) ) ;
359- if request. path ( ) == SQLPAGE_REDIRECT_URI {
360- log:: debug!( "The request is the OIDC callback" ) ;
361- let response = handle_oidc_callback ( oidc_state, request) . await ;
362- return MiddlewareResponse :: Respond ( response) ;
363- }
364361
365362 if oidc_state. config . is_public_path ( request. path ( ) ) {
366363 return MiddlewareResponse :: Forward ( request) ;
@@ -374,8 +371,7 @@ async fn handle_unauthenticated_request(
374371}
375372
376373async fn handle_oidc_callback ( oidc_state : & OidcState , request : ServiceRequest ) -> ServiceResponse {
377- let query_string = request. query_string ( ) ;
378- match process_oidc_callback ( oidc_state, query_string, & request) . await {
374+ match process_oidc_callback ( oidc_state, & request) . await {
379375 Ok ( response) => request. into_response ( response) ,
380376 Err ( e) => {
381377 log:: error!( "Failed to process OIDC callback. Refreshing oidc provider metadata, then redirecting to home page: {e:#}" ) ;
@@ -386,24 +382,6 @@ async fn handle_oidc_callback(oidc_state: &OidcState, request: ServiceRequest) -
386382 }
387383}
388384
389- /// When an user has already authenticated (potentially in another tab), we ignore the callback and redirect to the initial URL.
390- fn handle_authenticated_oidc_callback ( request : ServiceRequest ) -> ServiceResponse {
391- // Try to get redirect URL from query params if available
392- let redirect_url = Query :: < OidcCallbackParams > :: from_query ( request. query_string ( ) )
393- . with_context ( || "Failed to parse OIDC callback parameters in authenticated callback" )
394- . and_then ( |params| get_redirect_url_cookie ( & request, & params. state ) )
395- . map_or_else (
396- |e| {
397- log:: warn!( "No redirect URL cookie: {e:#}" ) ;
398- "/" . to_string ( )
399- } ,
400- |cookie| cookie. value ( ) . to_string ( ) ,
401- ) ;
402-
403- log:: debug!( "OIDC callback received for authenticated user. Redirecting to {redirect_url}" ) ;
404- request. into_response ( build_redirect_response ( redirect_url) )
405- }
406-
407385impl < S > Service < ServiceRequest > for OidcService < S >
408386where
409387 S : Service < ServiceRequest , Response = ServiceResponse < BoxBody > , Error = Error > + ' static ,
@@ -429,36 +407,25 @@ where
429407
430408async fn process_oidc_callback (
431409 oidc_state : & OidcState ,
432- query_string : & str ,
433410 request : & ServiceRequest ,
434411) -> anyhow:: Result < HttpResponse > {
435- let http_client = get_http_client_from_appdata ( request) ?;
436-
437- let params = Query :: < OidcCallbackParams > :: from_query ( query_string)
438- . with_context ( || {
439- format ! (
440- "{SQLPAGE_REDIRECT_URI}: failed to parse OIDC callback parameters from {query_string}"
441- )
442- } ) ?
412+ let params = Query :: < OidcCallbackParams > :: from_query ( request. query_string ( ) )
413+ . with_context ( || format ! ( "{SQLPAGE_REDIRECT_URI}: invalid url parameters" ) ) ?
443414 . into_inner ( ) ;
444-
445- let mut redirect_url_cookie = get_redirect_url_cookie ( request, & params. state )
446- . with_context ( || "Failed to read redirect URL from cookie" ) ?;
447-
448- let client = oidc_state. get_client ( ) . await ;
449415 log:: debug!( "Processing OIDC callback with params: {params:?}. Requesting token..." ) ;
416+ let mut redirect_url_cookie = get_redirect_url_cookie ( request, & params. state ) ?;
417+ let client = oidc_state. get_client ( ) . await ;
418+ let http_client = get_http_client_from_appdata ( request) ?;
450419 let token_response = exchange_code_for_token ( & client, http_client, params. clone ( ) ) . await ?;
451420 log:: debug!( "Received token response: {token_response:?}" ) ;
452421
453422 let redirect_target = validate_redirect_url ( redirect_url_cookie. value ( ) . to_string ( ) ) ;
423+
454424 log:: info!( "Redirecting to {redirect_target} after a successful login" ) ;
455425 let mut response = build_redirect_response ( redirect_target) ;
456426 set_auth_cookie ( & mut response, & token_response) . context ( "Failed to set auth cookie" ) ?;
457-
458- // Clean up the state-specific cookie after successful authentication
459- redirect_url_cookie. set_path ( "/" ) ;
427+ redirect_url_cookie. set_path ( "/" ) ; // Required to clean up the cookie
460428 response. add_removal_cookie ( & redirect_url_cookie) ?;
461-
462429 Ok ( response)
463430}
464431
0 commit comments