mmtickets_common/auth/
jwt.rsuse anyhow::Result;
use chrono::Utc;
use jsonwebtoken::{DecodingKey, EncodingKey, Header, Validation};
use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct UserClaims {
pub user_id: String,
pub email: String,
exp: usize,
}
impl UserClaims {
pub fn new(user_id: String, email: String) -> Self {
let expiration = Utc::now()
.checked_add_signed(chrono::Duration::minutes(60))
.expect("valid timestamp")
.timestamp();
Self {
user_id,
email,
exp: expiration as usize,
}
}
}
pub fn verify(token: &str, key: &str) -> Result<UserClaims> {
let mut validation = Validation::default();
validation.validate_exp = false;
Ok(jsonwebtoken::decode(
token,
&DecodingKey::from_secret(key.as_bytes()),
&validation,
)
.map(|data| data.claims)?)
}
pub fn sign(user_id: String, email: String, key: &str) -> Result<String> {
Ok(jsonwebtoken::encode(
&Header::default(),
&UserClaims::new(user_id, email),
&EncodingKey::from_secret(key.as_bytes()),
)?)
}