fix(astrolabe): improve token refresh error handling and validation

- Extract magic number to TOKEN_EXPIRY_BUFFER_SECONDS constant
- Add URL validation for astrolabe_internal_url with fallback
- Warn when internal URL uses external port mapping (misconfiguration)
- Differentiate HTTP error handling by status code:
  - Network errors (LocalServerException): warning level
  - Auth errors (401/403): error level (token invalid)
  - Server errors (500+): warning level (transient)
- Reduce log level for IdP selection messages to debug
- Add integration tests for credential storage, isolation, and revoke/reprovision

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Chris Coutinho
2026-01-17 19:43:15 +01:00
co-authored by Claude Opus 4.5
parent 813e9a60cb
commit 737f10f190
3 changed files with 746 additions and 7 deletions
+6 -3
View File
@@ -15,6 +15,9 @@ use Psr\Log\LoggerInterface;
* Handles token expiration checking and refresh logic.
*/
class McpTokenStorage {
/** Buffer time in seconds before actual expiry to trigger refresh */
private const TOKEN_EXPIRY_BUFFER_SECONDS = 60;
private $config;
private $crypto;
private $logger;
@@ -112,7 +115,7 @@ class McpTokenStorage {
/**
* Check if a token is expired or about to expire.
*
* Uses a 60-second buffer to refresh tokens before they actually expire.
* Uses TOKEN_EXPIRY_BUFFER_SECONDS buffer to refresh tokens before they actually expire.
*
* @param array $token Token data array
* @return bool True if expired or about to expire
@@ -122,8 +125,8 @@ class McpTokenStorage {
return true;
}
// Expire 60 seconds early to avoid race conditions
return time() >= ($token['expires_at'] - 60);
// Expire early to avoid race conditions
return time() >= ($token['expires_at'] - self::TOKEN_EXPIRY_BUFFER_SECONDS);
}
/**