From 01e20baa4517446964fddea5d9946c88c4b548b6 Mon Sep 17 00:00:00 2001 From: MythEclipse Date: Thu, 14 Aug 2025 23:16:41 +0700 Subject: [PATCH] feat: Add axum-extra dependency and refactor auth middleware for improved token handling --- Cargo.lock | 1 + imphnen-middleware/Cargo.toml | 1 + imphnen-middleware/src/auth_middleware/mod.rs | 66 +++++++------------ 3 files changed, 27 insertions(+), 41 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ebdb496..1e5a85e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2314,6 +2314,7 @@ version = "0.1.0" dependencies = [ "anyhow", "axum", + "axum-extra", "axum-test", "chrono", "futures", diff --git a/imphnen-middleware/Cargo.toml b/imphnen-middleware/Cargo.toml index 796ddc2..b194f42 100644 --- a/imphnen-middleware/Cargo.toml +++ b/imphnen-middleware/Cargo.toml @@ -9,6 +9,7 @@ imphnen-libs.workspace = true imphnen-utils.workspace = true imphnen-entities.workspace = true axum.workspace = true +axum-extra.workspace = true serde.workspace = true serde_json.workspace = true utoipa.workspace = true diff --git a/imphnen-middleware/src/auth_middleware/mod.rs b/imphnen-middleware/src/auth_middleware/mod.rs index d5a5242..15ce018 100644 --- a/imphnen-middleware/src/auth_middleware/mod.rs +++ b/imphnen-middleware/src/auth_middleware/mod.rs @@ -2,52 +2,36 @@ use axum::{ Extension, extract::Request, http::StatusCode, middleware::Next, response::Response, }; -use imphnen_iam::{UsersDetailQueryDto, UsersRepository}; -use imphnen_libs::AppState; -use imphnen_utils::{common_response, extract_email, extract_email_async}; +use imphnen_libs::{AppState, jsonwebtoken::decode_access_token}; +use imphnen_utils::common_response; +use axum_extra::headers::{authorization::Bearer, Authorization, HeaderMapExt}; use std::convert::Infallible; pub async fn auth_middleware( - Extension(state): Extension, + Extension(_state): Extension, // state is currently unused in this middleware mut req: Request, next: Next, ) -> Result { - let headers = req.headers(); - - // Try synchronous email extraction first (for internal JWT tokens) - let email = match extract_email(headers) { - Some(email) => email, - None => { - // If sync extraction fails, try async (for Google tokens) - match extract_email_async(headers).await { - Some(email) => email, - None => { - return Ok(common_response( - StatusCode::UNAUTHORIZED, - "Invalid or expired token", - )); - } - } - } - }; - - let repository = UsersRepository::new(&state); - let user: Option = - match repository.query_user_by_email(email).await { - Ok(user) => Some(user), - Err(err) => { - return Ok(common_response( - StatusCode::INTERNAL_SERVER_ERROR, - &err.to_string(), - )); - } - }; - if user.is_none() { - return Ok(common_response( - StatusCode::UNAUTHORIZED, - "Unauthorized user", - )); - } - req.extensions_mut().insert(user.unwrap()); + let auth_header = match req + .headers() + .typed_get::>() { + Some(header) => header, + None => return Ok(common_response( + StatusCode::UNAUTHORIZED, + "Invalid or missing authorization token", + )), + }; + + let token = auth_header.token(); + + let claims = match decode_access_token(token) { + Ok(token_data) => token_data.claims, + Err(_) => return Ok(common_response( + StatusCode::UNAUTHORIZED, + "Invalid or expired token", + )), + }; + + req.extensions_mut().insert(claims); Ok(next.run(req).await) }