ezidam: store refresh token in cookie
This commit is contained in:
parent
e99115e174
commit
1b2a9d1af7
2 changed files with 17 additions and 1 deletions
|
|
@ -5,6 +5,8 @@ use hash::SecretString;
|
||||||
use jwt::database::Key;
|
use jwt::database::Key;
|
||||||
use jwt::{JwtClaims, PrivateKey};
|
use jwt::{JwtClaims, PrivateKey};
|
||||||
use refresh_tokens::RefreshToken;
|
use refresh_tokens::RefreshToken;
|
||||||
|
use rocket::http::{Cookie, CookieJar, SameSite};
|
||||||
|
use rocket::time::Duration;
|
||||||
use rocket::{get, UriDisplayQuery};
|
use rocket::{get, UriDisplayQuery};
|
||||||
use rocket_client_addr::ClientRealAddr;
|
use rocket_client_addr::ClientRealAddr;
|
||||||
use settings::Settings;
|
use settings::Settings;
|
||||||
|
|
@ -21,6 +23,7 @@ pub async fn redirect_page(
|
||||||
mut db: Connection<Database>,
|
mut db: Connection<Database>,
|
||||||
redirect_request: RedirectRequest<'_>,
|
redirect_request: RedirectRequest<'_>,
|
||||||
ip_address: &ClientRealAddr,
|
ip_address: &ClientRealAddr,
|
||||||
|
cookie_jar: &CookieJar<'_>,
|
||||||
) -> Result<Page> {
|
) -> Result<Page> {
|
||||||
let mut transaction = db.begin().await?;
|
let mut transaction = db.begin().await?;
|
||||||
|
|
||||||
|
|
@ -72,15 +75,27 @@ pub async fn redirect_page(
|
||||||
// Generate refresh token
|
// Generate refresh token
|
||||||
let refresh_token = task::spawn_blocking(|| SecretString::new(64)).await?;
|
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
|
// Insert refresh token in database
|
||||||
RefreshToken::insert(
|
RefreshToken::insert(
|
||||||
&mut transaction,
|
&mut transaction,
|
||||||
refresh_token.as_ref(),
|
refresh_token.as_ref(),
|
||||||
ip_address.get_ipv6_string().as_str(),
|
ip_address.get_ipv6_string().as_str(),
|
||||||
user.id(),
|
user.id(),
|
||||||
|
refresh_token_duration,
|
||||||
)
|
)
|
||||||
.await?;
|
.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
|
// Get latest key from database
|
||||||
let key = Key::get_most_recent(&mut transaction)
|
let key = Key::get_most_recent(&mut transaction)
|
||||||
.await?
|
.await?
|
||||||
|
|
|
||||||
|
|
@ -28,8 +28,9 @@ impl RefreshToken {
|
||||||
token: &str,
|
token: &str,
|
||||||
ip_address: &str,
|
ip_address: &str,
|
||||||
user: &UserID,
|
user: &UserID,
|
||||||
|
duration_days: i64,
|
||||||
) -> Result<Option<()>, Error> {
|
) -> Result<Option<()>, Error> {
|
||||||
let expires_at = Utc::now() + Duration::days(21);
|
let expires_at = Utc::now() + Duration::days(duration_days);
|
||||||
|
|
||||||
Ok(DatabaseRefreshTokens::insert(
|
Ok(DatabaseRefreshTokens::insert(
|
||||||
conn,
|
conn,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue