Overview
CCS implements sophisticated token management to provide seamless authentication:- Proactive Refresh - Tokens renewed 5min before expiry (no interruptions)
- Session Persistence - Reference counting tracks active sessions
- Automatic Recovery - Handles network errors, token expiry gracefully
- Multi-Account Support - Separate tokens per account
Token Lifecycle
OAuth Flow (Initial Authentication)
~/.ccs/cliproxy/gemini-{account}.json- Access + refresh tokens~/.ccs/cliproxy/sessions.json- Session metadata
Proactive Token Refresh
CCS checks token expiry before every request:- Accounts for network latency
- Prevents mid-request expiry
- Ensures smooth user experience
- Send refresh_token to provider
- Receive new access_token (expires in 1 hour)
- Receive new refresh_token (expires in 7 days)
- Update
{provider}-{account}.json - Continue with original request
Session Persistence
Session Files
Location:~/.ccs/cliproxy/sessions.json
Structure:
| Field | Purpose |
|---|---|
expiresAt | Access token expiry (1 hour from issue) |
refreshedAt | Last refresh timestamp |
referenceCount | Number of active sessions using this token |
lastError | Most recent error (for debugging) |
Reference Counting
Purpose: Track concurrent usage of same account How it works:- Prevents premature token cleanup
- Enables concurrent sessions
- Tracks active usage
Session Cleanup
Automatic cleanup when:referenceCountreaches 0- Session idle for >7 days
- Manual logout via
ccs gemini --logout
- Revoke refresh token with provider
- Delete token file
- Remove from
sessions.json - Update
accounts.jsonregistry
File Structure
Token Files
Per-account token storage:Account Registry
Location:~/.ccs/cliproxy/accounts.json
Purpose: Map nicknames to email addresses
Config Reference
Location:~/.ccs/config.yaml
Relevant sections:
Manual Token Operations
Force Token Refresh
Manually trigger refresh without waiting for threshold:Use cases:
- Debugging refresh issues
- Pre-warming tokens before long task
- Recovering from network errors
Clear Expired Tokens
Remove tokens that can’t be refreshed:This removes:
- Tokens expired >7 days (refresh token expired)
- Tokens with persistent errors
- Orphaned session entries
Export Tokens (Advanced)
For migration or backup:Security warning: Exported files contain sensitive tokens. Encrypt before storage:
Troubleshooting
UND_ERR_SOCKET Error
Full error:-
Network interruption during refresh
-
Proxy interference
-
Firewall blocking OAuth endpoints
-
Concurrent refresh attempts
- Multiple sessions trying to refresh simultaneously
- Session files locked by another process
Token Refresh Fails
Symptom:[X] Auth error: Failed to refresh token
Causes:
-
Refresh token expired (>7 days)
-
Provider revoked access
- User revoked app permissions
- Provider detected suspicious activity
-
Clock skew
Session File Corruption
Symptom:[X] Config error: Failed to parse sessions.json
Recovery steps:
Multiple Accounts Conflict
Symptom: Wrong account used despite--use flag
Cause: Default account set in config overrides flag
Solution:
Token Not Found After Re-Auth
Symptom:[X] Profile error: Account 'xyz' not found
Cause: Account registry out of sync with token files
Solution:
Advanced Patterns
Pre-Warming Tokens
For long-running tasks, refresh tokens before starting:Monitoring Token Health
Create a cron job to check token status:Shared Team Tokens
For teams using Remote Proxy: On server:Environment Variables
| Variable | Purpose | Example |
|---|---|---|
CCS_DEBUG | Show token refresh logs | export CCS_DEBUG=1 |
CCS_SKIP_PREFLIGHT | Skip token validation | export CCS_SKIP_PREFLIGHT=1 |
CCS_PROXY_FALLBACK_ENABLED | Fallback behavior on token error | export CCS_PROXY_FALLBACK_ENABLED=0 |
Security Best Practices
Protect Token Files
Rotate Tokens Regularly
Monitor Token Usage
Enable request logging to track token usage:~/.ccs/logs/cliproxy-requests.log
