@@ -13,6 +13,7 @@ use actix_web::{
1313} ;
1414use anyhow:: { anyhow, Context } ;
1515use awc:: Client ;
16+ use chrono:: Utc ;
1617use 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(
317318fn 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
384393pub struct AwcHttpClient < ' c > {
0 commit comments