Skip to content

feat: enhance credential refresh error handling with detailed diagnostics - #826

Merged
chenyme merged 1 commit into
mainfrom
oauth
Jul 29, 2026
Merged

feat: enhance credential refresh error handling with detailed diagnostics#826
chenyme merged 1 commit into
mainfrom
oauth

Conversation

@chenyme

@chenyme chenyme commented Jul 29, 2026

Copy link
Copy Markdown
Owner

概要

  • 完整记录凭据刷新失败时的 HTTP 状态、错误码、错误信息及脱敏响应详情。
  • 兼容 OAuth 错误的顶层、嵌套及非 JSON 响应格式。
  • 优化账号失效状态 Tooltip,统一字体与排版并避免重复展示。
  • 凭据刷新成功后自动清除历史错误信息。

问题

原实现只解析上游响应中的 errorerror_description

{
  "error": "invalid_grant",
  "error_description": "Access denied"
}

如果上游同时返回 messagedetail、嵌套 error.message 或其他诊断字段,这些内容会被丢弃,管理端无法确认完整失败原因。

同时,Tooltip 中不同字号、字重和等宽字体混用,响应正文还会重复展示已经提取的 Code 和 Message,影响可读性。

修改内容

OAuth 错误解析

  • 保存上游 HTTP 状态码。
  • 支持以下错误字段:
    • error
    • error_description
    • message
    • detail
    • description
    • title
    • 嵌套的 error.codeerror.message 等字段
  • 非 JSON 错误响应也会保留有限长度的诊断内容。
  • 多个不同的错误信息会去重后合并。
  • 超长内容会明确使用 标记截断,不再静默省略。

安全处理

响应详情写入数据库前会进行脱敏:

  • Access Token
  • Refresh Token
  • ID Token
  • Authorization
  • Cookie
  • JWT
  • Password、Secret、Credential 等敏感字段

敏感值统一替换为:

[REDACTED]

数据与 API

账号凭据刷新状态新增:

  • lastRefreshErrorStatus
  • lastRefreshErrorMessage
  • lastRefreshErrorResponse

刷新成功后会同时清空上述字段和原有错误码,避免继续展示过期错误。

历史数据保持兼容;旧记录无法还原此前未保存的完整响应,但不会影响账号列表和调用链路。

管理端 UI

失效状态 Tooltip 统一使用相同的字体、字号、字重和行高,以两列形式展示:

  • HTTP 状态
  • 错误码
  • 错误信息
  • 额外详情

如果响应正文只包含已经展示的 Code 和 Message,则自动隐藏重复内容;只有存在额外字段时才显示脱敏详情。

验证

后端:

go test ./...
go test -race ./internal/infra/provider/cli ./internal/application/account

前端:

pnpm lint
pnpm build

全部通过。

@chenyme
chenyme merged commit de31448 into main Jul 29, 2026
9 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant