use jsonwebtoken::{encode, decode, Header, Validation, EncodingKey, DecodingKey, TokenData}; use serde::{Deserialize, Serialize}; use chrono::{Utc, Duration}; use std::env; #[derive(Debug, Serialize, Deserialize)] pub struct Claims { // DID type shit pub sub: String, pub exp: usize, pub iat: usize, pub scope: String, pub jti: String, } pub fn create_access_token(did: &str) -> Result { let secret = env::var("JWT_SECRET").unwrap_or_else(|_| "secret".to_string()); let expiration = Utc::now() .checked_add_signed(Duration::minutes(15)) .expect("valid timestamp") .timestamp(); let claims = Claims { sub: did.to_owned(), exp: expiration as usize, iat: Utc::now().timestamp() as usize, scope: "access".to_string(), jti: uuid::Uuid::new_v4().to_string(), }; encode(&Header::default(), &claims, &EncodingKey::from_secret(secret.as_ref())) } pub fn create_refresh_token(did: &str) -> Result { let secret = env::var("JWT_SECRET").unwrap_or_else(|_| "secret".to_string()); let expiration = Utc::now() .checked_add_signed(Duration::days(7)) .expect("valid timestamp") .timestamp(); let claims = Claims { sub: did.to_owned(), exp: expiration as usize, iat: Utc::now().timestamp() as usize, scope: "refresh".to_string(), jti: uuid::Uuid::new_v4().to_string(), }; encode(&Header::default(), &claims, &EncodingKey::from_secret(secret.as_ref())) } pub fn verify_token(token: &str) -> Result, jsonwebtoken::errors::Error> { let secret = env::var("JWT_SECRET").unwrap_or_else(|_| "secret".to_string()); decode::( token, &DecodingKey::from_secret(secret.as_ref()), &Validation::default(), ) }