summaryrefslogtreecommitdiff
path: root/server/src/auth.rs
diff options
context:
space:
mode:
authorKjetil Orbekk <kj@orbekk.com>2022-10-08 20:51:51 -0400
committerKjetil Orbekk <kj@orbekk.com>2022-10-08 20:51:51 -0400
commitadb006199c55b41b84862004eb53477a4f175524 (patch)
tree05edba531736a8c296b3f33cb944b5becf72948a /server/src/auth.rs
parenta7d833d6b7729f09bef891b0c8b7bd998ac17abf (diff)
Add skeleton LoggedInUser extractor
Diffstat (limited to 'server/src/auth.rs')
-rw-r--r--server/src/auth.rs42
1 files changed, 34 insertions, 8 deletions
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<B> FromRequest<B> for LoggedInUser
+where
+ B: Send,
+{
+ type Rejection = (http::StatusCode, &'static str);
+
+ async fn from_request(
+ req: &mut axum::extract::RequestParts<B>,
+ ) -> Result<Self, Self::Rejection> {
+ info!(
+ "Creating LoggedInUser; found cookies: {:?}",
+ req.extensions().get::<Cookies>().cloned()
+ );
+ Ok(LoggedInUser { _priv: () })
+ }
+}