Skip to content

2026-03-03 Neon 鉴权残留代码调查报告

1. 错误信息

生产环境访问 https://01s-11comm.ruan-cat.com/ 出现 500 错误:

json
{
	"error": true,
	"url": "https://01s-11comm.ruan-cat.com/",
	"status": 500,
	"message": "Server Error"
}

2. 最近变更

根据 git 历史,项目在 2026-03-03 进行了一系列鉴权相关的删除操作:

log
29058510 📃 docs: 补充生产环境故障排查的提示文档
474cee98 📝 docs: 清理文档中的 TODO 标记
89dcd357 📃 docs: 更新文档声明放弃鉴权,删除过时报告
683d8f21 🦄 refactor(api): 删除所有鉴权 API 端点
e970e44c 🦄 refactor(auth): 删除鉴权工具函数
6b54844f 🦄 refactor(auth)!: 删除鉴权中间件和插件,放弃 Neon Auth 集成

关键提交 6b54844f 删除了:

  • apps/admin/server/middleware/2.auth.ts (JWT 认证中间件)
  • apps/admin/server/middleware/3.validate.ts (权限验证中间件)
  • apps/admin/server/plugins/auth.ts (Auth 插件)

3. 发现的 Neon Auth 相关残留

3.1 配置文件残留

apps/admin/nitro.config.ts (第 55-58 行)

问题:Nitro 配置中仍然声明了 Neon Auth 相关的运行时配置

typescript
runtimeConfig: {
  databaseUrl: getVercelEnv("DATABASE_URL") || process.env.DATABASE_URL || "",

  /** Neon Auth 服务基础 URL */
  neonAuthBaseUrl: getVercelEnv("NEON_AUTH_BASE_URL") || process.env.NEON_AUTH_BASE_URL || "",
  /** Neon Auth Cookie 密钥(至少 32 字符) */
  neonAuthCookieSecret: getVercelEnv("NEON_AUTH_COOKIE_SECRET") || process.env.NEON_AUTH_COOKIE_SECRET || "",

  publicBaseUrl: process.env.PUBLIC_BASE_URL || "http://localhost:8080",
},

影响

  • 虽然配置本身不会导致错误,但会误导开发者
  • 在 Cloudflare Worker 部署配置中(第 140-145 行)也有相关环境变量映射

apps/admin/nitro.config.ts (第 140-145 行)

typescript
cloudflare: {
  wrangler: {
    vars: {
      ...(getVercelEnv("NEON_AUTH_BASE_URL") && {
        comm_admin_11__NEON_AUTH_BASE_URL: getVercelEnv("NEON_AUTH_BASE_URL"),
      }),
      ...(getVercelEnv("NEON_AUTH_COOKIE_SECRET") && {
        comm_admin_11__NEON_AUTH_COOKIE_SECRET: getVercelEnv("NEON_AUTH_COOKIE_SECRET"),
      }),
    }
  }
}

3.2 依赖包残留

apps/admin/package.json (第 86 行)

问题@neondatabase/auth 包仍然在 dependencies 中

json
"dependencies": {
  "@neondatabase/auth": "0.2.0-beta.1",
}

影响

  • 增加构建产物体积
  • 可能导致未使用的代码被打包
  • 违反 CLAUDE.md 第 12.2.1 节规定(禁止引入 @neondatabase/auth 包)

3.3 环境变量文件残留

⚠️ apps/admin/.env (第 44、48 行)

env
NEON_AUTH_BASE_URL=https://ep-cold-surf-a1x1hkmn.neonauth.ap-southeast-1.aws.neon.tech/neondb/auth
NEON_AUTH_COOKIE_SECRET=njwWxbW4uNsGoqm+QE8hufLX/xl8664iEaf3L/FTGoY=

影响

  • 本地开发环境可能会误读这些配置
  • 如果生产环境也配置了这些变量,可能导致混淆

3.4 文档残留

⚠️ apps/admin/src/docs/auth-guide.md

问题:认证系统使用文档仍然存在,包含大量 Neon Auth 配置说明

影响

  • 误导新开发者
  • 与项目实际状态不符

3.5 测试文件残留

⚠️ 测试文件中的 Neon Auth 引用

  • apps/admin/tests/nitro/middleware/auth.test.ts:236
  • apps/admin/tests/nitro/auth/rls-policy.test.ts:55
  • apps/admin/tests/nitro/auth/org-community-isolation.test.ts:56
typescript
const testSecret = process.env.NEON_AUTH_COOKIE_SECRET || "development-secret";

影响

  • 测试代码已失效
  • 可能导致测试套件运行失败

3.6 已清理的部分 ✅

以下文件/目录已被正确删除:

  • apps/admin/server/middleware/2.auth.ts (JWT 认证中间件)
  • apps/admin/server/middleware/3.validate.ts (权限验证中间件)
  • apps/admin/server/plugins/auth.ts (Auth 插件)
  • apps/admin/server/utils/auth-client.ts (Auth 客户端工具)
  • apps/admin/server/utils/rls-helpers.ts (RLS 辅助函数)
  • apps/admin/server/api/auth/** (所有鉴权 API 端点)

4. 数据流分析

4.1 当前请求流程

plain
用户请求 → Nitro 服务器

1.logger.ts (请求日志中间件) ✅ 正常

db-init.ts (数据库懒加载插件) ✅ 正常

API 路由处理 ✅ 正常

4.2 潜在问题点

虽然中间件和插件已删除,但配置文件中的残留可能导致:

  1. 构建时问题

    • @neondatabase/auth 包可能在构建时被引入
    • 虽然没有代码使用它,但可能影响构建产物
  2. 运行时问题

    • nitro.config.ts 中的 runtimeConfig 会尝试读取 NEON_AUTH_BASE_URL 等环境变量
    • 如果生产环境配置了这些变量但服务不可用,可能导致意外行为
  3. 部署配置问题

    • Cloudflare Worker 的 wrangler.vars 配置会尝试注入 Neon Auth 环境变量
    • 这些变量在运行时虽然不会被使用,但会占用配置空间

5. 根因假设

基于证据分析,生产环境 500 错误的最可能原因是:

假设 1:构建产物中包含了 @neondatabase/auth 的残留代码

证据

  • package.json 中仍然声明了 @neondatabase/auth 依赖
  • 虽然没有代码直接导入,但可能通过其他方式被引入

验证方法

  • 检查构建产物中是否包含 @neondatabase/auth 相关代码
  • 查看生产环境的错误日志

假设 2:环境变量配置冲突

证据

  • nitro.config.ts 仍然尝试读取 NEON_AUTH_BASE_URL 等环境变量
  • 如果生产环境配置了这些变量,可能导致意外行为

验证方法

  • 检查 Vercel/Cloudflare 控制台中的环境变量配置
  • 确认是否配置了 NEON_AUTH_BASE_URL 等变量

假设 3:其他未发现的鉴权代码残留

证据

  • 项目规模较大,可能存在其他未被发现的鉴权代码引用

验证方法

  • 进行更全面的代码搜索
  • 检查所有 API 路由文件

6. 建议的修复方案

6.1 立即修复(高优先级)

1. 删除 @neondatabase/auth 依赖

bash
cd apps/admin
pnpm remove @neondatabase/auth

2. 清理 nitro.config.ts 中的 Neon Auth 配置

删除以下内容:

  • 第 55-58 行:neonAuthBaseUrlneonAuthCookieSecret 配置
  • 第 140-145 行:Cloudflare Worker 中的 Neon Auth 环境变量映射

3. 清理环境变量文件

apps/admin/.env 中删除:

  • NEON_AUTH_BASE_URL
  • NEON_AUTH_COOKIE_SECRET

6.2 后续清理(中优先级)

4. 删除或更新文档

  • 删除 apps/admin/src/docs/auth-guide.md
  • 或者添加明确的废弃声明

5. 清理测试文件

  • 删除或更新 apps/admin/tests/nitro/middleware/auth.test.ts
  • 删除或更新 apps/admin/tests/nitro/auth/ 目录下的所有测试

6.3 验证步骤(必须执行)

6. 本地验证

bash
# 1. 清理依赖
pnpm install

# 2. 本地构建
pnpm build:prod

# 3. 检查构建产物
# 确认没有 @neondatabase/auth 相关代码

# 4. 本地预览
pnpm preview

7. 生产环境验证

  • 部署到生产环境
  • 访问 https://01s-11comm.ruan-cat.com/
  • 确认 500 错误已解决

7. 预防措施

7.1 代码审查清单

在未来的鉴权相关变更中,确保检查:

  • [ ] 删除相关依赖包
  • [ ] 清理配置文件
  • [ ] 清理环境变量
  • [ ] 更新或删除文档
  • [ ] 清理测试文件
  • [ ] 验证构建产物

7.2 自动化检测

建议添加 lint 规则或 CI 检查:

typescript
// 禁止导入 @neondatabase/auth
{
  "rules": {
    "no-restricted-imports": ["error", {
      "paths": [{
        "name": "@neondatabase/auth",
        "message": "本项目不使用 Neon Auth,请参考 CLAUDE.md 第 12.2.1 节"
      }]
    }]
  }
}

8. 总结

8.1 关键发现

  1. 配置残留nitro.config.ts 中仍有 Neon Auth 配置
  2. 依赖残留@neondatabase/auth 包仍在 package.json
  3. 环境变量残留.env 文件中仍有 Neon Auth 相关配置
  4. 文档残留:认证系统文档仍然存在

8.2 修复优先级

优先级修复项预计影响
P0删除 @neondatabase/auth 依赖
P0清理 nitro.config.ts 配置
P1清理 .env 环境变量
P2删除或更新文档
P2清理测试文件

8.3 下一步行动

  1. 立即执行 P0 优先级修复
  2. 本地验证构建和运行
  3. 部署到生产环境
  4. 监控生产环境日志
  5. 执行 P1、P2 优先级清理

9. 参考文件

文件路径状态说明
apps/admin/nitro.config.ts包含 Neon Auth 配置残留
apps/admin/package.json包含 @neondatabase/auth 依赖
apps/admin/.env⚠️包含 Neon Auth 环境变量
apps/admin/src/docs/auth-guide.md⚠️认证系统文档
apps/admin/tests/nitro/middleware/auth.test.ts⚠️认证中间件测试
apps/admin/server/middleware/2.auth.ts已删除
apps/admin/server/middleware/3.validate.ts已删除
apps/admin/server/plugins/auth.ts已删除
apps/admin/server/utils/auth-client.ts已删除

贡献者

The avatar of contributor named as ruan-cat ruan-cat

页面历史

最近更新