A decentralized music tracking and discovery platform built on AT Protocol 馃幍
at main 64 lines 1.5 kB view raw
1use std::env; 2 3use anyhow::Error; 4use jsonwebtoken::DecodingKey; 5use jsonwebtoken::EncodingKey; 6use jsonwebtoken::Header; 7use jsonwebtoken::Validation; 8use serde::{Deserialize, Serialize}; 9 10#[derive(Debug, Serialize, Deserialize)] 11pub struct Claims { 12 exp: usize, 13 iat: usize, 14 did: String, 15} 16 17pub fn generate_token(did: &str) -> Result<String, Error> { 18 if env::var("JWT_SECRET").is_err() { 19 return Err(Error::msg("JWT_SECRET is not set")); 20 } 21 22 let claims = Claims { 23 exp: chrono::Utc::now().timestamp() as usize + 3600, 24 iat: chrono::Utc::now().timestamp() as usize, 25 did: did.to_string(), 26 }; 27 28 jsonwebtoken::encode( 29 &Header::default(), 30 &claims, 31 &EncodingKey::from_secret(env::var("JWT_SECRET")?.as_ref()), 32 ) 33 .map_err(Into::into) 34} 35 36pub fn decode_token(token: &str) -> Result<Claims, Error> { 37 if env::var("JWT_SECRET").is_err() { 38 return Err(Error::msg("JWT_SECRET is not set")); 39 } 40 41 jsonwebtoken::decode::<Claims>( 42 token, 43 &DecodingKey::from_secret(env::var("JWT_SECRET")?.as_ref()), 44 &Validation::default(), 45 ) 46 .map(|data| data.claims) 47 .map_err(Into::into) 48} 49 50#[cfg(test)] 51mod tests { 52 use dotenv::dotenv; 53 54 use super::*; 55 56 #[test] 57 fn test_generate_token() { 58 dotenv().ok(); 59 let token = generate_token("did:plc:7vdlgi2bflelz7mmuxoqjfcr").unwrap(); 60 let claims = decode_token(&token).unwrap(); 61 62 assert_eq!(claims.did, "did:plc:7vdlgi2bflelz7mmuxoqjfcr"); 63 } 64}