From 228ca67a1669fbe7fff59350f2e37e002aec7c8a Mon Sep 17 00:00:00 2001 From: phoenix Date: Fri, 1 Aug 2025 20:04:33 +0000 Subject: [PATCH] Create token refactor (#53) Reviewed-on: https://git.kundeng.us/phoenix/icarus_models/pulls/53 Co-authored-by: phoenix Co-committed-by: phoenix --- Cargo.lock | 2 +- Cargo.toml | 2 +- src/token.rs | 54 +++++++++++++++++++++++++++++++++++++++++----------- 3 files changed, 45 insertions(+), 13 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6df3cab..b9df5e2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -142,7 +142,7 @@ checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" [[package]] name = "icarus_models" -version = "0.5.2" +version = "0.5.3" dependencies = [ "josekit", "rand", diff --git a/Cargo.toml b/Cargo.toml index db65653..6bac4f5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "icarus_models" -version = "0.5.2" +version = "0.5.3" edition = "2024" rust-version = "1.88" description = "models used for the icarus project" diff --git a/src/token.rs b/src/token.rs index 68f355a..7655671 100644 --- a/src/token.rs +++ b/src/token.rs @@ -66,11 +66,6 @@ pub fn get_issued() -> time::Result { Ok(time::OffsetDateTime::now_utc()) } -pub fn get_expiration(issued: &time::OffsetDateTime) -> Result { - let duration_expire = time::Duration::hours(4); - Ok(*issued + duration_expire) -} - mod util { pub fn time_to_std_time( provided_time: &time::OffsetDateTime, @@ -80,22 +75,33 @@ mod util { } } +#[derive(Debug)] +pub struct TokenResource { + pub message: String, + pub issuer: String, + pub audiences: Vec, +} + +pub const TOKEN_TYPE: &str = "JWT"; + pub fn create_token( key: &String, - message: &String, - issuer: &String, - audience: &String, + token_resource: &TokenResource, + duration: time::Duration, ) -> Result<(String, i64), josekit::JoseError> { let mut header = josekit::jws::JwsHeader::new(); - header.set_token_type("JWT"); + header.set_token_type(TOKEN_TYPE); let mut payload = josekit::jwt::JwtPayload::new(); + let message = &token_resource.message; + let issuer = &token_resource.issuer; + let audiences: &Vec = &token_resource.audiences; payload.set_subject(message); payload.set_issuer(issuer); - payload.set_audience(vec![audience]); + payload.set_audience(audiences.clone()); match get_issued() { Ok(issued) => { - let expire = get_expiration(&issued).unwrap(); + let expire = issued + duration; payload.set_issued_at(&util::time_to_std_time(&issued).unwrap()); payload.set_expires_at(&util::time_to_std_time(&expire).unwrap()); @@ -129,4 +135,30 @@ mod tests { check_scope, token.scope ); } + + #[test] + fn test_token_creation() { + let key = String::from( + "c3092urmc2219ix320i40m293ic29IM09IN0u879Y8B98YB8yb86TN7B55R4yv4RCVU6Bi8YO8U", + ); + let test_token_resource = TokenResource { + issuer: String::from("icarus_auth_test"), + message: String::from("Authorization"), + audiences: vec![String::from("icarus_test")], + }; + let token_expiration_duration = time::Duration::hours(2); + + match create_token(&key, &test_token_resource, token_expiration_duration) { + Ok((token, expire_duration)) => { + assert_eq!(false, token.is_empty(), "Error: Token is empty"); + assert!( + expire_duration > 0, + "Token expire duration is invalid {expire_duration:?}" + ); + } + Err(err) => { + assert!(false, "Error: {err:?}"); + } + } + } }