forked from
rocksky.app/rocksky
A decentralized music tracking and discovery platform built on AT Protocol 馃幍
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}