From 11f01a6156eda64f008486b2a4e7697d15a1eddf Mon Sep 17 00:00:00 2001 From: Vitor Hideyoshi Nakazone Batista Date: Sun, 25 Feb 2024 02:10:43 -0300 Subject: [PATCH] Initial Implementation of AuthService --- Cargo.lock | 1 + Cargo.toml | 1 + src/main.rs | 1 + src/middleware/auth_middleware.rs | 37 +++++-------------------------- src/route.rs | 27 +++++++++++++++++----- src/service/auth_service.rs | 35 +++++++++++++++++++++++++++++ src/service/email_service.rs | 8 +++++++ src/service/mod.rs | 2 ++ 8 files changed, 75 insertions(+), 37 deletions(-) create mode 100644 src/service/auth_service.rs create mode 100644 src/service/email_service.rs create mode 100644 src/service/mod.rs diff --git a/Cargo.lock b/Cargo.lock index 108f6b0..de2b4c0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -851,6 +851,7 @@ dependencies = [ "dotenv", "headers", "http 1.0.0", + "log", "reqwest", "serde", "serde_json", diff --git a/Cargo.toml b/Cargo.toml index ecc3a2b..21b341c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,3 +18,4 @@ reqwest = "0.11.24" serde_json = "1.0.114" cached = "0.49.2" dotenv = "0.15.0" +log = "0.4.20" diff --git a/src/main.rs b/src/main.rs index 93d36d7..b52f29a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,6 +3,7 @@ mod middleware; mod model; mod route; mod config; +mod service; use crate::config::config_server; diff --git a/src/middleware/auth_middleware.rs b/src/middleware/auth_middleware.rs index 2e8bf46..ff73ded 100644 --- a/src/middleware/auth_middleware.rs +++ b/src/middleware/auth_middleware.rs @@ -1,19 +1,12 @@ -use axum::{ - response::Response, - middleware::Next, - extract::Request, - http::StatusCode, -}; -use reqwest::header::AUTHORIZATION; -use crate::model::send_message::MessageAuthor; -use crate::config::config_auth; +use axum::{response::Response, middleware::Next, extract::Request, http::StatusCode, Extension}; +use crate::service::auth_service::AuthService; -pub async fn auth_middleware(mut request: Request, next: Next) -> Result { + +pub async fn auth_middleware(Extension(auth_service): Extension, mut request: Request, next: Next) -> Result { let token = get_token(&request).ok_or(StatusCode::UNAUTHORIZED)?; - return match validate_token(&token).await { + return match auth_service.validate_token(&token).await { Some(author) => { - println!("Author: {:?}", author); request.extensions_mut().insert(author); Ok(next.run(request).await) }, @@ -26,24 +19,4 @@ fn get_token(req: &Request) -> Option { .get(http::header::AUTHORIZATION) .and_then(|header| header.to_str().ok()) .map(|header| header.replace("Bearer ", "")) -} - -async fn validate_token(token: &str) -> Option { - println!("Received token: {}", token); - - let auth_config = config_auth::get_config_auth(); - - let validation_url = format!("{}/user/login/validate", auth_config.auth_url); - - let client = reqwest::Client::new(); - let response = client.post(validation_url.as_str()) - .header(AUTHORIZATION, format!("Bearer {}", token)) - .send().await.unwrap(); - - if response.status().is_success() { - let text = response.text().await.unwrap(); - return serde_json::from_str(&text).unwrap(); - } - - None } \ No newline at end of file diff --git a/src/route.rs b/src/route.rs index 4bb5c7a..de174e2 100644 --- a/src/route.rs +++ b/src/route.rs @@ -1,12 +1,29 @@ use crate::handler::health::health_check; use crate::handler::message::send_message; -use axum::{routing::{get, post}, Router, middleware}; +use axum::{routing::{get, post}, Router, middleware, Extension}; +use crate::config::config_auth; use crate::middleware::auth_middleware::auth_middleware; +use crate::service::auth_service::AuthService; +use crate::service::email_service::EmailService; + + +fn configure_message_endpoint(router: Router) -> Router { + router.route("/message", post(send_message)) + .layer(middleware::from_fn(auth_middleware)) + .layer(Extension(AuthService::new(config_auth::get_config_auth()))) + .layer(Extension(EmailService::new())) +} + +fn configure_health_endpoint(router: Router) -> Router { + router.route("/health", get(health_check)) +} pub fn create_route() -> Router { - Router::new() - .route("/message", post(send_message)) - .layer(middleware::from_fn(auth_middleware)) - .route("/health", get(health_check)) + let mut router = Router::new(); + + router = configure_message_endpoint(router); + router = configure_health_endpoint(router); + + router } diff --git a/src/service/auth_service.rs b/src/service/auth_service.rs new file mode 100644 index 0000000..46fe3a8 --- /dev/null +++ b/src/service/auth_service.rs @@ -0,0 +1,35 @@ +use reqwest::header::AUTHORIZATION; +use crate::config::config_auth::ConfigAuth; +use crate::model::send_message::MessageAuthor; + + +#[derive(Clone)] +pub struct AuthService { + auth_url: String, +} + +impl AuthService { + pub fn new(config_auth: ConfigAuth) -> Self { + AuthService { + auth_url: config_auth.auth_url, + } + } + + pub async fn validate_token(&self, token: &str) -> Option { + println!("Received token: {}", token); + + let validation_url = format!("{}/user/login/validate", self.auth_url); + + let client = reqwest::Client::new(); + let response = client.post(validation_url.as_str()) + .header(AUTHORIZATION, format!("Bearer {}", token)) + .send().await.unwrap(); + + if response.status().is_success() { + let text = response.text().await.unwrap(); + return serde_json::from_str(&text).unwrap(); + } + + None + } +} \ No newline at end of file diff --git a/src/service/email_service.rs b/src/service/email_service.rs new file mode 100644 index 0000000..1db94fa --- /dev/null +++ b/src/service/email_service.rs @@ -0,0 +1,8 @@ +#[derive(Clone)] +pub struct EmailService {} + +impl EmailService { + pub fn new() -> Self { + EmailService {} + } +} \ No newline at end of file diff --git a/src/service/mod.rs b/src/service/mod.rs new file mode 100644 index 0000000..b236267 --- /dev/null +++ b/src/service/mod.rs @@ -0,0 +1,2 @@ +pub mod auth_service; +pub mod email_service; \ No newline at end of file