From 8bbb37c1e10763edfff7df0b34ae2b2959a4ed72 Mon Sep 17 00:00:00 2001 From: Ethan Girouard Date: Tue, 2 Apr 2024 01:55:53 -0400 Subject: [PATCH] Implement auth backend types for axum_login --- src/auth_backend.rs | 49 +++++++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 1 + 2 files changed, 50 insertions(+) create mode 100644 src/auth_backend.rs diff --git a/src/auth_backend.rs b/src/auth_backend.rs new file mode 100644 index 0000000..24e3454 --- /dev/null +++ b/src/auth_backend.rs @@ -0,0 +1,49 @@ +use cfg_if::cfg_if; + +cfg_if! { + if #[cfg(feature = "ssr")] { + use async_trait::async_trait; + use axum_login::{AuthnBackend, UserId}; + use crate::users::UserCredentials; + use leptos::server_fn::error::ServerFnErrorErr; + } +} + +use axum_login::AuthUser; + +use crate::models::User; + +impl AuthUser for User { + type Id = i32; + + // TODO: Ideally, we shouldn't have to unwrap here + + fn id(&self) -> Self::Id { + self.id.unwrap() + } + + fn session_auth_hash(&self) -> &[u8] { + self.password.as_ref().unwrap().as_bytes() + } +} + +#[derive(Clone)] +pub struct AuthBackend; + +#[cfg(feature = "ssr")] +#[async_trait] +impl AuthnBackend for AuthBackend { + type User = User; + type Credentials = UserCredentials; + type Error = ServerFnErrorErr; + + async fn authenticate(&self, creds: Self::Credentials) -> Result, Self::Error> { + crate::users::validate_user(creds).await + .map_err(|e| ServerFnErrorErr::ServerError(format!("Error validating user: {}", e))) + } + + async fn get_user(&self, user_id: &UserId) -> Result, Self::Error> { + crate::users::find_user_by_id(*user_id).await + .map_err(|e| ServerFnErrorErr::ServerError(format!("Error getting user: {}", e))) + } +} diff --git a/src/lib.rs b/src/lib.rs index eba864d..581ae74 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -12,6 +12,7 @@ pub mod users; pub mod search; pub mod fileserv; pub mod error_template; +pub mod auth_backend; use cfg_if::cfg_if; cfg_if! {