From 1022c6b1346f0a281e709f4797d760bf63483a1d Mon Sep 17 00:00:00 2001 From: phoenix Date: Sun, 6 Apr 2025 17:33:16 -0400 Subject: [PATCH] Added code for creating token --- src/lib.rs | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index 1e67995..cf4130f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -39,3 +39,67 @@ pub mod db_pool { env::var(keys::DBURL).expect(keys::error::ERROR) } } + +mod token_stuff { + use dotenvy; + use josekit::{ + self, + jws::{JwsHeader, alg::hmac::HmacJwsAlgorithm::Hs256}, + jwt::{self, JwtPayload}, + }; + + pub const TOKENTYPE: &str = "JWT"; + pub const TESTKEY: &str = "dfsdferferf"; + + fn get_key() -> Result { + Ok(String::from(TESTKEY)) + } + + pub fn create_token(provided_key: &String) -> Result { + let mut header = JwsHeader::new(); + header.set_token_type(TOKENTYPE); + + let mut payload = JwtPayload::new(); + payload.set_subject("Something random"); + + let mut key: String = String::new(); + if provided_key.is_empty() { + key = get_key().unwrap(); + } else { + key = provided_key.clone(); + } + + let signer = Hs256.signer_from_bytes(key.as_bytes()).unwrap(); + let jwt = josekit::jwt::encode_with_signer(&payload, &header, &signer).unwrap(); + + Ok(jwt) + } + + pub fn verify_token(key: &String, token: &String) -> bool { + let ver = Hs256.verifier_from_bytes(key.as_bytes()).unwrap(); + let (payload, _header) = jwt::decode_with_verifier(&token, &ver).unwrap(); + match payload.subject() { + Some(_sub) => true, + None => false, + } + } +} + +#[cfg(test)] +mod tests { + use crate::token_stuff; + + #[test] + fn test_tokenize() { + let special_key = String::from("mysecret-dsfsdfsdfsdfsdgfsdgsdgsdfg"); + match token_stuff::create_token(&special_key) { + Ok(token) => { + let result = token_stuff::verify_token(&special_key, &token); + assert!(result, "Token not verified"); + } + Err(err) => { + assert!(false, "Error: {:?}", err.to_string()); + } + }; + } +}