@@ -9,9 +9,9 @@ use mas_storage::{RepositoryAccess, upstream_oauth2::UpstreamOAuthProviderReposi
9
9
use serde:: { Deserialize , Serialize } ;
10
10
use thiserror:: Error ;
11
11
use tracing:: error;
12
- use url:: Url ;
13
12
14
- use crate :: impl_from_error_for_route;
13
+ use super :: cache:: LazyProviderInfos ;
14
+ use crate :: { MetadataCache , impl_from_error_for_route} ;
15
15
16
16
#[ derive( Serialize , Deserialize ) ]
17
17
struct LogoutToken {
@@ -40,6 +40,7 @@ pub enum RouteError {
40
40
}
41
41
42
42
impl_from_error_for_route ! ( mas_storage:: RepositoryError ) ;
43
+ impl_from_error_for_route ! ( mas_oidc_client:: error:: DiscoveryError ) ;
43
44
44
45
impl From < reqwest:: Error > for RouteError {
45
46
fn from ( err : reqwest:: Error ) -> Self {
@@ -67,14 +68,15 @@ impl From<reqwest::Error> for RouteError {
67
68
/// Returns a `RouteError` if there's an issue accessing the repository
68
69
pub async fn get_rp_initiated_logout_endpoints < E > (
69
70
url_builder : & UrlBuilder ,
71
+ metadata_cache : & MetadataCache ,
72
+ client : & reqwest:: Client ,
70
73
repo : & mut impl RepositoryAccess < Error = E > ,
71
74
browser_session : & BrowserSession ,
72
75
) -> Result < UpstreamLogoutInfo , RouteError >
73
76
where
74
77
RouteError : std:: convert:: From < E > ,
75
78
{
76
79
let mut result: UpstreamLogoutInfo = UpstreamLogoutInfo :: default ( ) ;
77
- // Set the post-logout redirect URI to our app's logout completion page
78
80
let post_logout_redirect_uri = url_builder
79
81
. absolute_url_for ( & mas_router:: Login :: default ( ) )
80
82
. to_string ( ) ;
@@ -93,42 +95,39 @@ where
93
95
} ) ?
94
96
. ok_or ( RouteError :: SessionNotFound ) ?;
95
97
96
- // Get the session and assign its value, wrapped in Some
97
98
let upstream_session = repo
98
99
. upstream_oauth_session ( )
99
100
. lookup ( upstream_oauth2_session_id)
100
101
. await ?
101
102
. ok_or ( RouteError :: SessionNotFound ) ?;
102
- // Get the provider and assign its value, wrapped in Some
103
+
103
104
let provider = repo
104
105
. upstream_oauth_provider ( )
105
106
. lookup ( upstream_session. provider_id )
106
107
. await ?
107
108
. filter ( |provider| provider. allow_rp_initiated_logout )
108
109
. ok_or ( RouteError :: ProviderNotFound ) ?;
109
110
110
- // Look for end session endpoint
111
- // In a real implementation, we'd have end_session_endpoint fields in the
112
- // provider For now, we'll try to construct one from the issuer if
113
- // available
114
- if let Some ( issuer) = & provider. issuer {
115
- let end_session_endpoint = format ! ( "{issuer}/protocol/openid-connect/logout" ) ;
116
- let mut logout_url = end_session_endpoint;
117
- // Add post_logout_redirect_uri
118
- if let Some ( post_uri) = & result. post_logout_redirect_uri {
119
- if let Ok ( mut url) = Url :: parse ( & logout_url) {
120
- url. query_pairs_mut ( )
121
- . append_pair ( "post_logout_redirect_uri" , post_uri) ;
122
- url. query_pairs_mut ( )
123
- . append_pair ( "client_id" , & provider. client_id ) ;
124
- // Add id_token_hint if available
125
- if let Some ( id_token) = upstream_session. id_token ( ) {
126
- url. query_pairs_mut ( ) . append_pair ( "id_token_hint" , id_token) ;
127
- }
128
- logout_url = url. to_string ( ) ;
129
- }
111
+ // Add post_logout_redirect_uri
112
+ if let Some ( post_uri) = & result. post_logout_redirect_uri {
113
+ let mut lazy_metadata = LazyProviderInfos :: new ( metadata_cache, & provider, client) ;
114
+ let mut end_session_url = lazy_metadata. end_session_endpoint ( ) . await ?. clone ( ) ;
115
+ end_session_url
116
+ . query_pairs_mut ( )
117
+ . append_pair ( "post_logout_redirect_uri" , post_uri) ;
118
+ end_session_url
119
+ . query_pairs_mut ( )
120
+ . append_pair ( "client_id" , & provider. client_id ) ;
121
+ // Add id_token_hint if available
122
+ if let Some ( id_token) = upstream_session. id_token ( ) {
123
+ end_session_url
124
+ . query_pairs_mut ( )
125
+ . append_pair ( "id_token_hint" , id_token) ;
130
126
}
131
- result. logout_endpoints . clone_from ( & logout_url) ;
127
+ result
128
+ . logout_endpoints
129
+ . clone_from ( & end_session_url. to_string ( ) ) ;
132
130
}
131
+
133
132
Ok ( result)
134
133
}
0 commit comments