From 5f8aed67ef28356b89d08b22294a4b5d59d87763 Mon Sep 17 00:00:00 2001 From: artem Date: Sat, 11 Jan 2025 17:13:01 +0200 Subject: [PATCH 1/6] feat:add-login-admin --- "\\" | 1 + src/api/admin/post.rs | 22 ++++++++++++++++++++++ src/dto/request/admin/admin.rs | 6 ++++++ src/dto/request/admin/mod.rs | 1 + src/dto/request/mod.rs | 1 + src/server.rs | 2 ++ src/utils/admin/create_jwt.rs | 29 +++++++++++++++++++++++++++++ src/utils/admin/mod.rs | 1 + src/utils/mod.rs | 1 + 9 files changed, 64 insertions(+) create mode 100644 "\\" create mode 100644 src/dto/request/admin/admin.rs create mode 100644 src/dto/request/admin/mod.rs create mode 100644 src/utils/admin/create_jwt.rs create mode 100644 src/utils/admin/mod.rs diff --git "a/\\" "b/\\" new file mode 100644 index 0000000..9ab753e --- /dev/null +++ "b/\\" @@ -0,0 +1 @@ +pub mod create_jwt; diff --git a/src/api/admin/post.rs b/src/api/admin/post.rs index 8b13789..474f0e6 100644 --- a/src/api/admin/post.rs +++ b/src/api/admin/post.rs @@ -1 +1,23 @@ +use crate::dto::request::admin::admin::LoginAdminData; +use crate::error::api_error::ApiError; +use crate::utils::admin::create_jwt; +use crate::utils::env_configuration::EnvConfiguration; +use crate::utils::prelude_api::*; +use rocket::post; +#[post("/admin/admin_login", data = "")] +pub async fn admin_login(data: Json) -> Result { + let data = data.into_inner(); + let LoginAdminData { admin_password } = data; + let password_env = EnvConfiguration::get().admin_password.to_owned(); + if password_env != admin_password { + return Err(ApiError::ValidationError("passow".to_string())); + } + match create_jwt::create_jwt(admin_password) { + Ok(token) => Ok(format!("{}", token)), + Err(err) => { + println!("Ошибка при создании токена: {:?}", err); // Печатаем ошибку + Err(ApiError::TokenGenerationError(err.to_string())) // Возвращаем ошибку с нужным типом + } + } +} diff --git a/src/dto/request/admin/admin.rs b/src/dto/request/admin/admin.rs new file mode 100644 index 0000000..ecc1582 --- /dev/null +++ b/src/dto/request/admin/admin.rs @@ -0,0 +1,6 @@ +use serde::Deserialize; + +#[derive(Deserialize)] +pub struct LoginAdminData { + pub admin_password: String, +} diff --git a/src/dto/request/admin/mod.rs b/src/dto/request/admin/mod.rs new file mode 100644 index 0000000..92918b0 --- /dev/null +++ b/src/dto/request/admin/mod.rs @@ -0,0 +1 @@ +pub mod admin; diff --git a/src/dto/request/mod.rs b/src/dto/request/mod.rs index 2086991..5fa4650 100644 --- a/src/dto/request/mod.rs +++ b/src/dto/request/mod.rs @@ -1,2 +1,3 @@ +pub mod admin; pub mod hackathon_2024; pub mod user; diff --git a/src/server.rs b/src/server.rs index 4683702..5f518ed 100644 --- a/src/server.rs +++ b/src/server.rs @@ -83,6 +83,8 @@ impl Server { api::hackathon_2024::team::get::by_id, api::hackathon_2024::team::put::by_id, api::hackathon_2024::team::delete::by_id, + // /adnmin/ + api::admin::post::admin_login, // /other/* ], ) diff --git a/src/utils/admin/create_jwt.rs b/src/utils/admin/create_jwt.rs new file mode 100644 index 0000000..2b1f695 --- /dev/null +++ b/src/utils/admin/create_jwt.rs @@ -0,0 +1,29 @@ +use crate::error::api_error::ApiError; +use crate::utils::env_configuration::EnvConfiguration; +use chrono::{Duration, Utc}; +use jsonwebtoken::{encode, EncodingKey, Header}; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Serialize, Deserialize)] +struct Claims { + sub: String, + exp: u64, +} + +pub fn create_jwt(data_for_jwt: String) -> Result { + let my_claims = Claims { + sub: data_for_jwt, + exp: (Utc::now() + Duration::hours(24)).timestamp() as u64, + }; + + let secret_key = EnvConfiguration::get().jwt_secret.to_owned(); + + let token = encode( + &Header::default(), + &my_claims, + &EncodingKey::from_secret(secret_key.as_bytes()), + ) + .map_err(|err| ApiError::TokenGenerationError(err.to_string()))?; + + Ok(token.to_string()) +} diff --git a/src/utils/admin/mod.rs b/src/utils/admin/mod.rs new file mode 100644 index 0000000..9ab753e --- /dev/null +++ b/src/utils/admin/mod.rs @@ -0,0 +1 @@ +pub mod create_jwt; diff --git a/src/utils/mod.rs b/src/utils/mod.rs index e7ea2b1..e6d49dc 100644 --- a/src/utils/mod.rs +++ b/src/utils/mod.rs @@ -1,4 +1,5 @@ pub mod actions; +pub mod admin; pub mod constants; pub mod env_configuration; pub mod prelude_api; From 3ba0757cc7113009f0578b6c9384ee87038f541f Mon Sep 17 00:00:00 2001 From: artem Date: Sat, 11 Jan 2025 17:37:09 +0200 Subject: [PATCH 2/6] bugfix:fix clippy --- src/api/admin/post.rs | 12 ++++++------ src/dto/request/admin/admin.rs | 6 ------ src/dto/request/admin/login_admin.rs | 7 +++++++ src/dto/request/admin/mod.rs | 2 +- src/utils/{admin => actions}/create_jwt.rs | 2 +- src/utils/actions/mod.rs | 1 + src/utils/admin/mod.rs | 1 - src/utils/mod.rs | 2 +- 8 files changed, 17 insertions(+), 16 deletions(-) delete mode 100644 src/dto/request/admin/admin.rs create mode 100644 src/dto/request/admin/login_admin.rs rename src/utils/{admin => actions}/create_jwt.rs (97%) delete mode 100644 src/utils/admin/mod.rs diff --git a/src/api/admin/post.rs b/src/api/admin/post.rs index 474f0e6..0040f90 100644 --- a/src/api/admin/post.rs +++ b/src/api/admin/post.rs @@ -1,6 +1,6 @@ -use crate::dto::request::admin::admin::LoginAdminData; +use crate::dto::request::admin::login_admin::LoginAdminData; use crate::error::api_error::ApiError; -use crate::utils::admin::create_jwt; +use crate::utils::actions; use crate::utils::env_configuration::EnvConfiguration; use crate::utils::prelude_api::*; use rocket::post; @@ -13,11 +13,11 @@ pub async fn admin_login(data: Json) -> Result if password_env != admin_password { return Err(ApiError::ValidationError("passow".to_string())); } - match create_jwt::create_jwt(admin_password) { - Ok(token) => Ok(format!("{}", token)), + match actions::create_jwt::create_jwt(admin_password) { + Ok(token) => Ok(token), Err(err) => { - println!("Ошибка при создании токена: {:?}", err); // Печатаем ошибку - Err(ApiError::TokenGenerationError(err.to_string())) // Возвращаем ошибку с нужным типом + println!("Ошибка при создании токена: {:?}", err); + Err(ApiError::TokenGenerationError(err.to_string())) } } } diff --git a/src/dto/request/admin/admin.rs b/src/dto/request/admin/admin.rs deleted file mode 100644 index ecc1582..0000000 --- a/src/dto/request/admin/admin.rs +++ /dev/null @@ -1,6 +0,0 @@ -use serde::Deserialize; - -#[derive(Deserialize)] -pub struct LoginAdminData { - pub admin_password: String, -} diff --git a/src/dto/request/admin/login_admin.rs b/src/dto/request/admin/login_admin.rs new file mode 100644 index 0000000..26f45ee --- /dev/null +++ b/src/dto/request/admin/login_admin.rs @@ -0,0 +1,7 @@ +use serde::Deserialize; + +#[derive(Deserialize)] +pub struct LoginAdminData { + pub admin_password: String, +} + diff --git a/src/dto/request/admin/mod.rs b/src/dto/request/admin/mod.rs index 92918b0..7495d3d 100644 --- a/src/dto/request/admin/mod.rs +++ b/src/dto/request/admin/mod.rs @@ -1 +1 @@ -pub mod admin; +pub mod login_admin; diff --git a/src/utils/admin/create_jwt.rs b/src/utils/actions/create_jwt.rs similarity index 97% rename from src/utils/admin/create_jwt.rs rename to src/utils/actions/create_jwt.rs index 2b1f695..ca7a6c5 100644 --- a/src/utils/admin/create_jwt.rs +++ b/src/utils/actions/create_jwt.rs @@ -9,7 +9,7 @@ struct Claims { sub: String, exp: u64, } - +#[allow(dead_code)] pub fn create_jwt(data_for_jwt: String) -> Result { let my_claims = Claims { sub: data_for_jwt, diff --git a/src/utils/actions/mod.rs b/src/utils/actions/mod.rs index eb0b691..21b1ed1 100644 --- a/src/utils/actions/mod.rs +++ b/src/utils/actions/mod.rs @@ -1 +1,2 @@ pub mod send_letter; +pub mod create_jwt; diff --git a/src/utils/admin/mod.rs b/src/utils/admin/mod.rs deleted file mode 100644 index 9ab753e..0000000 --- a/src/utils/admin/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub mod create_jwt; diff --git a/src/utils/mod.rs b/src/utils/mod.rs index e6d49dc..0ff337d 100644 --- a/src/utils/mod.rs +++ b/src/utils/mod.rs @@ -1,7 +1,7 @@ pub mod actions; -pub mod admin; pub mod constants; pub mod env_configuration; pub mod prelude_api; pub mod security; pub mod validation; + From 725ef9a0ae85bebb11c24a4a1509538b18e3dcf9 Mon Sep 17 00:00:00 2001 From: artem Date: Sat, 11 Jan 2025 17:39:44 +0200 Subject: [PATCH 3/6] bugfix/fmt --- src/api/admin/post.rs | 4 ++-- src/dto/request/admin/login_admin.rs | 11 +++++------ src/utils/actions/mod.rs | 2 +- src/utils/mod.rs | 1 - 4 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/api/admin/post.rs b/src/api/admin/post.rs index 0040f90..aab5b48 100644 --- a/src/api/admin/post.rs +++ b/src/api/admin/post.rs @@ -16,8 +16,8 @@ pub async fn admin_login(data: Json) -> Result match actions::create_jwt::create_jwt(admin_password) { Ok(token) => Ok(token), Err(err) => { - println!("Ошибка при создании токена: {:?}", err); - Err(ApiError::TokenGenerationError(err.to_string())) + println!("Ошибка при создании токена: {:?}", err); + Err(ApiError::TokenGenerationError(err.to_string())) } } } diff --git a/src/dto/request/admin/login_admin.rs b/src/dto/request/admin/login_admin.rs index 26f45ee..ecc1582 100644 --- a/src/dto/request/admin/login_admin.rs +++ b/src/dto/request/admin/login_admin.rs @@ -1,7 +1,6 @@ -use serde::Deserialize; - -#[derive(Deserialize)] -pub struct LoginAdminData { - pub admin_password: String, -} +use serde::Deserialize; +#[derive(Deserialize)] +pub struct LoginAdminData { + pub admin_password: String, +} diff --git a/src/utils/actions/mod.rs b/src/utils/actions/mod.rs index 21b1ed1..ab3c6aa 100644 --- a/src/utils/actions/mod.rs +++ b/src/utils/actions/mod.rs @@ -1,2 +1,2 @@ -pub mod send_letter; pub mod create_jwt; +pub mod send_letter; diff --git a/src/utils/mod.rs b/src/utils/mod.rs index 0ff337d..e7ea2b1 100644 --- a/src/utils/mod.rs +++ b/src/utils/mod.rs @@ -4,4 +4,3 @@ pub mod env_configuration; pub mod prelude_api; pub mod security; pub mod validation; - From dc8a503e4cbb2a517db6b457a7331dc38b0292e1 Mon Sep 17 00:00:00 2001 From: artem Date: Sun, 12 Jan 2025 14:12:47 +0200 Subject: [PATCH 4/6] feat:add check token --- src/api/admin/get.rs | 8 ++++++- src/api/admin/post.rs | 12 +++++++++-- src/dto/request/admin/check_jwt.rs | 6 ++++++ src/dto/request/admin/login_admin.rs | 1 + src/dto/request/admin/mod.rs | 1 + src/middleware/get_user.rs | 32 ++++++++++++++++++++++++++++ src/middleware/mod.rs | 1 + src/models/admin/admin_jwt.rs | 9 ++++++++ src/models/admin/mod.rs | 1 + src/models/mod.rs | 1 + src/server.rs | 1 + src/utils/actions/create_jwt.rs | 16 +++++--------- src/utils/actions/decode_jwt.rs | 17 +++++++++++++++ src/utils/actions/mod.rs | 1 + src/utils/env_configuration.rs | 5 +++++ 15 files changed, 98 insertions(+), 14 deletions(-) create mode 100644 src/dto/request/admin/check_jwt.rs create mode 100644 src/middleware/get_user.rs create mode 100644 src/models/admin/admin_jwt.rs create mode 100644 src/models/admin/mod.rs create mode 100644 src/utils/actions/decode_jwt.rs diff --git a/src/api/admin/get.rs b/src/api/admin/get.rs index 8b13789..9f88f17 100644 --- a/src/api/admin/get.rs +++ b/src/api/admin/get.rs @@ -1 +1,7 @@ - +use crate::models::admin::admin_jwt; +use rocket::get; +#[allow(dead_code)] +#[get("/admin/get")] +pub async fn admin_get(claims: admin_jwt::AdminJwt) { + println!("Welcome, user with ID: {}", claims.admin_name); +} diff --git a/src/api/admin/post.rs b/src/api/admin/post.rs index aab5b48..d3ce692 100644 --- a/src/api/admin/post.rs +++ b/src/api/admin/post.rs @@ -8,12 +8,20 @@ use rocket::post; #[post("/admin/admin_login", data = "")] pub async fn admin_login(data: Json) -> Result { let data = data.into_inner(); - let LoginAdminData { admin_password } = data; + let LoginAdminData { + admin_name, + admin_password, + } = data; let password_env = EnvConfiguration::get().admin_password.to_owned(); + let name_env = EnvConfiguration::get().admin_name.to_owned(); + if name_env != admin_name { + return Err(ApiError::ValidationError("name".to_string())); + } + if password_env != admin_password { return Err(ApiError::ValidationError("passow".to_string())); } - match actions::create_jwt::create_jwt(admin_password) { + match actions::create_jwt::create_jwt(admin_password, admin_name) { Ok(token) => Ok(token), Err(err) => { println!("Ошибка при создании токена: {:?}", err); diff --git a/src/dto/request/admin/check_jwt.rs b/src/dto/request/admin/check_jwt.rs new file mode 100644 index 0000000..775cc73 --- /dev/null +++ b/src/dto/request/admin/check_jwt.rs @@ -0,0 +1,6 @@ +use serde::Deserialize; +#[derive(Deserialize)] +#[allow(dead_code)] +pub struct CheckJwtAdminData { + jwt: String, +} diff --git a/src/dto/request/admin/login_admin.rs b/src/dto/request/admin/login_admin.rs index ecc1582..4966832 100644 --- a/src/dto/request/admin/login_admin.rs +++ b/src/dto/request/admin/login_admin.rs @@ -3,4 +3,5 @@ use serde::Deserialize; #[derive(Deserialize)] pub struct LoginAdminData { pub admin_password: String, + pub admin_name: String, } diff --git a/src/dto/request/admin/mod.rs b/src/dto/request/admin/mod.rs index 7495d3d..4651376 100644 --- a/src/dto/request/admin/mod.rs +++ b/src/dto/request/admin/mod.rs @@ -1 +1,2 @@ +pub mod check_jwt; pub mod login_admin; diff --git a/src/middleware/get_user.rs b/src/middleware/get_user.rs new file mode 100644 index 0000000..74d437f --- /dev/null +++ b/src/middleware/get_user.rs @@ -0,0 +1,32 @@ +use crate::models::admin::admin_jwt; +use crate::utils::actions::decode_jwt; +use rocket::http::Status; +use rocket::request::FromRequest; +use rocket::{request, warn, Request}; + +#[rocket::async_trait] +impl<'r> FromRequest<'r> for admin_jwt::AdminJwt { + type Error = (); + + #[allow(dead_code)] + async fn from_request(req: &'r Request<'_>) -> request::Outcome { + let token = req + .headers() + .get_one("Authorization") + .and_then(|header| header.strip_prefix("Bearer ")); + + match token { + Some(token) => match decode_jwt::decode_jwt(token.to_string()) { + Ok(token_data) => request::Outcome::Success(token_data), + Err(e) => { + warn!("Error decoding token: {:?}", e); + request::Outcome::Error((Status::Unauthorized, ())) + } + }, + None => { + warn!("Token not found in header \"Authorization\""); + request::Outcome::Error((Status::Unauthorized, ())) + } + } + } +} diff --git a/src/middleware/mod.rs b/src/middleware/mod.rs index 27abfb0..c6d3a72 100644 --- a/src/middleware/mod.rs +++ b/src/middleware/mod.rs @@ -1,2 +1,3 @@ pub mod admin_match; pub mod claims; +pub mod get_user; diff --git a/src/models/admin/admin_jwt.rs b/src/models/admin/admin_jwt.rs new file mode 100644 index 0000000..e90ab11 --- /dev/null +++ b/src/models/admin/admin_jwt.rs @@ -0,0 +1,9 @@ +use serde::{Deserialize, Serialize}; + +#[allow(dead_code)] +#[derive(Debug, Serialize, Deserialize)] +pub struct AdminJwt { + pub admin_password: String, + pub admin_name: String, + pub exp: u64, +} diff --git a/src/models/admin/mod.rs b/src/models/admin/mod.rs new file mode 100644 index 0000000..0c04a8b --- /dev/null +++ b/src/models/admin/mod.rs @@ -0,0 +1 @@ +pub mod admin_jwt; diff --git a/src/models/mod.rs b/src/models/mod.rs index 60226f9..38246c8 100644 --- a/src/models/mod.rs +++ b/src/models/mod.rs @@ -1 +1,2 @@ +pub mod admin; pub mod hackathon_2024; diff --git a/src/server.rs b/src/server.rs index 5f518ed..32fd2a6 100644 --- a/src/server.rs +++ b/src/server.rs @@ -85,6 +85,7 @@ impl Server { api::hackathon_2024::team::delete::by_id, // /adnmin/ api::admin::post::admin_login, + api::admin::get::admin_get, // /other/* ], ) diff --git a/src/utils/actions/create_jwt.rs b/src/utils/actions/create_jwt.rs index ca7a6c5..098e84f 100644 --- a/src/utils/actions/create_jwt.rs +++ b/src/utils/actions/create_jwt.rs @@ -1,23 +1,17 @@ use crate::error::api_error::ApiError; +use crate::models::admin::admin_jwt; use crate::utils::env_configuration::EnvConfiguration; use chrono::{Duration, Utc}; use jsonwebtoken::{encode, EncodingKey, Header}; -use serde::{Deserialize, Serialize}; -#[derive(Debug, Serialize, Deserialize)] -struct Claims { - sub: String, - exp: u64, -} #[allow(dead_code)] -pub fn create_jwt(data_for_jwt: String) -> Result { - let my_claims = Claims { - sub: data_for_jwt, +pub fn create_jwt(admin_password: String, admin_name: String) -> Result { + let my_claims = admin_jwt::AdminJwt { + admin_password, + admin_name, exp: (Utc::now() + Duration::hours(24)).timestamp() as u64, }; - let secret_key = EnvConfiguration::get().jwt_secret.to_owned(); - let token = encode( &Header::default(), &my_claims, diff --git a/src/utils/actions/decode_jwt.rs b/src/utils/actions/decode_jwt.rs new file mode 100644 index 0000000..198ddb1 --- /dev/null +++ b/src/utils/actions/decode_jwt.rs @@ -0,0 +1,17 @@ +use crate::error::api_error::ApiError; +use crate::models::admin::admin_jwt; +use crate::utils::env_configuration::EnvConfiguration; +use jsonwebtoken::{decode, DecodingKey, Validation}; + +pub fn decode_jwt(token: String) -> Result { + let secret_key = EnvConfiguration::get().jwt_secret.to_owned(); + + match decode::( + &token, + &DecodingKey::from_secret(secret_key.as_bytes()), + &Validation::default(), + ) { + Ok(decoded_token) => Ok(decoded_token.claims), // Return the decoded claims (Admin_Jwt) + Err(err) => Err(ApiError::TokenGenerationError(err.to_string())), + } +} diff --git a/src/utils/actions/mod.rs b/src/utils/actions/mod.rs index ab3c6aa..a9bef24 100644 --- a/src/utils/actions/mod.rs +++ b/src/utils/actions/mod.rs @@ -1,2 +1,3 @@ pub mod create_jwt; +pub mod decode_jwt; pub mod send_letter; diff --git a/src/utils/env_configuration.rs b/src/utils/env_configuration.rs index 35e04dc..dafe9f5 100644 --- a/src/utils/env_configuration.rs +++ b/src/utils/env_configuration.rs @@ -21,6 +21,8 @@ pub struct EnvConfiguration { pub admin_role: UserRoleEnum, */ #[allow(dead_code)] + pub admin_name: String, + #[allow(dead_code)] pub admin_password: String, #[allow(dead_code)] pub jwt_secret: String, @@ -58,6 +60,9 @@ impl EnvConfiguration { ) .parse() .expect("Invalid ADMIN_PASSWORD"), + admin_name: EnvConfiguration::unwrap_env("ADMIN_NAME", Some("ADMIN_NAME".to_owned())) + .parse() + .expect("Invalid ADMIN_NAME"), jwt_secret: EnvConfiguration::unwrap_env("JWT_SECRET", Some("jwt_secret".to_owned())) .parse() .expect("Invalid JWT_SECRET"), From 353d93e5f38201d038e984b6b18ed4f3adbd5bc0 Mon Sep 17 00:00:00 2001 From: artem Date: Mon, 13 Jan 2025 00:53:22 +0200 Subject: [PATCH 5/6] bugfix:change to security decode and encode --- api | 0 src/api/admin/get.rs | 2 +- src/api/admin/post.rs | 21 +++++++++++++-------- src/middleware/get_user.rs | 18 ++++++------------ src/server.rs | 4 ++-- src/utils/actions/create_jwt.rs | 23 ----------------------- src/utils/actions/decode_jwt.rs | 17 ----------------- src/utils/actions/mod.rs | 2 -- 8 files changed, 22 insertions(+), 65 deletions(-) create mode 100644 api delete mode 100644 src/utils/actions/create_jwt.rs delete mode 100644 src/utils/actions/decode_jwt.rs diff --git a/api b/api new file mode 100644 index 0000000..e69de29 diff --git a/src/api/admin/get.rs b/src/api/admin/get.rs index 9f88f17..a8ae2e6 100644 --- a/src/api/admin/get.rs +++ b/src/api/admin/get.rs @@ -2,6 +2,6 @@ use crate::models::admin::admin_jwt; use rocket::get; #[allow(dead_code)] #[get("/admin/get")] -pub async fn admin_get(claims: admin_jwt::AdminJwt) { +pub async fn get(claims: admin_jwt::AdminJwt) { println!("Welcome, user with ID: {}", claims.admin_name); } diff --git a/src/api/admin/post.rs b/src/api/admin/post.rs index d3ce692..0c7c634 100644 --- a/src/api/admin/post.rs +++ b/src/api/admin/post.rs @@ -1,12 +1,14 @@ use crate::dto::request::admin::login_admin::LoginAdminData; use crate::error::api_error::ApiError; -use crate::utils::actions; +use crate::models::admin::admin_jwt; use crate::utils::env_configuration::EnvConfiguration; use crate::utils::prelude_api::*; +use crate::utils::security; +use chrono::{Duration, Utc}; use rocket::post; -#[post("/admin/admin_login", data = "")] -pub async fn admin_login(data: Json) -> Result { +#[post("/admin/login", data = "")] +pub async fn login(data: Json) -> Result { let data = data.into_inner(); let LoginAdminData { admin_name, @@ -21,11 +23,14 @@ pub async fn admin_login(data: Json) -> Result if password_env != admin_password { return Err(ApiError::ValidationError("passow".to_string())); } - match actions::create_jwt::create_jwt(admin_password, admin_name) { + let my_claims = admin_jwt::AdminJwt { + admin_password, + admin_name, + exp: (Utc::now() + Duration::hours(24)).timestamp() as u64, + }; + + match security::encoded_data(&my_claims) { Ok(token) => Ok(token), - Err(err) => { - println!("Ошибка при создании токена: {:?}", err); - Err(ApiError::TokenGenerationError(err.to_string())) - } + Err(err) => Err(ApiError::TokenGenerationError(err.to_string())), } } diff --git a/src/middleware/get_user.rs b/src/middleware/get_user.rs index 74d437f..4d81874 100644 --- a/src/middleware/get_user.rs +++ b/src/middleware/get_user.rs @@ -1,8 +1,8 @@ use crate::models::admin::admin_jwt; -use crate::utils::actions::decode_jwt; +use crate::utils::security; use rocket::http::Status; use rocket::request::FromRequest; -use rocket::{request, warn, Request}; +use rocket::{request, Request}; #[rocket::async_trait] impl<'r> FromRequest<'r> for admin_jwt::AdminJwt { @@ -16,17 +16,11 @@ impl<'r> FromRequest<'r> for admin_jwt::AdminJwt { .and_then(|header| header.strip_prefix("Bearer ")); match token { - Some(token) => match decode_jwt::decode_jwt(token.to_string()) { - Ok(token_data) => request::Outcome::Success(token_data), - Err(e) => { - warn!("Error decoding token: {:?}", e); - request::Outcome::Error((Status::Unauthorized, ())) - } + Some(token) => match security::decoded_data::(token) { + Ok(token_data) => request::Outcome::Success(token_data.claims), + Err(_) => request::Outcome::Error((Status::Unauthorized, ())), }, - None => { - warn!("Token not found in header \"Authorization\""); - request::Outcome::Error((Status::Unauthorized, ())) - } + None => request::Outcome::Error((Status::Unauthorized, ())), } } } diff --git a/src/server.rs b/src/server.rs index 32fd2a6..eec5378 100644 --- a/src/server.rs +++ b/src/server.rs @@ -84,8 +84,8 @@ impl Server { api::hackathon_2024::team::put::by_id, api::hackathon_2024::team::delete::by_id, // /adnmin/ - api::admin::post::admin_login, - api::admin::get::admin_get, + api::admin::post::login, + api::admin::get::get, // /other/* ], ) diff --git a/src/utils/actions/create_jwt.rs b/src/utils/actions/create_jwt.rs deleted file mode 100644 index 098e84f..0000000 --- a/src/utils/actions/create_jwt.rs +++ /dev/null @@ -1,23 +0,0 @@ -use crate::error::api_error::ApiError; -use crate::models::admin::admin_jwt; -use crate::utils::env_configuration::EnvConfiguration; -use chrono::{Duration, Utc}; -use jsonwebtoken::{encode, EncodingKey, Header}; - -#[allow(dead_code)] -pub fn create_jwt(admin_password: String, admin_name: String) -> Result { - let my_claims = admin_jwt::AdminJwt { - admin_password, - admin_name, - exp: (Utc::now() + Duration::hours(24)).timestamp() as u64, - }; - let secret_key = EnvConfiguration::get().jwt_secret.to_owned(); - let token = encode( - &Header::default(), - &my_claims, - &EncodingKey::from_secret(secret_key.as_bytes()), - ) - .map_err(|err| ApiError::TokenGenerationError(err.to_string()))?; - - Ok(token.to_string()) -} diff --git a/src/utils/actions/decode_jwt.rs b/src/utils/actions/decode_jwt.rs deleted file mode 100644 index 198ddb1..0000000 --- a/src/utils/actions/decode_jwt.rs +++ /dev/null @@ -1,17 +0,0 @@ -use crate::error::api_error::ApiError; -use crate::models::admin::admin_jwt; -use crate::utils::env_configuration::EnvConfiguration; -use jsonwebtoken::{decode, DecodingKey, Validation}; - -pub fn decode_jwt(token: String) -> Result { - let secret_key = EnvConfiguration::get().jwt_secret.to_owned(); - - match decode::( - &token, - &DecodingKey::from_secret(secret_key.as_bytes()), - &Validation::default(), - ) { - Ok(decoded_token) => Ok(decoded_token.claims), // Return the decoded claims (Admin_Jwt) - Err(err) => Err(ApiError::TokenGenerationError(err.to_string())), - } -} diff --git a/src/utils/actions/mod.rs b/src/utils/actions/mod.rs index a9bef24..eb0b691 100644 --- a/src/utils/actions/mod.rs +++ b/src/utils/actions/mod.rs @@ -1,3 +1 @@ -pub mod create_jwt; -pub mod decode_jwt; pub mod send_letter; From c346955018f1bc0bf19a1412df75497afda13c64 Mon Sep 17 00:00:00 2001 From: artem Date: Mon, 13 Jan 2025 01:25:32 +0200 Subject: [PATCH 6/6] bugfix: test error add info --- src/api/admin/get.rs | 4 +++- src/api/admin/post.rs | 8 ++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/api/admin/get.rs b/src/api/admin/get.rs index a8ae2e6..342d4a0 100644 --- a/src/api/admin/get.rs +++ b/src/api/admin/get.rs @@ -1,7 +1,9 @@ use crate::models::admin::admin_jwt; +use log::info; use rocket::get; + #[allow(dead_code)] #[get("/admin/get")] pub async fn get(claims: admin_jwt::AdminJwt) { - println!("Welcome, user with ID: {}", claims.admin_name); + info!("Welcome, user with ID: {}", claims.admin_name); } diff --git a/src/api/admin/post.rs b/src/api/admin/post.rs index 0c7c634..941a5b2 100644 --- a/src/api/admin/post.rs +++ b/src/api/admin/post.rs @@ -17,11 +17,15 @@ pub async fn login(data: Json) -> Result { let password_env = EnvConfiguration::get().admin_password.to_owned(); let name_env = EnvConfiguration::get().admin_name.to_owned(); if name_env != admin_name { - return Err(ApiError::ValidationError("name".to_string())); + return Err(ApiError::ValidationError( + "Error validation admin name".to_string(), + )); } if password_env != admin_password { - return Err(ApiError::ValidationError("passow".to_string())); + return Err(ApiError::ValidationError( + "Error validation admin password".to_string(), + )); } let my_claims = admin_jwt::AdminJwt { admin_password,