@@ -101,6 +101,22 @@ pub async fn login(
101101 }
102102}
103103
104+ pub async fn logout (
105+ req : HttpRequest ,
106+ query : web:: Query < RedirectAfterLogin > ,
107+ oidc_client : Data < openid:: Client > ,
108+ ) -> HttpResponse {
109+ let Some ( session) = extract_session_key_from_req ( & req) . ok ( ) else {
110+ return return_to_client ( query. redirect . as_str ( ) , None ) ;
111+ } ;
112+ Users . remove_session ( & session) ;
113+ if let Some ( url) = oidc_client. config ( ) . end_session_endpoint . clone ( ) {
114+ redirect_to_oidc_logout ( url, & query. redirect )
115+ } else {
116+ return_to_client ( query. redirect . as_str ( ) , None )
117+ }
118+ }
119+
104120/// Handler for code callback
105121/// User should be redirected to page they were trying to access with cookie
106122pub async fn reply_login (
@@ -156,6 +172,13 @@ fn redirect_to_oidc(
156172 . finish ( )
157173}
158174
175+ fn redirect_to_oidc_logout ( mut logout_endpoint : Url , redirect : & Url ) -> HttpResponse {
176+ logout_endpoint. set_query ( Some ( & format ! ( "post_logout_redirect_uri={}" , redirect) ) ) ;
177+ HttpResponse :: TemporaryRedirect ( )
178+ . insert_header ( ( header:: LOCATION , logout_endpoint. to_string ( ) ) )
179+ . finish ( )
180+ }
181+
159182fn return_to_client ( url : & str , cookies : impl IntoIterator < Item = Cookie < ' static > > ) -> HttpResponse {
160183 let mut response = HttpResponse :: MovedPermanently ( ) ;
161184 response. insert_header ( ( header:: LOCATION , url) ) ;
0 commit comments