From adb006199c55b41b84862004eb53477a4f175524 Mon Sep 17 00:00:00 2001 From: Kjetil Orbekk Date: Sat, 8 Oct 2022 20:51:51 -0400 Subject: Add skeleton LoggedInUser extractor --- Cargo.lock | 1 + server/Cargo.toml | 1 + server/src/auth.rs | 42 ++++++++++++++++++++++++++++++++++-------- server/src/main.rs | 3 ++- 4 files changed, 38 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 35b4d1d..9b8c0a5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1764,6 +1764,7 @@ name = "server" version = "0.1.0" dependencies = [ "anyhow", + "async-trait", "axum", "chrono", "cookie", diff --git a/server/Cargo.toml b/server/Cargo.toml index 94b2684..228f1e6 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -28,3 +28,4 @@ thiserror = "1.0.37" reqwest = "0.11.12" cookie = "0.16.1" time = "0.1.44" +async-trait = "0.1.57" diff --git a/server/src/auth.rs b/server/src/auth.rs index e30cd6e..0be1b85 100644 --- a/server/src/auth.rs +++ b/server/src/auth.rs @@ -7,6 +7,8 @@ use std::{ }; use crate::error::BridgeError; +use async_trait::async_trait; +use axum::{extract::FromRequest, http}; use chrono::{DateTime, Utc}; use lru::LruCache; use openidconnect::{ @@ -20,7 +22,8 @@ use openidconnect::{ use protocol::UserInfo; use serde::{Deserialize, Serialize}; use sqlx::PgPool; -use tracing::{info, error, debug}; +use tower_cookies::Cookies; +use tracing::{debug, error, info}; use uuid::Uuid; pub struct LoginState { @@ -143,19 +146,19 @@ impl Authenticator { return Ok(()); } info!("Refreshing expiring token: {}", session.expiration); - let refresh_start = Utc::now(); + let refresh_start = Utc::now(); let new_token = self .client .exchange_refresh_token(&session.refresh_token) .request_async(async_http_client) .await?; debug!("Got new token: {new_token:#?}"); - // TODO: Validate token? - if let Some(expires_in) = new_token.expires_in() { - session.expiration = refresh_start + chrono::Duration::from_std(expires_in)?; - } else { - error!("Token is missing expiration! Will refresh token every time."); - } + // TODO: Validate token? + if let Some(expires_in) = new_token.expires_in() { + session.expiration = refresh_start + chrono::Duration::from_std(expires_in)?; + } else { + error!("Token is missing expiration! Will refresh token every time."); + } if let Some(refresh_token) = new_token.refresh_token() { session.refresh_token = refresh_token.clone(); } @@ -331,3 +334,26 @@ pub async fn fetch_authenticated_session( })), } } + +#[derive(Clone, Debug, Default)] +pub struct LoggedInUser { + _priv: (), +} + +#[async_trait] +impl FromRequest for LoggedInUser +where + B: Send, +{ + type Rejection = (http::StatusCode, &'static str); + + async fn from_request( + req: &mut axum::extract::RequestParts, + ) -> Result { + info!( + "Creating LoggedInUser; found cookies: {:?}", + req.extensions().get::().cloned() + ); + Ok(LoggedInUser { _priv: () }) + } +} diff --git a/server/src/main.rs b/server/src/main.rs index 22f9e19..fd28789 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; +use auth::{AuthenticatedSession, LoggedInUser}; use axum::{ extract::{Extension, Query}, response::Redirect, @@ -73,6 +73,7 @@ async fn main() { } async fn user_info( + _user: LoggedInUser, cookies: Cookies, extension: ContextExtension, ) -> Result>, BridgeError> { -- cgit v1.2.3