axum_supabase_auth/
lib.rs1mod 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 {}