From bad54cece35451edeaa16f4a2b45685906cc560e Mon Sep 17 00:00:00 2001
From: Philippe Loctaux
Date: Sun, 19 Mar 2023 22:52:53 +0100
Subject: [PATCH] ezidam: redirect: dont generate jwt + refresh token if
already signed in
---
crates/ezidam/src/routes/oauth/redirect.rs | 105 +++++++++++----------
1 file changed, 54 insertions(+), 51 deletions(-)
diff --git a/crates/ezidam/src/routes/oauth/redirect.rs b/crates/ezidam/src/routes/oauth/redirect.rs
index 11cf68a..d435976 100644
--- a/crates/ezidam/src/routes/oauth/redirect.rs
+++ b/crates/ezidam/src/routes/oauth/redirect.rs
@@ -21,6 +21,7 @@ pub struct RedirectRequest<'r> {
#[get("/oauth/redirect?")]
pub async fn redirect_page(
mut db: Connection,
+ jwt_user: Option,
redirect_request: RedirectRequest<'_>,
ip_address: &ClientRealAddr,
cookie_jar: &CookieJar<'_>,
@@ -75,65 +76,67 @@ pub async fn redirect_page(
.map(String::from)
.ok_or_else(|| Error::bad_request("Server url is not set"))?;
- // TODO: refactor for "code" route
+ if jwt_user.is_none() {
+ // TODO: refactor for "code" route
- // Generate refresh token
- let refresh_token = task::spawn_blocking(|| SecretString::new(64)).await?;
+ // Generate refresh token
+ let refresh_token = task::spawn_blocking(|| SecretString::new(64)).await?;
- // Refresh token duration in days
- let refresh_token_duration = 21;
+ // Refresh token duration in days
+ let refresh_token_duration = 21;
- // Insert refresh token in database
- RefreshToken::insert(
- &mut transaction,
- refresh_token.as_ref(),
- ip_address.get_ipv6_string().as_str(),
- user.id(),
- refresh_token_duration,
- )
- .await?;
+ // Insert refresh token in database
+ RefreshToken::insert(
+ &mut transaction,
+ refresh_token.as_ref(),
+ ip_address.get_ipv6_string().as_str(),
+ user.id(),
+ refresh_token_duration,
+ )
+ .await?;
- // Add refresh token as a cookie
- let mut cookie = Cookie::new("refresh_token", refresh_token.as_ref().to_string());
- cookie.set_secure(true);
- cookie.set_http_only(true);
- cookie.set_same_site(SameSite::Strict);
- cookie.set_max_age(Duration::days(refresh_token_duration));
- cookie_jar.add(cookie);
+ // Add refresh token as a cookie
+ let mut cookie = Cookie::new("refresh_token", refresh_token.as_ref().to_string());
+ cookie.set_secure(true);
+ cookie.set_http_only(true);
+ cookie.set_same_site(SameSite::Strict);
+ cookie.set_max_age(Duration::days(refresh_token_duration));
+ cookie_jar.add(cookie);
- // Get latest key from database
- let key = Key::get_most_recent(&mut transaction)
- .await?
- .ok_or_else(|| Error::internal_server_error("Failed to get key to sign JWT"))?;
+ // Get latest key from database
+ let key = Key::get_most_recent(&mut transaction)
+ .await?
+ .ok_or_else(|| Error::internal_server_error("Failed to get key to sign JWT"))?;
- // Make sure key has not been revoked
- if key.is_revoked() {
- return Err(Error::forbidden("Signing key has been revoked"));
+ // Make sure key has not been revoked
+ if key.is_revoked() {
+ return Err(Error::forbidden("Signing key has been revoked"));
+ }
+
+ // Import private key
+ let private_key =
+ task::spawn_blocking(move || PrivateKey::from_der(key.private_der(), key.key_id()))
+ .await??;
+
+ // TODO: get user roles
+ let roles = vec![];
+
+ // Access token duration in minutes
+ let access_token_duration = 15;
+
+ // Create jwt, sign and serialize
+ let jwt = JwtClaims::new(home_page.clone(), app.id().as_ref(), &user, roles)
+ .sign_serialize(&private_key, access_token_duration)?;
+
+ // Add jwt as a cookie
+ let mut cookie = Cookie::new("access_token", jwt);
+ cookie.set_secure(true);
+ cookie.set_http_only(true);
+ cookie.set_same_site(SameSite::Strict);
+ cookie.set_max_age(Duration::minutes(access_token_duration));
+ cookie_jar.add(cookie);
}
- // Import private key
- let private_key =
- task::spawn_blocking(move || PrivateKey::from_der(key.private_der(), key.key_id()))
- .await??;
-
- // TODO: get user roles
- let roles = vec![];
-
- // Access token duration in minutes
- let access_token_duration = 15;
-
- // Create jwt, sign and serialize
- let jwt = JwtClaims::new(home_page.clone(), app.id().as_ref(), &user, roles)
- .sign_serialize(&private_key, access_token_duration)?;
-
- // Add jwt as a cookie
- let mut cookie = Cookie::new("access_token", jwt);
- cookie.set_secure(true);
- cookie.set_http_only(true);
- cookie.set_same_site(SameSite::Strict);
- cookie.set_max_age(Duration::minutes(access_token_duration));
- cookie_jar.add(cookie);
-
transaction.commit().await?;
// HTTP Response