Skip to content

Commit 0045e43

Browse files
committed
Refactor OIDC request handling to streamline callback processing and remove redundant code. Simplify the handling of authenticated user info and improve error logging for OIDC callback parameters.
1 parent a451c7e commit 0045e43

File tree

1 file changed

+17
-50
lines changed

1 file changed

+17
-50
lines changed

src/webserver/oidc.rs

Lines changed: 17 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -329,15 +329,17 @@ enum MiddlewareResponse {
329329
async 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

376373
async 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-
407385
impl<S> Service<ServiceRequest> for OidcService<S>
408386
where
409387
S: Service<ServiceRequest, Response = ServiceResponse<BoxBody>, Error = Error> + 'static,
@@ -429,36 +407,25 @@ where
429407

430408
async 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

Comments
 (0)