From bd793db08e06b256ffecd9f4528e55e3026fede7 Mon Sep 17 00:00:00 2001 From: phoenix Date: Wed, 6 Aug 2025 22:45:32 +0000 Subject: [PATCH] Add Id to token (#55) Reviewed-on: https://git.kundeng.us/phoenix/icarus_models/pulls/55 Co-authored-by: phoenix Co-committed-by: phoenix --- Cargo.lock | 2 +- Cargo.toml | 2 +- src/token.rs | 53 ++++++++++++++++++++++++++++++++++++++++++++-------- 3 files changed, 47 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 86e4c76..30c190e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -142,7 +142,7 @@ checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" [[package]] name = "icarus_models" -version = "0.5.4" +version = "0.5.5" dependencies = [ "josekit", "rand", diff --git a/Cargo.toml b/Cargo.toml index ffd2480..1680962 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "icarus_models" -version = "0.5.4" +version = "0.5.5" edition = "2024" rust-version = "1.88" description = "models used for the icarus project" diff --git a/src/token.rs b/src/token.rs index 7655671..5ade1d0 100644 --- a/src/token.rs +++ b/src/token.rs @@ -80,6 +80,7 @@ pub struct TokenResource { pub message: String, pub issuer: String, pub audiences: Vec, + pub id: uuid::Uuid, } pub const TOKEN_TYPE: &str = "JWT"; @@ -99,6 +100,14 @@ pub fn create_token( payload.set_subject(message); payload.set_issuer(issuer); payload.set_audience(audiences.clone()); + if !token_resource.id.is_nil() { + match payload.set_claim("id", Some(serde_json::json!(token_resource.id))) { + Ok(_) => {} + Err(err) => { + return Err(err); + } + } + } match get_issued() { Ok(issued) => { let expire = issued + duration; @@ -121,6 +130,19 @@ pub fn create_token( mod tests { use super::*; + fn test_key() -> String { + String::from("c3092urmc2219ix320i40m293ic29IM09IN0u879Y8B98YB8yb86TN7B55R4yv4RCVU6Bi8YO8U") + } + + fn test_resource() -> TokenResource { + TokenResource { + issuer: String::from("icarus_auth_test"), + message: String::from("Authorization"), + audiences: vec![String::from("icarus_test")], + id: uuid::Uuid::nil(), + } + } + #[test] fn test_token_scope_check() { let mut token = Token::default(); @@ -138,14 +160,29 @@ mod tests { #[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 key = test_key(); + let test_token_resource = test_resource(); + 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:?}"); + } + } + } + + #[test] + fn test_token_creation_with_id() { + let key = test_key(); + let mut test_token_resource = test_resource(); + test_token_resource.id = uuid::Uuid::new_v4(); let token_expiration_duration = time::Duration::hours(2); match create_token(&key, &test_token_resource, token_expiration_duration) {