this repo has no description
1use jsonwebtoken::{encode, decode, Header, Validation, EncodingKey, DecodingKey, TokenData};
2use serde::{Deserialize, Serialize};
3use chrono::{Utc, Duration};
4use std::env;
5
6#[derive(Debug, Serialize, Deserialize)]
7pub struct Claims {
8 // DID type shit
9 pub sub: String,
10 pub exp: usize,
11 pub iat: usize,
12 pub scope: String,
13 pub jti: String,
14}
15
16pub fn create_access_token(did: &str) -> Result<String, jsonwebtoken::errors::Error> {
17 let secret = env::var("JWT_SECRET").unwrap_or_else(|_| "secret".to_string());
18 let expiration = Utc::now()
19 .checked_add_signed(Duration::minutes(15))
20 .expect("valid timestamp")
21 .timestamp();
22
23 let claims = Claims {
24 sub: did.to_owned(),
25 exp: expiration as usize,
26 iat: Utc::now().timestamp() as usize,
27 scope: "access".to_string(),
28 jti: uuid::Uuid::new_v4().to_string(),
29 };
30
31 encode(&Header::default(), &claims, &EncodingKey::from_secret(secret.as_ref()))
32}
33
34pub fn create_refresh_token(did: &str) -> Result<String, jsonwebtoken::errors::Error> {
35 let secret = env::var("JWT_SECRET").unwrap_or_else(|_| "secret".to_string());
36 let expiration = Utc::now()
37 .checked_add_signed(Duration::days(7))
38 .expect("valid timestamp")
39 .timestamp();
40
41 let claims = Claims {
42 sub: did.to_owned(),
43 exp: expiration as usize,
44 iat: Utc::now().timestamp() as usize,
45 scope: "refresh".to_string(),
46 jti: uuid::Uuid::new_v4().to_string(),
47 };
48
49 encode(&Header::default(), &claims, &EncodingKey::from_secret(secret.as_ref()))
50}
51
52pub fn verify_token(token: &str) -> Result<TokenData<Claims>, jsonwebtoken::errors::Error> {
53 let secret = env::var("JWT_SECRET").unwrap_or_else(|_| "secret".to_string());
54 decode::<Claims>(
55 token,
56 &DecodingKey::from_secret(secret.as_ref()),
57 &Validation::default(),
58 )
59}