From 1b2a9d1af7a11ce5812b9ff21df5e1ad4fd9530a Mon Sep 17 00:00:00 2001
From: Philippe Loctaux
Date: Sat, 18 Mar 2023 16:43:33 +0100
Subject: [PATCH] ezidam: store refresh token in cookie
---
crates/ezidam/src/routes/oauth/redirect.rs | 15 +++++++++++++++
crates/refresh_tokens/src/database.rs | 3 ++-
2 files changed, 17 insertions(+), 1 deletion(-)
diff --git a/crates/ezidam/src/routes/oauth/redirect.rs b/crates/ezidam/src/routes/oauth/redirect.rs
index 8684e7d..13822c4 100644
--- a/crates/ezidam/src/routes/oauth/redirect.rs
+++ b/crates/ezidam/src/routes/oauth/redirect.rs
@@ -5,6 +5,8 @@ use hash::SecretString;
use jwt::database::Key;
use jwt::{JwtClaims, PrivateKey};
use refresh_tokens::RefreshToken;
+use rocket::http::{Cookie, CookieJar, SameSite};
+use rocket::time::Duration;
use rocket::{get, UriDisplayQuery};
use rocket_client_addr::ClientRealAddr;
use settings::Settings;
@@ -21,6 +23,7 @@ pub async fn redirect_page(
mut db: Connection,
redirect_request: RedirectRequest<'_>,
ip_address: &ClientRealAddr,
+ cookie_jar: &CookieJar<'_>,
) -> Result {
let mut transaction = db.begin().await?;
@@ -72,15 +75,27 @@ pub async fn redirect_page(
// Generate refresh token
let refresh_token = task::spawn_blocking(|| SecretString::new(64)).await?;
+ // 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?;
+ // 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?
diff --git a/crates/refresh_tokens/src/database.rs b/crates/refresh_tokens/src/database.rs
index d2ca171..1dd5dae 100644
--- a/crates/refresh_tokens/src/database.rs
+++ b/crates/refresh_tokens/src/database.rs
@@ -28,8 +28,9 @@ impl RefreshToken {
token: &str,
ip_address: &str,
user: &UserID,
+ duration_days: i64,
) -> Result