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