feat: 改进 Gemini token 刷新机制和错误处理

- 修复 token 刷新时的错误处理逻辑
- 添加详细的错误日志记录
- 新增 test-gemini-refresh.js 测试脚本
- 更新 CLAUDE.md 文档,添加 Gemini token 刷新故障排除指南

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
shaw
2025-07-26 11:41:17 +08:00
parent 3eba158387
commit dd73045223
3 changed files with 134 additions and 12 deletions

View File

@@ -168,22 +168,36 @@ async function refreshAccessToken(refreshToken) {
const oAuth2Client = createOAuth2Client();
try {
// 设置 refresh_token
oAuth2Client.setCredentials({
refresh_token: refreshToken
});
const { credentials } = await oAuth2Client.refreshAccessToken();
// 调用 refreshAccessToken 获取新的 tokens
const response = await oAuth2Client.refreshAccessToken();
const credentials = response.credentials;
// 检查是否成功获取了新的 access_token
if (!credentials || !credentials.access_token) {
throw new Error('No access token returned from refresh');
}
logger.info(`🔄 Successfully refreshed Gemini token. New expiry: ${new Date(credentials.expiry_date).toISOString()}`);
return {
access_token: credentials.access_token,
refresh_token: credentials.refresh_token || refreshToken,
refresh_token: credentials.refresh_token || refreshToken, // 保留原 refresh_token 如果没有返回新的
scope: credentials.scope || OAUTH_SCOPES.join(' '),
token_type: credentials.token_type || 'Bearer',
expiry_date: credentials.expiry_date
expiry_date: credentials.expiry_date || Date.now() + 3600000 // 默认1小时过期
};
} catch (error) {
logger.error('Error refreshing access token:', error);
throw new Error('Failed to refresh access token');
logger.error('Error refreshing access token:', {
message: error.message,
code: error.code,
response: error.response?.data
});
throw new Error(`Failed to refresh access token: ${error.message}`);
}
}
@@ -625,11 +639,17 @@ async function refreshAccountToken(accountId) {
logger.error(`Failed to refresh token for account ${accountId}:`, error);
// 标记账户为错误状态
await updateAccount(accountId, {
status: 'error',
errorMessage: error.message
});
// 标记账户为错误状态(只有在账户存在时)
if (account) {
try {
await updateAccount(accountId, {
status: 'error',
errorMessage: error.message
});
} catch (updateError) {
logger.error(`Failed to update account status after refresh error:`, updateError);
}
}
throw error;
} finally {