From accb9032b9abe595020a27dd2f7b666cb7028f67 Mon Sep 17 00:00:00 2001 From: Kjetil Orbekk Date: Thu, 13 Oct 2022 08:12:59 -0400 Subject: Add AuthenticatedSession request extractor --- server/src/main.rs | 46 +++++++++++++++------------------------------- 1 file changed, 15 insertions(+), 31 deletions(-) (limited to 'server/src/main.rs') diff --git a/server/src/main.rs b/server/src/main.rs index fd28789..b961c17 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -1,6 +1,6 @@ use std::{collections::HashMap, env, str::FromStr, sync::Arc}; -use auth::{AuthenticatedSession, LoggedInUser}; +use auth::AuthenticatedSession; use axum::{ extract::{Extension, Query}, response::Redirect, @@ -8,23 +8,21 @@ use axum::{ Json, Router, }; use protocol::{Table, UserInfo}; +use server::ContextExtension; use tower_cookies::{Cookie, CookieManagerLayer, Cookies}; use tower_http::trace::TraceLayer; use tracing::info; use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt}; mod auth; mod error; -use crate::auth::{Authenticator, SessionId}; +mod server; use crate::error::BridgeError; +use crate::{ + auth::{Authenticator, SessionId}, + server::ServerContext, +}; use sqlx::{postgres::PgPoolOptions, PgPool}; -pub struct ServerContext { - pub app_url: String, - pub authenticator: Authenticator, - pub db: PgPool, -} -type ContextExtension = Extension>; - #[tokio::main] async fn main() { dotenv::dotenv().ok(); @@ -60,6 +58,7 @@ async fn main() { let app = Router::new() .route("/api/user/info", get(user_info)) + // .route("/api/user/table", get(user_table)) .route("/api/login", get(login)) .route(auth::LOGIN_CALLBACK, get(login_callback)) .layer(CookieManagerLayer::new()) @@ -73,36 +72,21 @@ async fn main() { } async fn user_info( - _user: LoggedInUser, - cookies: Cookies, + session: Option, extension: ContextExtension, ) -> Result>, BridgeError> { - let cookie = match cookies.get("user-id") { + let mut session = match session { None => return Ok(Json(None)), - Some(v) => v, + Some(s) => s, }; - - let session_id: SessionId = match SessionId::from_str(cookie.value()) { - Err(e) => { - info!("Clearing cookie that failed to parse {cookie:?}: {e}"); - cookies.remove(cookie.into_owned()); - return Ok(Json(None)); - } - Ok(s) => s, - }; - let mut session = - match crate::auth::fetch_authenticated_session(&extension.db, &session_id).await? { - None => return Ok(Json(None)), - Some(v) => v, - }; Ok(Json(Some(UserInfo { username: extension.authenticator.user_info(&mut session).await?, - table: get_table(&extension.db, &session).await?, + table: user_table(extension, &session).await?, }))) } -async fn get_table( - db: &PgPool, +async fn user_table( + extension: ContextExtension, session: &AuthenticatedSession, ) -> Result, BridgeError> { Ok(sqlx::query_as!( @@ -115,7 +99,7 @@ async fn get_table( "#, session.player_id ) - .fetch_optional(db) + .fetch_optional(&extension.db) .await?) } -- cgit v1.2.3