1use crate::AppState;
2use axum::extract::FromRef;
3use fts_core::ports::MarketRepository;
4use jwt_simple::{
5 algorithms::{HS256Key, MACLike},
6 claims::JWTClaims,
7};
8use serde::{Deserialize, Serialize};
9
10#[derive(Clone)]
15pub struct JWTVerifier(HS256Key);
16
17impl JWTVerifier {
18 pub fn from(secret: &str) -> Self {
20 Self(HS256Key::from_bytes(secret.as_bytes()))
21 }
22
23 pub fn claims(&self, token: &str) -> Option<JWTClaims<CustomJWTClaims>> {
25 self.0.verify_token::<CustomJWTClaims>(token, None).ok()
28 }
29}
30
31impl<T: MarketRepository> FromRef<AppState<T>> for JWTVerifier {
32 fn from_ref(input: &AppState<T>) -> Self {
33 input.jwt.clone()
34 }
35}
36
37#[derive(Serialize, Deserialize)]
41pub struct CustomJWTClaims {
42 #[serde(default)]
44 pub admin: bool,
45}