use std::fmt::Debug;
use jsonwebtoken::{decode, DecodingKey, EncodingKey, Header, Validation};
use serde::{Deserialize, Serialize};
use serde::de::DeserializeOwned;
use crate::core::token::errors::DecodeError;
use crate::core::token::token_service::TokenService;
pub struct JwtTokenService {
secret: String
}
impl JwtTokenService {
pub fn new(secret: String) -> Self {
Self {
secret
}
}
}
impl TokenService for JwtTokenService {
fn encode<'a, CLAIMS: Debug + Serialize + Deserialize<'a>>(&self, claims: CLAIMS) -> String {
let secret_key = EncodingKey::from_secret(self.secret.as_bytes());
let header = Header::new(jsonwebtoken::Algorithm::HS256);
jsonwebtoken::encode(&header, &claims, &secret_key).unwrap()
}
fn decode<CLAIMS: Debug + Serialize + DeserializeOwned>(&self, token: &str) -> Result<CLAIMS, DecodeError> {
decode::<CLAIMS>(token, &DecodingKey::from_secret(self.secret.as_bytes()), &Validation::default())
.map(|token_data| token_data.claims)
.map_err(|err| DecodeError::new(err.to_string()))
}
}