老胡茶室
老胡茶室

排错:Vercel Preview 环境下 Better Auth 登录 invalid origin 问题

胡伟红

症状

项目部署到了 Vercel Preview 环境中,配置都正确。但是使用 Better Auth 的 GitHub 登录时,遇到了一个特殊的问题:

  • 页面可以正常访问
  • 登录功能无法使用
  • 注销后,用户 session 还在,无法正常注销
  • Vercel 日志中显示以下错误信息:
Invalid origin: preview.domain.com
If it's a valid URL, please add preview.domain.com to trustedOrigins in your auth config
Current list of trustedOrigins: your-app-git-branch-username.vercel.app

奇怪的是,这个问题在 Product 环境下没有出现。

原因

Vercel Preview 部署具有以下特点:

  1. 自动生成唯一的预览 URL(格式:your-app-git-branch-username.vercel.app
  2. 支持配置自定义预览域名(如 preview.your-domain.com

进行认证时,Better Auth 会验证请求的 origin。缺省情况下,Better Auth 会将 your-app-git-branch-username.vercel.app 加入到信任列表中,而对于自定义预览域名(preview.your-domain.com),则不在信任列表之列,就会出现 invalid origin 错误。

还有一个可能的原因是,Vercel 在预览环境中可能会对请求头进行修改或重写,导致 origin 信息被改变或丢失,从而触发 Better Auth 的安全检查机制。

解决

在 Better Auth 的 GitHub Issues 中找到了相关讨论:Invalid Origin error with BetterAuth on Vercel preview deployments,里面的解决方法跟 log 中的提示一样,需要在 Better Auth 配置中添加 trustedOrigins 参数:

export const auth = betterAuth({
  trustedOrigins: YOUR_SITE_URL,
  // ... 其他配置
});

其中,YOUR_SITE_URL 可通过环境变量配置,这样当发布多个环境的应用时也不用调整代码。

添加配置后重新部署,问题得到解决。