state_not_found
请求中未找到 state 参数。
它是什么?
在 OAuth 回调过程中,Better Auth 期望在传入请求中存在 state 值。
这个 state 最初在 OAuth 流程启动时生成,并发送给提供方。当
提供方重定向回你的应用时,它应该在回调请求中包含相同的 state 值。如果
回调请求中完全缺少 state(查询参数或请求体),我们无法验证流程,请求将被拒绝。
此检查通过确保回调属于发起流程的同一浏览器会话,来防止 CSRF 和重放攻击。
常见原因
- 你直接导航到了
/api/auth/callback,而未先启动 OAuth 流程。 - 反向代理、CDN 或重写规则从回调请求中剥离了查询或请求体参数。
- 授权请求中未向 OAuth 提供方传递
state(自定义或手动流程覆盖了参数)。 - 提供方注册的回调 URL 与实际回调路由不匹配,导致中间重定向并丢弃查询或请求体参数。
- 由于框架路由或中间件的原因,回调到达了一个与预期不同的路由/处理程序,且该处理程序没有读取你预期的查询或请求体。
- 移动/WebView 或深度链接交接打开了一个丢失原始查询字符串的新上下文。
解决方法
通过 Better Auth API 启动流程
始终通过 Better Auth 启动 OAuth 流程,以便正确生成并发送 state。除非你完整镜像了 Better Auth 的参数,否则请避免直接调用回调端点或构造授权 URL。
验证回调 URL 和请求方式
- 确保提供方配置的回调 URL 与应用的
/api/auth/callback路由完全匹配(包括协议和域名)。 - 大多数提供方通过 GET 和查询参数进行重定向。如果你有自定义处理程序或方法,请确认处理程序读取查询/请求体的方式与提供方的重定向一致。
检查代理、重写和中间件
- 确认任何反向代理(Vercel、Cloudflare、Nginx)和应用级重写都保留了完整的查询字符串(包括
state)。 - 如果有在回调路径上进行重定向或重写的中间件,请确保其完整传递查询和请求体参数。
本地调试
使用浏览器开发者工具 → 网络面板检查回调请求:
- 确认回调 URL 包含
?state=...(或如果期望存在,则请求体中包含state)。 - 确认授权请求之前已在同一会话中发送,并且在重定向回之前存在一个
stateCookie。 - 在本地调试期间,在回调处理程序中记录请求查询/请求体字段,以确认服务器实际接收到什么。
需要考虑的边缘情况
- 预览环境和生产域名在发生额外重定向或重写时行为可能不同。
- 移动/WebView 环境和深度链接在传递过程中可能丢失或更改查询参数。