@@ -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