OAuth 代理
Better Auth 的 OAuth 代理插件
一个允许你代理 OAuth 请求的代理插件。在开发环境和预发布部署中非常有用,因为重定向 URL 无法提前确定并添加到 OAuth 提供商。
安装
在你的 auth 配置中添加此插件
import { betterAuth } from "better-auth"
import { oAuthProxy } from "better-auth/plugins"
export const auth = betterAuth({
plugins: [
oAuthProxy({
productionURL: "https://my-production-app.com",
}),
],
socialProviders: {
github: {
clientId: process.env.GITHUB_CLIENT_ID || "",
clientSecret: process.env.GITHUB_CLIENT_SECRET || "",
},
},
})插件会自动将 OAuth 请求路由到你的生产服务器。
在你的 OAuth 提供商处添加重定向 URL
在你的 OAuth 提供商的开发者控制台(例如 GitHub、Google)中,使用你的生产域名注册回调 URL。例如:
https://my-production-app.com/api/auth/callback/github只需注册生产环境的回调 URL。插件会自动处理将预览和开发环境的 OAuth 请求路由到生产环境。
添加可信来源
由于预览和开发服务器会通过生产环境重定向,你需要将它们添加为 trustedOrigins:
export const auth = betterAuth({
// ...其他配置
trustedOrigins: [
"http://localhost:3000",
"https://my-app-*-preview.example.com",
],
})所有参与 OAuth 代理流程的环境必须共享相同的加密密钥。默认情况下,插件使用 BETTER_AUTH_SECRET。为了避免跨环境共享主密钥,你可以提供一个专用的 secret 选项(参见选项)。
工作原理
该插件允许你在多个环境中使用单一的 OAuth 客户端(注册于你的生产 URL),例如预览部署或本地开发。
- 预览服务器发起 OAuth,重定向至包含生产环境重定向 URI 的 OAuth 提供商
- OAuth 提供商回调至生产服务器
- 生产服务器用 code 换取令牌并获取用户信息
- 生产服务器加密用户信息并重定向回预览服务器(生产环境无数据库写入)
- 预览服务器解密用户信息,在自己的数据库创建用户/会话,并设置会话 Cookie
import { authClient } from "@/lib/auth-client"
await authClient.signIn.social({
provider: "github",
callbackURL: "/dashboard"
})加密的用户信息通过 URL 查询参数传递,只有共享相同密钥的服务器能解密。这也允许预览环境使用与生产环境不同的数据库(如果需要)。
此插件仅适用于开发和预发布环境。如果 baseURL 和 productionURL 相同,插件不会代理请求。
选项
productionURL:你的生产服务器的 URL。如果此值与 auth 配置中的 baseURL 相匹配,请求将不会被代理。默认为 BETTER_AUTH_URL 环境变量。
currentURL:插件会自动确定应用当前的 URL。它会优先检查请求的 URL、流行托管服务提供商的特定环境变量,最后回退到 auth 配置中的 baseURL。只有在环境中无法正确推断 URL 时才需要手动设置。
maxAge:加密载荷的最大有效期(秒)。超过此时间的载荷将被拒绝以防止重放攻击。保持较短的值(例如 30-60 秒)可以最大程度减少潜在重放攻击的窗口,同时仍允许正常的 OAuth 流程。默认为 60 秒。
secret:用于 OAuth 代理流程中加密和解密数据的专用密钥。设置后,此密钥替代全局的 BETTER_AUTH_SECRET。如果密钥在多个环境间共享,泄露的代理密钥无法伪造会话或解密由主密钥保护的其他数据,从而限制爆炸半径。所有参与代理流程的环境必须共享相同的 secret 值。