diff --git a/backend/windmill-api/openapi.yaml b/backend/windmill-api/openapi.yaml index b404382df3..af8b1c8c74 100644 --- a/backend/windmill-api/openapi.yaml +++ b/backend/windmill-api/openapi.yaml @@ -1121,9 +1121,15 @@ paths: operationId: refreshUserToken tags: - user + parameters: + - name: if_expiring_in_less_than_s + in: query + required: false + schema: + type: int responses: "200": - description: free usage + description: new token content: text/plain: schema: diff --git a/backend/windmill-api/src/users.rs b/backend/windmill-api/src/users.rs index 79cd07a939..d727d3543a 100644 --- a/backend/windmill-api/src/users.rs +++ b/backend/windmill-api/src/users.rs @@ -2217,13 +2217,30 @@ async fn login( } } +#[derive(Deserialize)] +struct RefreshTokenQuery { + if_expiring_in_less_than_s: Option, +} async fn refresh_token( Extension(db): Extension, + Query(query): Query, + Tokened { token }: Tokened, authed: ApiAuthed, cookies: Cookies, ) -> Result { let mut tx = db.begin().await?; + if let Some(thresh_s) = query.if_expiring_in_less_than_s { + let not_expired = sqlx::query_scalar!("SELECT true FROM token WHERE token = $1 and expiration IS NOT NULL and expiration > now() + $2::int * '1 sec'::interval", &token, thresh_s) + .fetch_optional(&db) + .await? + .flatten() + .unwrap_or(false); + if not_expired { + return Ok("token expiry is far enough".to_string()); + } + } + let super_admin = sqlx::query_scalar!( "SELECT super_admin FROM password WHERE email = $1", &authed.email diff --git a/frontend/src/routes/(root)/(logged)/workers/+page.svelte b/frontend/src/routes/(root)/(logged)/workers/+page.svelte index beab747a51..71b0ad0a69 100644 --- a/frontend/src/routes/(root)/(logged)/workers/+page.svelte +++ b/frontend/src/routes/(root)/(logged)/workers/+page.svelte @@ -486,6 +486,7 @@ diff --git a/frontend/src/routes/(root)/+layout.svelte b/frontend/src/routes/(root)/+layout.svelte index 7f57b63e10..e105ed6c02 100644 --- a/frontend/src/routes/(root)/+layout.svelte +++ b/frontend/src/routes/(root)/+layout.svelte @@ -125,7 +125,7 @@ if ($page.url.pathname != '/user/login') { setUserWorkspaceStore() loadUser() - UserService.refreshUserToken() + UserService.refreshUserToken({ ifExpiringInLessThanS: 60 * 60 * 24 }) } let i = 0 @@ -135,7 +135,8 @@ // every 1 hour if (i % 12 == 0) { - await UserService.refreshUserToken() + console.debug('Refreshing user token') + await UserService.refreshUserToken({ ifExpiringInLessThanS: 60 * 60 * 24 }) } try {