Implement automatic Garmin token refresh and fix expiry tracking
- Add OAuth1 to OAuth2 token exchange using Garmin's exchange endpoint - Track refresh token expiry (~30 days) instead of access token expiry (~21 hours) - Auto-refresh access tokens in cron sync before they expire - Update Python script to output refresh_token_expires_at - Add garminRefreshTokenExpiresAt field to User type and database schema - Fix token input UX: show when warning active, not just when disconnected - Add Cache-Control headers to /api/user and /api/garmin/status to prevent stale data - Add oauth-1.0a package for OAuth1 signature generation The system now automatically refreshes OAuth2 tokens using the stored OAuth1 token, so users only need to re-run the Python auth script every ~30 days (when refresh token expires) instead of every ~21 hours (when access token expires). Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -36,8 +36,15 @@ export function isTokenExpired(tokens: GarminTokens): boolean {
|
||||
return expiresAt <= new Date();
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculate days until refresh token expiry.
|
||||
* This is what users care about - when they need to re-authenticate.
|
||||
* Falls back to access token expiry if refresh token expiry not available.
|
||||
*/
|
||||
export function daysUntilExpiry(tokens: GarminTokens): number {
|
||||
const expiresAt = new Date(tokens.expires_at);
|
||||
const expiresAt = tokens.refresh_token_expires_at
|
||||
? new Date(tokens.refresh_token_expires_at)
|
||||
: new Date(tokens.expires_at);
|
||||
const now = new Date();
|
||||
const diffMs = expiresAt.getTime() - now.getTime();
|
||||
return Math.floor(diffMs / (1000 * 60 * 60 * 24));
|
||||
|
||||
Reference in New Issue
Block a user