Skip to content

Commit ad82461

Browse files
committed
Refactor OIDC callback processing to use ID token directly, enhancing cookie management and nonce handling. Update logging for successful logins and streamline token claims retrieval.
1 parent 0045e43 commit ad82461

File tree

1 file changed

+15
-12
lines changed

1 file changed

+15
-12
lines changed

src/webserver/oidc.rs

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -416,14 +416,21 @@ async fn process_oidc_callback(
416416
let mut redirect_url_cookie = get_redirect_url_cookie(request, &params.state)?;
417417
let client = oidc_state.get_client().await;
418418
let http_client = get_http_client_from_appdata(request)?;
419-
let token_response = exchange_code_for_token(&client, http_client, params.clone()).await?;
420-
log::debug!("Received token response: {token_response:?}");
421-
419+
let id_token = exchange_code_for_token(&client, http_client, params.clone()).await?;
420+
log::debug!("Received token response: {id_token:?}");
421+
let nonce = get_nonce_from_cookie(request)?;
422422
let redirect_target = validate_redirect_url(redirect_url_cookie.value().to_string());
423423

424424
log::info!("Redirecting to {redirect_target} after a successful login");
425425
let mut response = build_redirect_response(redirect_target);
426-
set_auth_cookie(&mut response, &token_response).context("Failed to set auth cookie")?;
426+
set_auth_cookie(&mut response, &id_token).context("Failed to set auth cookie")?;
427+
let claims = oidc_state
428+
.get_token_claims(id_token, &nonce)
429+
.await
430+
.context("The identity provider returned an invalid ID token")?;
431+
log::debug!("{} successfully logged in", claims.subject().as_str());
432+
let nonce_cookie = create_nonce_cookie(&nonce);
433+
response.add_cookie(&nonce_cookie)?;
427434
redirect_url_cookie.set_path("/"); // Required to clean up the cookie
428435
response.add_removal_cookie(&redirect_url_cookie)?;
429436
Ok(response)
@@ -433,27 +440,23 @@ async fn exchange_code_for_token(
433440
oidc_client: &OidcClient,
434441
http_client: &awc::Client,
435442
oidc_callback_params: OidcCallbackParams,
436-
) -> anyhow::Result<OidcTokenResponse> {
443+
) -> anyhow::Result<OidcToken> {
437444
let token_response = oidc_client
438445
.exchange_code(openidconnect::AuthorizationCode::new(
439446
oidc_callback_params.code,
440447
))?
441448
.request_async(&AwcHttpClient::from_client(http_client))
442449
.await
443450
.context("Failed to exchange code for token")?;
444-
Ok(token_response)
445-
}
446-
447-
fn set_auth_cookie(
448-
response: &mut HttpResponse,
449-
token_response: &OidcTokenResponse,
450-
) -> anyhow::Result<()> {
451451
let access_token = token_response.access_token();
452452
log::trace!("Received access token: {}", access_token.secret());
453453
let id_token = token_response
454454
.id_token()
455455
.context("No ID token found in the token response. You may have specified an oauth2 provider that does not support OIDC.")?;
456+
Ok(id_token.clone())
457+
}
456458

459+
fn set_auth_cookie(response: &mut HttpResponse, id_token: &OidcToken) -> anyhow::Result<()> {
457460
let id_token_str = id_token.to_string();
458461
log::trace!("Setting auth cookie: {SQLPAGE_AUTH_COOKIE_NAME}=\"{id_token_str}\"");
459462
let id_token_size_kb = id_token_str.len() / 1024;

0 commit comments

Comments
 (0)