openclaw_oauth_sync/tests/test-token-refresh.sh
shamid202 22731fff60 Add complete OAuth token refresh and sync solution
- Setup wizard with auto-detection of OpenClaw paths and Claude CLI
- Token sync watcher (inotifywait) for real-time credential updates
- Auto-refresh trigger timer that runs Claude CLI every 30 min
- Supports Claude CLI in Docker container or on host
- Temporary ANTHROPIC_BASE_URL override for container environments
- Anthropic model configuration for OpenClaw
- Auth profile management (fixes key vs access field)
- Systemd services and timers for both sync and trigger
- Comprehensive documentation and troubleshooting guides
- Re-authentication notification system

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 01:51:18 +07:00

67 lines
1.8 KiB
Bash
Executable File

#!/bin/bash
# test-token-refresh.sh — Test if the current refresh token can get a new access token
# Does NOT write any files — read-only test
set -euo pipefail
TOKEN_URL="https://console.anthropic.com/v1/oauth/token"
CLIENT_ID="9d1c250a-e61b-44d9-88ed-5944d1962f5e"
# Find credentials file
CREDS_FILE="${1:-}"
if [ -z "$CREDS_FILE" ]; then
for path in \
/root/.openclaw/workspaces/workspace-claude-proxy/config/.claude/.credentials.json \
/root/.claude/.credentials.json \
"$HOME/.claude/.credentials.json"; do
if [ -f "$path" ]; then
CREDS_FILE="$path"
break
fi
done
fi
if [ -z "$CREDS_FILE" ] || [ ! -f "$CREDS_FILE" ]; then
echo "ERROR: No credentials file found. Provide path as argument."
exit 1
fi
echo "Credentials file: $CREDS_FILE"
# Extract refresh token
REFRESH_TOKEN=$(python3 -c "
import json
with open('$CREDS_FILE') as f:
d = json.load(f)
print(d['claudeAiOauth']['refreshToken'])
")
echo "Refresh token: ${REFRESH_TOKEN:0:20}..."
echo ""
echo "Testing refresh endpoint..."
RESPONSE=$(curl -s -X POST "$TOKEN_URL" \
-H "Content-Type: application/json" \
-d "{\"grant_type\":\"refresh_token\",\"refresh_token\":\"$REFRESH_TOKEN\",\"client_id\":\"$CLIENT_ID\"}")
python3 -c "
import json, sys
resp = json.loads('''$RESPONSE''')
if 'access_token' in resp:
print('SUCCESS')
print(f' New access token: {resp[\"access_token\"][:20]}...')
print(f' Expires in: {resp[\"expires_in\"] // 3600}h')
account = resp.get('account', {}).get('email_address', 'unknown')
print(f' Account: {account}')
else:
print('FAILED')
print(f' Error: {resp.get(\"error\", \"unknown\")}')
print(f' Description: {resp.get(\"error_description\", \"unknown\")}')
sys.exit(1)
"
echo ""
echo "Note: This was a read-only test. No files were modified."