use std::sync::Arc;
use axum::http::HeaderMap;
use crate::auth::cookie::CookieService;
use crate::auth::jwt::{decode_bearer_token, JwtService};
use crate::auth::session::{Session, SessionManager};
use crate::core::engine::FrozenDiContainer;
use crate::web::context::Claims;
pub struct AuthExtraction {
pub claims: Option<Arc<Claims>>,
pub session: Option<Arc<Session>>,
}
pub fn extract_claims(
headers: &HeaderMap,
container: &'static FrozenDiContainer,
) -> Option<Arc<Claims>> {
decode_bearer_token(headers, container).or_else(|| {
let cookie = container.try_get::<CookieService>()?;
let jwt = container.try_get::<JwtService>()?;
let value = cookie.extract(headers)?;
jwt.decode_access(&value)
})
}
pub async fn extract_auth(
headers: &HeaderMap,
container: &'static FrozenDiContainer,
) -> AuthExtraction {
let claims = extract_claims(headers, container);
let session = match container.try_get::<SessionManager>() {
Some(sm) => sm.load_from_headers(headers).await,
None => None,
};
AuthExtraction { claims, session }
}