Files
imphnen-backend-service/imphnen-middleware/src/auth_middleware/mod.rs
T

54 lines
1.3 KiB
Rust
Raw Normal View History

2025-04-06 22:13:46 +07:00
use axum::{
2025-04-07 20:41:14 +07:00
Extension, extract::Request, http::StatusCode, middleware::Next,
2025-04-06 22:13:46 +07:00
response::Response,
};
2025-05-20 00:26:24 +07:00
use imphnen_iam::{UsersDetailQueryDto, UsersRepository};
2025-04-07 20:41:14 +07:00
use imphnen_libs::AppState;
use imphnen_utils::{common_response, extract_email, extract_email_async};
2025-04-06 22:13:46 +07:00
use std::convert::Infallible;
pub async fn auth_middleware(
Extension(state): Extension<AppState>,
mut req: Request,
next: Next,
) -> Result<Response, Infallible> {
let headers = req.headers();
// Try synchronous email extraction first (for internal JWT tokens)
2025-04-06 22:13:46 +07:00
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",
));
}
}
2025-04-06 22:13:46 +07:00
}
};
2025-04-06 22:13:46 +07:00
let repository = UsersRepository::new(&state);
2025-05-20 00:26:24 +07:00
let user: Option<UsersDetailQueryDto> =
2025-04-06 22:13:46 +07:00
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());
Ok(next.run(req).await)
}