diff options
| author | rtkay123 <dev@kanjala.com> | 2026-02-02 17:09:32 +0200 |
|---|---|---|
| committer | rtkay123 <dev@kanjala.com> | 2026-02-02 17:09:32 +0200 |
| commit | 1f76530bc5001d9a9088f269db6c03cf287b67e6 (patch) | |
| tree | 99b4873b9813570236fdc4bb71c444c958036e58 /src/server/driver/mod.rs | |
| parent | 549d98f3b457ddfc6dffbe2fad406da4ac50ebc7 (diff) | |
| download | sellershut-1f76530bc5001d9a9088f269db6c03cf287b67e6.tar.bz2 sellershut-1f76530bc5001d9a9088f269db6c03cf287b67e6.zip | |
feat: create auth session
Diffstat (limited to 'src/server/driver/mod.rs')
| -rw-r--r-- | src/server/driver/mod.rs | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/src/server/driver/mod.rs b/src/server/driver/mod.rs index c006cb0..2debff2 100644 --- a/src/server/driver/mod.rs +++ b/src/server/driver/mod.rs @@ -1,11 +1,21 @@ #[cfg(feature = "oauth")] pub mod auth; +#[cfg(feature = "oauth")] +use async_session::Session; use async_trait::async_trait; +#[cfg(feature = "oauth")] +use axum::{ + http::HeaderMap, + response::{IntoResponse, Redirect}, +}; +#[cfg(feature = "oauth")] +use oauth2::CsrfToken; use sqlx::PgPool; use crate::{config::DatabaseOptions, server::state::database}; +#[derive(Debug, Clone)] pub struct Services { database: PgPool, // oauth: OauthClient, @@ -22,6 +32,13 @@ impl Services { #[async_trait] pub trait SellershutDriver: Send + Sync + 'static { async fn hello(&self); + + #[cfg(feature = "oauth")] + async fn create_auth_session( + &self, + csrf_token: &CsrfToken, + auth_url: &url::Url, + ) -> anyhow::Result<(HeaderMap, Redirect)>; } #[async_trait] @@ -29,4 +46,37 @@ impl SellershutDriver for Services { async fn hello(&self) { todo!() } + + #[cfg(feature = "oauth")] + async fn create_auth_session( + &self, + csrf_token: &CsrfToken, + auth_url: &url::Url, + ) -> anyhow::Result<(HeaderMap, Redirect)> { + use anyhow::Context; + use async_session::SessionStore; + use axum::{ + http::{HeaderMap, header::SET_COOKIE}, + response::Redirect, + }; + + use crate::server::driver::auth::{COOKIE_NAME, CSRF_TOKEN}; + + let mut session = Session::new(); + session.insert(CSRF_TOKEN, csrf_token)?; + + let res = self + .store_session(session) + .await? + .context("missing csrf token")?; + + let cookie = format!("{COOKIE_NAME}={res}; SameSite=Lax; HttpOnly; Secure; Path=/"); + let mut headers = HeaderMap::new(); + headers.insert( + SET_COOKIE, + cookie.parse().context("failed to parse cookie")?, + ); + + Ok((headers, Redirect::to(auth_url.as_str()))) + } } |
