soph-auth 0.31.0

The RUST Framework for Web Rustceans.
Documentation
use crate::{config, AuthResult};
use jsonwebtoken::{decode, encode, get_current_timestamp, DecodingKey, EncodingKey, Header, TokenData, Validation};
use serde::{Deserialize, Serialize};
use serde_json::Value;

#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct UserClaims {
    uid: String,
    exp: usize,
    claims: Option<Value>,
}

#[derive(Debug)]
pub struct Jwt {
    config: config::Jwt,
}

impl Jwt {
    pub fn new(config: config::Jwt) -> Self {
        Self { config }
    }

    pub fn token(&self, uid: String, claims: Option<Value>) -> AuthResult<String> {
        let exp = (get_current_timestamp() + self.config.expiration) as usize;

        let claims = UserClaims { uid, exp, claims };

        let token = encode(
            &Header::new(self.config.algorithm),
            &claims,
            &EncodingKey::from_base64_secret(&self.config.secret)?,
        )?;

        Ok(token)
    }

    pub fn validate(&self, token: &str) -> AuthResult<TokenData<UserClaims>> {
        let mut validate = Validation::new(self.config.algorithm);
        validate.leeway = 0;

        Ok(decode::<UserClaims>(
            token,
            &DecodingKey::from_base64_secret(&self.config.secret)?,
            &validate,
        )?)
    }
}