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
41pub 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
65pub 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}