axum_supabase_auth/
lib.rs

1mod auth;
2mod handlers;
3pub mod middleware;
4
5use crate::handlers::auth_router;
6use crate::middleware::{AuthState, CookieConfig, Decoder};
7pub use auth::api;
8pub use auth::service::*;
9pub use auth::types::*;
10pub use auth::{Auth, SessionAuth};
11use axum::extract::FromRef;
12use axum::Router;
13use bon::Builder;
14use reqwest::Url;
15use serde::{Deserialize, Serialize};
16use std::fmt::Debug;
17use std::sync::Arc;
18use thiserror::Error;
19
20pub trait AuthTypes {
21    type AppData: Serialize + for<'de> Deserialize<'de> + Send + Debug;
22    type UserData: Serialize + for<'de> Deserialize<'de> + Send + Debug;
23    type AdditionalData: Serialize + for<'de> Deserialize<'de> + Send + Debug;
24}
25
26#[derive(Builder)]
27#[builder()]
28pub struct SupabaseAuthConfig {
29    pub jwt_secret: String,
30    pub api_url: Url,
31    pub api_key: String,
32
33    #[builder(into, default = "sb-auth")]
34    pub auth_cookie_name: String,
35    #[builder(into, default = "sb-refresh")]
36    pub refresh_cookie_name: String,
37    #[builder(into, default = "sb-token-verifier")]
38    pub csrf_verifier_cookie_name: String,
39}
40
41#[derive(Clone)]
42pub struct SupabaseAuth<T>
43where
44    T: AuthTypes + Send + Sync + 'static,
45{
46    state: AuthState<T>,
47}
48
49impl<T> SupabaseAuth<T>
50where
51    T: AuthTypes + Send + Sync + 'static,
52{
53    pub fn new(conf: SupabaseAuthConfig) -> Result<Self, SupabaseAuthError> {
54        let service = AuthService::new(conf.api_url, &conf.api_key);
55
56        let decoder = Arc::new(Decoder::new(&conf.jwt_secret));
57
58        let cookies = CookieConfig::builder()
59            .auth_cookie_name(conf.auth_cookie_name)
60            .csrf_verifier_cookie_name(conf.csrf_verifier_cookie_name)
61            .refresh_cookie_name(conf.refresh_cookie_name)
62            .build();
63
64        let state = AuthState::new(service, decoder, cookies);
65
66        Ok(Self { state })
67    }
68
69    pub fn router<S>(&self) -> Router<S>
70    where
71        S: Clone + Send + Sync + 'static,
72        AuthState<T>: FromRef<S>,
73    {
74        auth_router()
75    }
76
77    pub fn state(&self) -> AuthState<T> {
78        self.state.clone()
79    }
80}
81
82#[derive(Error, Debug)]
83pub enum SupabaseAuthError {}