@@ -436,26 +436,34 @@ async fn process_oidc_logout(
436436
437437 let state_cookie = get_logout_state_cookie ( request, & params. state ) ?;
438438 let LogoutState { redirect_uri } = parse_logout_state ( & state_cookie) ?;
439- let redirect_uri = redirect_uri. to_string ( ) ;
440439
441- let id_token = request. cookie ( SQLPAGE_AUTH_COOKIE_NAME ) ;
440+ let id_token_cookie = request. cookie ( SQLPAGE_AUTH_COOKIE_NAME ) ;
441+ let id_token = id_token_cookie
442+ . as_ref ( )
443+ . map ( |c| OidcToken :: from_str ( c. value ( ) ) )
444+ . transpose ( )
445+ . ok ( )
446+ . flatten ( ) ;
447+
448+ let mut response =
449+ if let Some ( end_session_endpoint) = oidc_state. get_end_session_endpoint ( ) . await {
450+ let post_logout_redirect_uri = PostLogoutRedirectUrl :: new ( redirect_uri. to_string ( ) )
451+ . with_context ( || format ! ( "Invalid post_logout_redirect_uri: {redirect_uri}" ) ) ?;
452+
453+ let mut logout_request = LogoutRequest :: from ( end_session_endpoint)
454+ . set_post_logout_redirect_uri ( post_logout_redirect_uri) ;
442455
443- let mut response = if let Some ( end_session_endpoint) = oidc_state. get_end_session_endpoint ( ) . await
444- {
445- let mut logout_url = end_session_endpoint;
446- {
447- let mut query_pairs = logout_url. query_pairs_mut ( ) ;
448- query_pairs. append_pair ( "post_logout_redirect_uri" , & redirect_uri) ;
449456 if let Some ( ref token) = id_token {
450- query_pairs . append_pair ( "id_token_hint" , token . value ( ) ) ;
457+ logout_request = logout_request . set_id_token_hint ( token ) ;
451458 }
452- }
453- log:: info!( "Redirecting to OIDC logout URL: {logout_url}" ) ;
454- build_redirect_response ( logout_url. to_string ( ) )
455- } else {
456- log:: info!( "No end_session_endpoint, redirecting to {redirect_uri}" ) ;
457- build_redirect_response ( redirect_uri)
458- } ;
459+
460+ let logout_url = logout_request. http_get_url ( ) ;
461+ log:: info!( "Redirecting to OIDC logout URL: {logout_url}" ) ;
462+ build_redirect_response ( logout_url. to_string ( ) )
463+ } else {
464+ log:: info!( "No end_session_endpoint, redirecting to {redirect_uri}" ) ;
465+ build_redirect_response ( redirect_uri. to_string ( ) )
466+ } ;
459467
460468 let auth_cookie = Cookie :: build ( SQLPAGE_AUTH_COOKIE_NAME , "" )
461469 . secure ( true )
0 commit comments