mmtickets_common/middlewares/
jwt_extractor.rsuse std::sync::Arc;
use axum::{extract::State, http::Request, http::StatusCode, middleware::Next, response::Response};
use axum_extra::extract::CookieJar;
use crate::auth::jwt;
pub trait AppStateGetter {
fn jwt_cookie_name(&self) -> &str;
fn jwt_secret(&self) -> &str;
}
pub async fn set_jwt_from_cookie<B, A>(
State(state): State<Arc<A>>,
jar: CookieJar,
mut request: Request<B>,
next: Next<B>,
) -> Result<Response, StatusCode>
where
A: AppStateGetter,
{
let token = jar
.get(state.jwt_cookie_name())
.ok_or(StatusCode::UNAUTHORIZED)?
.value()
.to_string();
let jwt = jwt::verify(&token, state.jwt_secret()).map_err(|_| StatusCode::UNAUTHORIZED)?;
request.extensions_mut().insert(jwt);
Ok(next.run(request).await)
}