aboutsummaryrefslogtreecommitdiffstats
path: root/src/server/driver/mod.rs
diff options
context:
space:
mode:
authorrtkay123 <dev@kanjala.com>2026-02-02 17:09:32 +0200
committerrtkay123 <dev@kanjala.com>2026-02-02 17:09:32 +0200
commit1f76530bc5001d9a9088f269db6c03cf287b67e6 (patch)
tree99b4873b9813570236fdc4bb71c444c958036e58 /src/server/driver/mod.rs
parent549d98f3b457ddfc6dffbe2fad406da4ac50ebc7 (diff)
downloadsellershut-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.rs50
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())))
+ }
}