@@ -12,7 +12,7 @@ use axum::{
1212} ;
1313use hyper:: StatusCode ;
1414use mas_axum_utils:: record_error;
15- use mas_data_model:: UpstreamOAuthProvider ;
15+ use mas_data_model:: { UpstreamOAuthProvider , UpstreamOAuthProviderOnBackchannelLogout } ;
1616use mas_jose:: {
1717 claims:: { self , Claim , TimeOptions } ,
1818 jwt:: JwtDecodeError ,
@@ -23,6 +23,7 @@ use mas_oidc_client::{
2323} ;
2424use mas_storage:: {
2525 BoxClock , BoxRepository , Pagination , upstream_oauth2:: UpstreamOAuthSessionFilter ,
26+ user:: BrowserSessionFilter ,
2627} ;
2728use oauth2_types:: errors:: { ClientError , ClientErrorCode } ;
2829use serde:: Deserialize ;
@@ -229,6 +230,9 @@ pub(crate) async fn post(
229230 filter = filter. with_sid_claim ( sid) ;
230231 }
231232
233+ // Load the corresponding authentication sessions, by batches of 100s. It's
234+ // VERY unlikely that we'll ever have more that 100 sessions for a single
235+ // logout notification, but we'll handle it anyway.
232236 let mut cursor = Pagination :: first ( 100 ) ;
233237 let mut sessions = Vec :: new ( ) ;
234238 loop {
@@ -244,7 +248,19 @@ pub(crate) async fn post(
244248 }
245249 }
246250
247- tracing:: info!( sub, sid, %provider. id, "Backchannel logout received, found {} corresponding sessions" , sessions. len( ) ) ;
251+ tracing:: info!( sub, sid, %provider. id, "Backchannel logout received, found {} corresponding authentication sessions" , sessions. len( ) ) ;
252+
253+ match provider. on_backchannel_logout {
254+ UpstreamOAuthProviderOnBackchannelLogout :: DoNothing => {
255+ tracing:: warn!( %provider. id, "Provider configured to do nothing on backchannel logout" ) ;
256+ }
257+ UpstreamOAuthProviderOnBackchannelLogout :: LogoutBrowserOnly => {
258+ let filter =
259+ BrowserSessionFilter :: new ( ) . authenticated_by_upstream_sessions_only ( & sessions) ;
260+ let affected = repo. browser_session ( ) . finish_bulk ( & clock, filter) . await ?;
261+ tracing:: info!( "Finished {affected} browser sessions" ) ;
262+ }
263+ }
248264
249265 Ok ( ( ) )
250266}
0 commit comments