症状
项目部署到了 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 部署具有以下特点:
- 自动生成唯一的预览 URL(格式:
your-app-git-branch-username.vercel.app
) - 支持配置自定义预览域名(如
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
可通过环境变量配置,这样当发布多个环境的应用时也不用调整代码。
添加配置后重新部署,问题得到解决。