老胡茶室
老胡茶室

排错: Better Auth 报错 Invalid origin 解决方案

冯宇

最近升级 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 是不安全的,有伪造风险,所以不再默认信任这些头信息,而是要求用户手动配置可信任的来源地址。

解决方案

既然已经明白问题,那么解决这个问题也很简单。这里有几种解决方案

配置 baseURLBETTER_AUTH_URL 环境变量

baseURLBETTER_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 错误时,可以通过配置 baseURLtrustedOrigins 或启用 advanced.trustedProxyHeaders 来解决问题。选择合适的方案时,请务必考虑应用的部署环境和安全性需求。

精品内容