From 4d97173176d74aa5b465e738d815df94140180be Mon Sep 17 00:00:00 2001 From: Sebastian Pravda Date: Mon, 31 Oct 2022 09:22:23 +0100 Subject: [PATCH 1/4] feat: session auth guard --- .../guards/request/candidate_refresh_token.rs | 28 +++++++++++++------ api/src/lib.rs | 14 ++-------- 2 files changed, 23 insertions(+), 19 deletions(-) diff --git a/api/src/guards/request/candidate_refresh_token.rs b/api/src/guards/request/candidate_refresh_token.rs index cf91f1a..681d33b 100644 --- a/api/src/guards/request/candidate_refresh_token.rs +++ b/api/src/guards/request/candidate_refresh_token.rs @@ -1,27 +1,39 @@ +use entity::candidate::Model; use portfolio_core::sea_orm::prelude::Uuid; +use portfolio_core::services::candidate_service::CandidateService; use rocket::http::Status; use rocket::outcome::Outcome; use rocket::request::{FromRequest, Request}; +use crate::pool::Db; -pub struct UUIDCookie(Uuid); -impl Into for UUIDCookie { - fn into(self) -> Uuid { +pub struct SessionAuth(Model); + +impl SessionAuth { + pub fn model(self) -> Model { // TODO: use into_inner instead? self.0 } } #[rocket::async_trait] -impl<'r> FromRequest<'r> for UUIDCookie { +impl<'r> FromRequest<'r> for SessionAuth { type Error = Option; - async fn from_request(req: &'r Request<'_>) -> Outcome { + async fn from_request(req: &'r Request<'_>) -> Outcome { let session_id = req.cookies().get("id").unwrap().name_value().1; - println!("session_id: {}", session_id); + let conn = &req.rocket().state::().unwrap().conn; - match Uuid::parse_str(&session_id) { - Ok(uuid) => Outcome::Success(UUIDCookie(uuid)), + let uuid = match Uuid::parse_str(&session_id) { + Ok(uuid) => uuid, Err(_) => return Outcome::Failure((Status::BadRequest, None)), + }; + + let session = CandidateService::auth_user_session(conn, uuid).await; + + match session { + Ok(model) => Outcome::Success(SessionAuth(model)), + Err(_) => Outcome::Failure((Status::Unauthorized, None)), } + } } diff --git a/api/src/lib.rs b/api/src/lib.rs index 63e9dc3..0210675 100644 --- a/api/src/lib.rs +++ b/api/src/lib.rs @@ -3,6 +3,7 @@ extern crate rocket; use std::net::SocketAddr; +use guards::request::candidate_refresh_token::SessionAuth; use portfolio_core::error::ServiceError; use portfolio_core::services::candidate_service::CandidateService; use requests::{LoginRequest, RegisterRequest}; @@ -29,8 +30,6 @@ pub use entity::candidate::Entity as Candidate; use portfolio_core::crypto::random_8_char_string; -use crate::guards::request::candidate_refresh_token::UUIDCookie; - fn custom_err_from_service_err(service_err: ServiceError) -> Custom { Custom(Status::from_code(service_err.0.code).unwrap_or_default(), service_err.1.to_string()) } @@ -50,15 +49,8 @@ async fn create(conn: Connection<'_, Db>, post_form: Json) -> R } #[get("/whoami")] -async fn validate(conn: Connection<'_, Db>, uuid_cookie: Result>) -> Result> { - let db = conn.into_inner(); - let user = CandidateService::auth_user_session(db, uuid_cookie.ok().unwrap().into()).await; - - - match user { - Ok(user) => Ok(user.application.to_string()), - Err(err) => Err(custom_err_from_service_err(err)) - } +async fn validate(session: SessionAuth) -> Result> { + Ok(session.model().application.to_string()) } #[post("/login", data = "")] From 06553679fb387760616a51c999170f358a7b7b36 Mon Sep 17 00:00:00 2001 From: EETagent Date: Mon, 31 Oct 2022 11:29:51 +0100 Subject: [PATCH 2/4] refactor: use from trait for type conversion --- api/src/guards/request/candidate_refresh_token.rs | 13 ++++++------- api/src/lib.rs | 3 ++- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/api/src/guards/request/candidate_refresh_token.rs b/api/src/guards/request/candidate_refresh_token.rs index 681d33b..ffc5b8e 100644 --- a/api/src/guards/request/candidate_refresh_token.rs +++ b/api/src/guards/request/candidate_refresh_token.rs @@ -1,4 +1,4 @@ -use entity::candidate::Model; +use entity::candidate::Model as Candidate; use portfolio_core::sea_orm::prelude::Uuid; use portfolio_core::services::candidate_service::CandidateService; use rocket::http::Status; @@ -7,15 +7,14 @@ use rocket::request::{FromRequest, Request}; use crate::pool::Db; +pub struct SessionAuth(Candidate); -pub struct SessionAuth(Model); - -impl SessionAuth { - pub fn model(self) -> Model { // TODO: use into_inner instead? - self.0 +impl From for Candidate { + fn from(src: SessionAuth) -> Candidate { + src.0 } } - + #[rocket::async_trait] impl<'r> FromRequest<'r> for SessionAuth { type Error = Option; diff --git a/api/src/lib.rs b/api/src/lib.rs index 0210675..8c39005 100644 --- a/api/src/lib.rs +++ b/api/src/lib.rs @@ -50,7 +50,8 @@ async fn create(conn: Connection<'_, Db>, post_form: Json) -> R #[get("/whoami")] async fn validate(session: SessionAuth) -> Result> { - Ok(session.model().application.to_string()) + let candidate: entity::candidate::Model = session.into(); + Ok(candidate.application.to_string()) } #[post("/login", data = "")] From 09c9ce471c7b5e370e0f144388ce3b9c078610c2 Mon Sep 17 00:00:00 2001 From: EETagent Date: Mon, 31 Oct 2022 11:34:49 +0100 Subject: [PATCH 3/4] refactor: use into --- api/src/guards/request/candidate_refresh_token.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/api/src/guards/request/candidate_refresh_token.rs b/api/src/guards/request/candidate_refresh_token.rs index ffc5b8e..273c360 100644 --- a/api/src/guards/request/candidate_refresh_token.rs +++ b/api/src/guards/request/candidate_refresh_token.rs @@ -9,9 +9,9 @@ use crate::pool::Db; pub struct SessionAuth(Candidate); -impl From for Candidate { - fn from(src: SessionAuth) -> Candidate { - src.0 +impl Into for SessionAuth { + fn into(self) -> Candidate { + self.0 } } From b3556df42c1ed167b9e2a3f9acc2e86e1a26ce7b Mon Sep 17 00:00:00 2001 From: Sebastian Pravda Date: Mon, 31 Oct 2022 13:23:09 +0100 Subject: [PATCH 4/4] refactor: rename file --- api/src/guards/request/mod.rs | 2 +- .../request/{candidate_refresh_token.rs => session_auth.rs} | 0 api/src/lib.rs | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename api/src/guards/request/{candidate_refresh_token.rs => session_auth.rs} (100%) diff --git a/api/src/guards/request/mod.rs b/api/src/guards/request/mod.rs index bdf6937..066d9a7 100644 --- a/api/src/guards/request/mod.rs +++ b/api/src/guards/request/mod.rs @@ -1 +1 @@ -pub mod candidate_refresh_token; \ No newline at end of file +pub mod session_auth; \ No newline at end of file diff --git a/api/src/guards/request/candidate_refresh_token.rs b/api/src/guards/request/session_auth.rs similarity index 100% rename from api/src/guards/request/candidate_refresh_token.rs rename to api/src/guards/request/session_auth.rs diff --git a/api/src/lib.rs b/api/src/lib.rs index 8c39005..47e615a 100644 --- a/api/src/lib.rs +++ b/api/src/lib.rs @@ -3,7 +3,7 @@ extern crate rocket; use std::net::SocketAddr; -use guards::request::candidate_refresh_token::SessionAuth; +use guards::request::session_auth::SessionAuth; use portfolio_core::error::ServiceError; use portfolio_core::services::candidate_service::CandidateService; use requests::{LoginRequest, RegisterRequest};