Skip to content

Commit 06292a9

Browse files
committed
OIDC token: implementing max age for auth cookies based on ID token expiration
Refactor claims retrieval in get_authenticated_user_info to return claims directly.
1 parent edf36b3 commit 06292a9

File tree

1 file changed

+11
-2
lines changed

1 file changed

+11
-2
lines changed

src/webserver/oidc.rs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ use actix_web::{
1313
};
1414
use anyhow::{anyhow, Context};
1515
use awc::Client;
16+
use chrono::Utc;
1617
use openidconnect::{
1718
core::CoreAuthenticationFlow, url::Url, AsyncHttpClient, CsrfToken, EndpointMaybeSet,
1819
EndpointNotSet, EndpointSet, IssuerUrl, Nonce, OAuth2TokenResponse, RedirectUrl, Scope,
@@ -296,7 +297,7 @@ async fn process_oidc_callback(
296297
log::debug!("Received token response: {token_response:?}");
297298

298299
let mut response = build_redirect_response(state.initial_url);
299-
set_auth_cookie(&mut response, &token_response)?;
300+
set_auth_cookie(&mut response, &token_response, oidc_client)?;
300301
Ok(response)
301302
}
302303

@@ -317,18 +318,26 @@ async fn exchange_code_for_token(
317318
fn set_auth_cookie(
318319
response: &mut HttpResponse,
319320
token_response: &openidconnect::core::CoreTokenResponse,
321+
oidc_client: &OidcClient,
320322
) -> anyhow::Result<()> {
321323
let access_token = token_response.access_token();
322324
log::trace!("Received access token: {}", access_token.secret());
323325
let id_token = token_response
324326
.id_token()
325327
.context("No ID token found in the token response. You may have specified an oauth2 provider that does not support OIDC.")?;
326328

329+
let id_token_verifier = oidc_client.id_token_verifier();
330+
let nonce_verifier = |_nonce: Option<&Nonce>| Ok(()); // The nonce will be verified in request handling
331+
let claims = id_token.claims(&id_token_verifier, nonce_verifier)?;
332+
let expiration = claims.expiration();
333+
let max_age_seconds = expiration.signed_duration_since(Utc::now()).num_seconds();
334+
327335
let id_token_str = id_token.to_string();
328336
log::trace!("Setting auth cookie: {SQLPAGE_AUTH_COOKIE_NAME}=\"{id_token_str}\"");
329337
let cookie = Cookie::build(SQLPAGE_AUTH_COOKIE_NAME, id_token_str)
330338
.secure(true)
331339
.http_only(true)
340+
.max_age(actix_web::cookie::time::Duration::seconds(max_age_seconds))
332341
.same_site(actix_web::cookie::SameSite::Lax)
333342
.path("/")
334343
.finish();
@@ -378,7 +387,7 @@ fn get_authenticated_user_info(
378387
.with_context(|| format!("Could not verify the ID token: {cookie_value:?}"))?
379388
.clone();
380389
log::debug!("The current user is: {claims:?}");
381-
Ok(Some(claims.clone()))
390+
Ok(Some(claims))
382391
}
383392

384393
pub struct AwcHttpClient<'c> {

0 commit comments

Comments
 (0)