diff options
Diffstat (limited to 'src/auth/claims.rs')
-rw-r--r-- | src/auth/claims.rs | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/src/auth/claims.rs b/src/auth/claims.rs index ff582a3..bee1c35 100644 --- a/src/auth/claims.rs +++ b/src/auth/claims.rs @@ -14,13 +14,14 @@ use axum_extra::{ headers::{authorization::Bearer, Authorization}, TypedHeader, }; -use serde::{Deserialize, Serialize}; +use serde::{Deserialize, Deserializer, Serialize, Serializer}; use time::OffsetDateTime; use uuid::Uuid; use super::{Error, JWT}; #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[serde(remote = "Self")] pub struct Claims<const LIFETIME: i64 = ACCESS> { pub sub: Uuid, pub iat: i64, @@ -40,6 +41,32 @@ impl<const LIFETIME: i64> Claims<LIFETIME> { } } +impl<const LIFETIME: i64> Serialize for Claims<LIFETIME> { + fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> + where + S: Serializer, + { + Self::serialize(self, serializer) + } +} + +impl<'de, const LIFETIME: i64> Deserialize<'de> for Claims<LIFETIME> { + fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> + where + D: Deserializer<'de>, + { + let claims = Self::deserialize(deserializer)?; + + if claims.exp - claims.iat != LIFETIME { + return Err(serde::de::Error::custom( + "Lifetime is invalid for Claim type", + )); + } + + Ok(claims) + } +} + // 1 day in seconds const ACCESS: i64 = 86400; @@ -158,6 +185,6 @@ where .await .map_err(|_| Error::JwtNotFound)?; - Ok(JWT.decode(bearer.token())?.claims) + JWT.decode(bearer.token()).map(|jwt| jwt.claims) } } |