Skip to main content

authly_axum/
lib.rs

1use authly_session::{Session, SessionStore};
2use authly_token::TokenManager;
3use axum::{
4    extract::{FromRef, FromRequestParts},
5    http::request::Parts,
6};
7use std::sync::Arc;
8pub use tower_cookies::cookie::SameSite;
9pub use tower_cookies::Cookie;
10use tower_cookies::Cookies;
11
12pub mod helpers;
13
14pub use helpers::*;
15
16#[derive(Clone)]
17pub struct AuthlyState {
18    pub store: Arc<dyn SessionStore>,
19    pub config: SessionConfig,
20    pub token_manager: Arc<TokenManager>,
21}
22
23impl FromRef<AuthlyState> for Arc<dyn SessionStore> {
24    fn from_ref(state: &AuthlyState) -> Self {
25        state.store.clone()
26    }
27}
28
29impl FromRef<AuthlyState> for SessionConfig {
30    fn from_ref(state: &AuthlyState) -> Self {
31        state.config.clone()
32    }
33}
34
35impl FromRef<AuthlyState> for Arc<TokenManager> {
36    fn from_ref(state: &AuthlyState) -> Self {
37        state.token_manager.clone()
38    }
39}
40
41/// The extractor for a validated session.
42pub struct AuthSession(pub Session);
43
44impl<S> FromRequestParts<S> for AuthSession
45where
46    S: Send + Sync,
47    Arc<dyn SessionStore>: FromRef<S>,
48    SessionConfig: FromRef<S>,
49{
50    type Rejection = AuthlyAxumError;
51
52    async fn from_request_parts(parts: &mut Parts, state: &S) -> Result<Self, Self::Rejection> {
53        let session_store = Arc::<dyn SessionStore>::from_ref(state);
54        let session_config = SessionConfig::from_ref(state);
55        let cookies = Cookies::from_request_parts(parts, state)
56            .await
57            .map_err(|e| AuthlyAxumError::Internal(e.1.to_string()))?;
58
59        let session = helpers::get_session(&session_store, &session_config, &cookies).await?;
60
61        Ok(AuthSession(session))
62    }
63}
64
65/// The extractor for a validated JWT.
66///
67/// Expects an `Authorization: Bearer <token>` header.
68pub struct AuthToken(pub authly_token::Claims);
69
70impl<S> FromRequestParts<S> for AuthToken
71where
72    S: Send + Sync,
73    Arc<TokenManager>: FromRef<S>,
74{
75    type Rejection = AuthlyAxumError;
76
77    async fn from_request_parts(parts: &mut Parts, state: &S) -> Result<Self, Self::Rejection> {
78        let token_manager = Arc::<TokenManager>::from_ref(state);
79        let token = helpers::get_token(parts, &token_manager).await?;
80        Ok(AuthToken(token))
81    }
82}