Skip to content

/auth/* 转发层把内部请求对象直接交给 better-auth:未知 auth 子路径(如 POST /api/v1/auth/login)返回 500 并外漏内部 TypeError,而非干净 404/405 #5085

Description

@os-zhuang

#5078 的实测定级 boot 中发现(2026-08-04,origin/main @ 29c6c9d,showcase,真实 boot 非 grep 推断),未认领。查重:headers.get 全仓开放 issue 零命中。

实测

POST /api/v1/auth/login
→ HTTP 500
{"success":false,"error":{"code":"INTERNAL_ERROR","message":"request.headers.get is not a function","httpStatus":500}}

阳性对照:POST /api/v1/auth/sign-in/email(better-auth 真实路由)→ 200 + set-cookie: better-auth.session_token=…,同一 boot 同一转发层,工作正常。

判读

request.headers.get is not a function 表明 /auth/* 的某条转发路径把内部请求形状(headers 为普通对象)直接交给了 better-auth 的 fetch 风格 handler(其调用 request.headers.get())。已知路由(sign-in/email)工作正常,说明主转发路径有正确的 Request 转换 —— 疑为某个次级/回退分支漏转换。两个问题叠加:

  1. 错误类别错了:不存在的 auth 子路径该是 404/405,现在是 500 —— /auth/login 是极易被猜到的路径(行业惯用名),真实用户/集成方会撞上;
  2. 内部错误文案外漏:raw TypeError message 进了响应体 —— 仓内 5xx 本有 looksLikeInternalErrorLeak 消毒惯例(error-envelope 一族),此路径绕过了它。

落点初判(分诊改标即可)

初判落 packages/runtime 的 auth 域转发层或其请求转换(domain:cli);若实读发现转换责任在 plugin-auth 侧,分诊时改 domain:identity。修法方向:未匹配的 auth 子路径在转发前给干净 404,或补全该分支的 Fetch Request 转换;任一情况下 5xx 出口过消毒。

复现

pnpm dev -- --fresh --seed-admin -p <port>(showcase)→ curl -X POST http://localhost:<port>/api/v1/auth/login

关联:#5078(发现现场)、#3962(「失败说 HTTP」的错误统一先例)、ADR-0076(域属主)。

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions