最近升级 better-auth 后,在产品环境发布的时候遇到了一个新的错误:
2025-12-03T01:03:01.038Z ERROR [Better Auth]: Invalid origin: https://www.example.com
2025-12-03T01:03:01.038Z INFO [Better Auth]: If it's a valid URL, please add https://www.example.com to trustedOrigins in your auth config
Current list of trustedOrigins: https://0.0.0.0:3000
这个问题是最近才出现的,之前没有遇到过,所以需要排查最近 better-auth 的更新记录。
排查步骤
在检查了 better-auth 的 chagelogs 页面之后,通过关键词搜索,我发现在 v1.4.3 版本引入了这个改动:
🚀 Features
- Add support for trusted proxy headers in base URL inference – @Bekacru
于是进一步排查,发现果然是这个改动导致的。具体的改动在: PR#6285
简单来说,在老版本中,better-auth 可以通过 X-Forwarded-* 头来判断请求的来源地址,从而正确处理反向代理后的请求。但是在新版本中,为了提升安全性,认为 Http Headers 是不安全的,有伪造风险,所以不再默认信任这些头信息,而是要求用户手动配置可信任的来源地址。
解决方案
既然已经明白问题,那么解决这个问题也很简单。这里有几种解决方案
配置 baseURL 或 BETTER_AUTH_URL 环境变量
baseURL 和 BETTER_AUTH_URL 都是 better-auth 配置项,用于指定请求的来源地址,从而解决 Invalid origin 错误。
import { betterAuth } from "better-auth";
export const auth = betterAuth({
baseURL: "https://example.com",
});
配置 trustedOrigins
trustedOrigins 是一个数组,用于指定可信任的来源地址列表。将你的域名添加到这个列表中即可解决问题。
它同时支持静态配置和动态配置两种
// static config
import { betterAuth } from "better-auth";
export const auth = betterAuth({
trustedOrigins: ["http://localhost:3000", "https://example.com"],
});
// dynamic config
export const auth = betterAuth({
trustedOrigins: async (request: Request) => {
// Return an array of trusted origins based on the request
return ["https://dynamic-origin.com"];
},
});
启用 advanced.trustedProxyHeaders
截至发稿时,这个参数并未在官方文档列出。但是从 PR#6285 可以看出,启用这个参数后,better-auth 会继续信任 X-Forwarded-* 头信息,像老版本一样。从而解决 Invalid origin 错误。
同时,需要管理员自行注意风险,确保你的应用完全由反向代理提供服务,并且不会直接暴露在互联网中。
import { betterAuth } from "better-auth";
export const auth = betterAuth({
advanced: {
trustedProxyHeaders: true,
},
});
总结
better-auth 在新版本中对于安全性的要求更严苛了,默认不再信任 Http Headers,而是要求用户手动配置可信任的来源地址。
遇到 Invalid origin 错误时,可以通过配置 baseURL、trustedOrigins 或启用 advanced.trustedProxyHeaders 来解决问题。选择合适的方案时,请务必考虑应用的部署环境和安全性需求。