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