fix(auth): 401拦截器排除auth端点 + login默认跳转/app/dashboard #1226

Closed
xiaoxia wants to merge 2 commits from fix/1221-auth-401-interceptor into develop
Owner

问题

  1. 登录页硬跳转/auth/login 返回 401(密码错误)时,响应拦截器错误地执行 clearAuth() + window.location.href = "/",导致页面硬跳转到首页,用户看不到"邮箱或密码错误"提示。
  2. 双重navigate竞态useAuth.tslogin() 默认跳转 /,而 Login.tsxonFinish 跳转 /app/dashboard,存在不一致。

修复

client.ts

在 401 处理逻辑最前面增加 isAuthEndpoint 判断,排除以下端点:

  • /auth/login
  • /auth/register
  • /auth/forgot-password
  • /auth/reset-password

这些端点的 401 是正常业务响应(如密码错误),走后面的错误提示逻辑(显示服务端返回的错误信息),不触发 token 刷新或登出跳转。

useAuth.ts

login() 默认跳转路径从 / 改为 /app/dashboard,与 Login.tsxonFinish 保持一致。

变更文件

  • apps/web/src/api/client.ts — 401 拦截器增加 auth 端点排除
  • apps/web/src/hooks/useAuth.ts — login 默认跳转路径修正

Closes #1221

## 问题 1. **登录页硬跳转**:`/auth/login` 返回 401(密码错误)时,响应拦截器错误地执行 `clearAuth()` + `window.location.href = "/"`,导致页面硬跳转到首页,用户看不到"邮箱或密码错误"提示。 2. **双重navigate竞态**:`useAuth.ts` 的 `login()` 默认跳转 `/`,而 `Login.tsx` 的 `onFinish` 跳转 `/app/dashboard`,存在不一致。 ## 修复 ### client.ts 在 401 处理逻辑最前面增加 `isAuthEndpoint` 判断,排除以下端点: - `/auth/login` - `/auth/register` - `/auth/forgot-password` - `/auth/reset-password` 这些端点的 401 是正常业务响应(如密码错误),走后面的错误提示逻辑(显示服务端返回的错误信息),不触发 token 刷新或登出跳转。 ### useAuth.ts `login()` 默认跳转路径从 `/` 改为 `/app/dashboard`,与 `Login.tsx` 的 `onFinish` 保持一致。 ## 变更文件 - `apps/web/src/api/client.ts` — 401 拦截器增加 auth 端点排除 - `apps/web/src/hooks/useAuth.ts` — login 默认跳转路径修正 Closes #1221
xiaoxia added 1 commit 2026-08-03 12:41:45 +08:00
fix(auth): 401拦截器排除auth端点 + login默认跳转/app/dashboard
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 32s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 50s
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 48s
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 55s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 1m28s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 2m10s
CI/CD Pipeline / Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Failing after 56s
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 4m0s
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
AI Code Review / AI Code Review (pull_request) Successful in 4m14s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 5m37s
Preview Deploy / Deploy Preview Environment (pull_request) Failing after 6m36s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 11m1s
CI/CD Pipeline / Staging API Integration Tests (pull_request) Failing after 14m42s
CI/CD Pipeline / Canary Release to Production (pull_request) Has been skipped
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 47m48s
7594caaf02
- client.ts: 401响应拦截器增加isAuthEndpoint判断,排除/auth/login、
  /auth/register、/auth/forgot-password、/auth/reset-password,
  避免登录密码错误时触发clearAuth+硬跳转,让401正常走错误提示逻辑
- useAuth.ts: login()默认跳转路径从'/'改为'/app/dashboard',
  与Login.tsx onFinish保持一致,消除双重navigate竞态

Closes #1221
auto-approve-bot approved these changes 2026-08-03 12:44:16 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

CI全绿,自动审批通过。
auto-approve-bot approved these changes 2026-08-03 12:44:16 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

CI全绿,自动审批通过。
xiaoxia added 1 commit 2026-08-03 13:57:12 +08:00
fix(ci): strip ANSI codes before grep in vitest_incremental.sh
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 47s
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 54s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 53s
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 56s
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
Preview Deploy / Deploy Preview Environment (pull_request) Failing after 1m2s
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / Canary Release to Production (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Successful in 1m8s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 2m11s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 2m22s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 4m6s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 4m0s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 5m5s
AI Code Review / AI Code Review (pull_request) Successful in 5m11s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 1m50s
CI/CD Pipeline / Unit Tests (pull_request) Failing after 5m47s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 6m22s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 12s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 41s
08179d1369
vitest outputs ANSI color codes that interfere with grep matching.
'No test files found' skip logic was not triggered, causing CI failure.
Added sed to strip ANSI codes before grep check.

Closes #1221
Author
Owner

CI 失败排查结果

1. Frontend Unit Tests 已修复

根因vitest related src/api/client.ts src/hooks/useAuth.ts 找不到相关测试文件,输出 No test files found, exiting with code 1
脚本 vitest_incremental.sh 有跳过逻辑(grep "No test files found"),但 vitest 输出包含 ANSI 颜色转义码,导致 grep 匹配失败。
修复:在 grep 前用 sed 去掉 ANSI 转义码。

2. Staging API Integration Tests CI 基础设施问题

根因Checkout code 步骤就失败了,develop 分支本身也有同样的失败(Staging API Integration Tests (push) - Failing after 1m45s)。与本 PR 代码修改无关。

3. Preview Deploy CI 环境问题

根因Build frontend 步骤报 ENOENT: no such file or directory, open '/workspace/apps/web/package.json'。代码 checkout 后文件不在预期路径,是 CI runner 环境配置问题,与本 PR 代码修改无关。


已推送 CI 脚本修复,等待 CI 重跑。

## CI 失败排查结果 ### 1. Frontend Unit Tests ✅ 已修复 **根因**:`vitest related src/api/client.ts src/hooks/useAuth.ts` 找不到相关测试文件,输出 `No test files found, exiting with code 1`。 脚本 `vitest_incremental.sh` 有跳过逻辑(`grep "No test files found"`),但 vitest 输出包含 ANSI 颜色转义码,导致 grep 匹配失败。 **修复**:在 grep 前用 `sed` 去掉 ANSI 转义码。 ### 2. Staging API Integration Tests ❌ CI 基础设施问题 **根因**:`Checkout code` 步骤就失败了,develop 分支本身也有同样的失败(`Staging API Integration Tests (push) - Failing after 1m45s`)。与本 PR 代码修改无关。 ### 3. Preview Deploy ❌ CI 环境问题 **根因**:`Build frontend` 步骤报 `ENOENT: no such file or directory, open '/workspace/apps/web/package.json'`。代码 checkout 后文件不在预期路径,是 CI runner 环境配置问题,与本 PR 代码修改无关。 --- 已推送 CI 脚本修复,等待 CI 重跑。
Collaborator

代码审查结果 - PR #1226

⚠️ 问题(2个需要修改)

  1. scripts/ci/vitest_incremental.sh 第60-70行:测试失败逻辑缺失,导致 CI 误报通过。

    • 问题说明:代码增加了对 "No test files found" 的判断并使其退出码为 0,但缺少了对测试真正失败(VITEST_EXIT 非 0 且非 "No test files found")的处理分支。如果测试用例执行失败,脚本将继续执行并以 0 退出,导致 CI 错误地认为构建成功。
    • 后果:测试失败的代码将被合并到主干。
    • 建议:在 if [ "$VITEST_EXIT" -eq 0 ] 逻辑块后添加 else exit $VITEST_EXIT,或者在脚本末尾根据 VITEST_EXIT 决定退出码。
  2. apps/web/src/api/client.ts 第63-66行:URL 匹配逻辑过于宽松,存在误判风险。

    • 问题说明:使用 includes 进行字符串匹配(如 /auth/login)容易误伤。如果存在 /auth/login-verify/auth/login-status 等其他端点,也会被匹配到。如果这些端点返回 401,本应触发 Token 刷新,却被错误地排除了。
    • 后果:特定业务场景下 Token 过期后无法自动刷新,导致用户意外登出。
    • 建议:使用正则表达式(如 /\/auth\/login$/)确保匹配的是完整路径或明确的路径结尾,或者严格比对 URL 路径数组。

💡 建议(1个可选)

  1. 文件权限规范
    • apps/web/src/api/client.tsapps/web/src/hooks/useAuth.ts 的文件权限从 644 变更为 755(可执行)。源代码文件通常不需要可执行权限,建议还原为 644 以符合安全规范和项目整洁度。

格式检查通过 | 逻辑审查需修改 | 建议关注性能


🤖 由 AI 代码审查机器人自动生成 | 2026-08-03 06:02:30 | 模型:

## 代码审查结果 - PR #1226 ### ⚠️ 问题(2个需要修改) 1. **scripts/ci/vitest_incremental.sh 第60-70行**:测试失败逻辑缺失,导致 CI 误报通过。 - **问题说明**:代码增加了对 "No test files found" 的判断并使其退出码为 0,但缺少了对测试真正失败(`VITEST_EXIT` 非 0 且非 "No test files found")的处理分支。如果测试用例执行失败,脚本将继续执行并以 0 退出,导致 CI 错误地认为构建成功。 - **后果**:测试失败的代码将被合并到主干。 - **建议**:在 `if [ "$VITEST_EXIT" -eq 0 ]` 逻辑块后添加 `else exit $VITEST_EXIT`,或者在脚本末尾根据 `VITEST_EXIT` 决定退出码。 2. **apps/web/src/api/client.ts 第63-66行**:URL 匹配逻辑过于宽松,存在误判风险。 - **问题说明**:使用 `includes` 进行字符串匹配(如 `/auth/login`)容易误伤。如果存在 `/auth/login-verify` 或 `/auth/login-status` 等其他端点,也会被匹配到。如果这些端点返回 401,本应触发 Token 刷新,却被错误地排除了。 - **后果**:特定业务场景下 Token 过期后无法自动刷新,导致用户意外登出。 - **建议**:使用正则表达式(如 `/\/auth\/login$/`)确保匹配的是完整路径或明确的路径结尾,或者严格比对 URL 路径数组。 ### 💡 建议(1个可选) 1. **文件权限规范**: - `apps/web/src/api/client.ts` 和 `apps/web/src/hooks/useAuth.ts` 的文件权限从 `644` 变更为 `755`(可执行)。源代码文件通常不需要可执行权限,建议还原为 `644` 以符合安全规范和项目整洁度。 --- ❌ 格式检查通过 | ❌ 逻辑审查需修改 | ✅ 建议关注性能 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-08-03 06:02:30 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
xiaoxia closed this pull request 2026-08-03 14:31:50 +08:00
Author
Owner

⚠️ 此PR已关闭。分支未基于最新develop(merge_base过时导致mergeable=false)。

已创建新PR从 fix/1221-auth-401-interceptor-v2(rebased到最新develop 3e24f8de)替代。

⚠️ 此PR已关闭。分支未基于最新develop(merge_base过时导致mergeable=false)。 已创建新PR从 `fix/1221-auth-401-interceptor-v2`(rebased到最新develop 3e24f8de)替代。

🗑️ 预览环境已清理

PR #1226 已关闭或合并,对应的预览环境已被清理。

如有需要,可以重新打开 PR 来重新生成预览环境。

🗑️ **预览环境已清理** PR #1226 已关闭或合并,对应的预览环境已被清理。 > 如有需要,可以重新打开 PR 来重新生成预览环境。
Some checks are pending
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 47s
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 54s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 53s
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 56s
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
Preview Deploy / Deploy Preview Environment (pull_request) Failing after 1m2s
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / Canary Release to Production (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Successful in 1m8s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 2m11s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 2m22s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 4m6s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 4m0s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 5m5s
AI Code Review / AI Code Review (pull_request) Successful in 5m11s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 1m50s
CI/CD Pipeline / Unit Tests (pull_request) Failing after 5m47s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 6m22s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 12s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 41s

Pull request closed

Sign in to join this conversation.