@@ -13,6 +13,7 @@ use actix_web::{
13
13
} ;
14
14
use anyhow:: { anyhow, Context } ;
15
15
use awc:: Client ;
16
+ use chrono:: Utc ;
16
17
use openidconnect:: {
17
18
core:: CoreAuthenticationFlow , url:: Url , AsyncHttpClient , CsrfToken , EndpointMaybeSet ,
18
19
EndpointNotSet , EndpointSet , IssuerUrl , Nonce , OAuth2TokenResponse , RedirectUrl , Scope ,
@@ -296,7 +297,7 @@ async fn process_oidc_callback(
296
297
log:: debug!( "Received token response: {token_response:?}" ) ;
297
298
298
299
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 ) ?;
300
301
Ok ( response)
301
302
}
302
303
@@ -317,18 +318,26 @@ async fn exchange_code_for_token(
317
318
fn set_auth_cookie (
318
319
response : & mut HttpResponse ,
319
320
token_response : & openidconnect:: core:: CoreTokenResponse ,
321
+ oidc_client : & OidcClient ,
320
322
) -> anyhow:: Result < ( ) > {
321
323
let access_token = token_response. access_token ( ) ;
322
324
log:: trace!( "Received access token: {}" , access_token. secret( ) ) ;
323
325
let id_token = token_response
324
326
. id_token ( )
325
327
. context ( "No ID token found in the token response. You may have specified an oauth2 provider that does not support OIDC." ) ?;
326
328
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
+
327
335
let id_token_str = id_token. to_string ( ) ;
328
336
log:: trace!( "Setting auth cookie: {SQLPAGE_AUTH_COOKIE_NAME}=\" {id_token_str}\" " ) ;
329
337
let cookie = Cookie :: build ( SQLPAGE_AUTH_COOKIE_NAME , id_token_str)
330
338
. secure ( true )
331
339
. http_only ( true )
340
+ . max_age ( actix_web:: cookie:: time:: Duration :: seconds ( max_age_seconds) )
332
341
. same_site ( actix_web:: cookie:: SameSite :: Lax )
333
342
. path ( "/" )
334
343
. finish ( ) ;
@@ -378,7 +387,7 @@ fn get_authenticated_user_info(
378
387
. with_context ( || format ! ( "Could not verify the ID token: {cookie_value:?}" ) ) ?
379
388
. clone ( ) ;
380
389
log:: debug!( "The current user is: {claims:?}" ) ;
381
- Ok ( Some ( claims. clone ( ) ) )
390
+ Ok ( Some ( claims) )
382
391
}
383
392
384
393
pub struct AwcHttpClient < ' c > {
0 commit comments