From fe71d9a8a41abf69cd1a8dc2998654ef9a05e6f2 Mon Sep 17 00:00:00 2001 From: Koh Sakano Date: Mon, 26 Oct 2026 18:03:57 +0900 Subject: [PATCH] Refresh OAuth access token before it expires, not 30 minutes after access_token_has_expired() subtracted its 30-minute margin from the current time, so a token counted as expired only 30 minutes after its expiration. During that window get_access_token() returned the expired token and every API call failed with 401. Add the margin instead, so the token is refreshed 30 minutes before it expires. Fixes #74 --- kagglesdk/kaggle_creds.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/kagglesdk/kaggle_creds.py b/kagglesdk/kaggle_creds.py index 3680cf0..f548c55 100644 --- a/kagglesdk/kaggle_creds.py +++ b/kagglesdk/kaggle_creds.py @@ -14,6 +14,7 @@ class KaggleCredentials: DEFAULT_CREDENTIALS_FILE = "~/.kaggle/credentials.json" DEFAULT_ACCESS_TOKEN_EXPIRATION = timedelta(hours=12) + ACCESS_TOKEN_REFRESH_MARGIN = timedelta(minutes=30) def __init__( self, @@ -115,9 +116,10 @@ def refresh_access_token(self) -> None: self.save() def access_token_has_expired(self) -> bool: - return not self._access_token_expiration or self._access_token_expiration < datetime.now( - timezone.utc - ) - timedelta(minutes=30) + return ( + not self._access_token_expiration + or self._access_token_expiration - KaggleCredentials.ACCESS_TOKEN_REFRESH_MARGIN < datetime.now(timezone.utc) + ) def get_access_token(self) -> str: if not self._access_token or self.access_token_has_expired():