Supabase Auth 如何让开发者的生活更轻松,以及它为何不仅仅是 GoTrue 的克隆
你有没有过这种感觉:当你启动一个新项目时,意识到你需要再次设置注册、密码恢复和邮箱验证?已经是第一百次了。直接使用 Firebase 或 Supabase Cloud 这样的现成服务似乎更简单。但有时候项目需要完全掌控数据,或者需要一个封闭的环境,而云解决方案根本无法通过安全审计。这时 Supabase Auth 就登场了——一个基于 Go 的认证服务器,你可以把它部署在家用服务器或工业集群上。
它到底是什么
如果你使用过 Supabase 生态,你可能用过他们的 Auth。但并不是每个人都知道它是一个独立的开源微服务,可以独立运行。团队最初是基于 Netlify 的 GoTrue 项目构建的,但在过去几年里,它们已经分道扬镳,现在已经是两个完全不同的项目了。
Supabase Auth 签发 JWT 令牌、管理用户,并与 PostgreSQL 的行级安全策略(RLS)完美配合。从本质上讲,它是你前端和数据库之间的桥梁,处理所有身份验证的繁琐工作。
实践中它有什么优势
这个项目的主要吸引力在于它开箱即用地覆盖了几乎所有现代 Web 需求。你不需要写一行代码就能实现 Google 或 Apple 登录。
无密码登录
魔法链接和短信 OTP 码已成为标准配置。Supabase Auth 默认支持这些功能。用户输入邮箱,收到链接,点击后——就登录系统了。对于移动应用,还支持通过 Twilio 或 Messagebird 等提供商进行手机号登录。
丰富的 OAuth 提供商列表
有超过十几种可选:从 Google、Facebook 和 GitHub 这样的经典选项,到 Discord、Notion、Slack,甚至是为企业需求准备的 WorkOS。配置只需要添加几个包含 Client ID 和 Secret 的环境变量即可。
刷新令牌轮换
这是一个重要的安全特性。服务器可以检测到旧的刷新令牌何时被重用。如果有人窃取了令牌并试图交换它,系统会捕获这一行为,并使该用户的整个会话链失效。这是一个防止重大事故的小细节。
PostgreSQL 兼容性
由于这个项目源自 Supabase,它针对 PostgreSQL 进行了优化。它不仅仅是在表中存储用户——它还支持复杂的行级访问控制逻辑。你不需要在每次数据库 API 请求中检查 user_id——PostgreSQL 会根据这个服务器签发的 JWT 自动处理。
底层工作原理
这个项目使用 Go 编写,非常轻量且快速。它只需要一个 PostgreSQL 数据库就能运行。
关于迁移的一个有趣的细节:它们在二进制文件启动时自动应用。这对 Docker 容器很方便——更新镜像,重启,数据库就准备好了。
如果你决定自托管,这里有一个用 Docker 快速启动环境的示例:
# Собираем бинарник
make build
# Запускаем инфраструктуру
make dev
之后,你将拥有一个运行在 9999 端口的 API,准备好处理请求。
配置注意事项
通过环境变量进行配置是微服务的标准做法,这里的环境变量确实很多。你可以配置一切:从最小密码长度到字符复杂度要求。
例如,如果你想禁用常规注册,只允许邀请登录,只需设置:
GOTRUE_DISABLE_SIGNUP=true
如果你需要启用验证码(支持 hCaptcha 和 Cloudflare Turnstile),只需通过 SECURITY_CAPTCHA_SECRET 变量传递密钥即可。
为什么你不应该忘记代理
README 中有开发者诚实的警告:在生产环境中运行认证服务器并不适合心脏脆弱的人。团队强烈建议将 Supabase Auth 放在 TLS 代理后面(Nginx、Kong 或云负载均衡器)。
对于计划迁移的人来说,一个重要的注意事项:Supabase Auth 已经删除了原始 GoTrue 的一些功能。例如,他们通过 instances 表移除了原生多租户支持。如果你的架构依赖于此,你需要么重新思考你的方案,要么继续使用 Netlify 的原始 GoTrue。
谁适合使用
我认为有三个主要场景,这个项目是必不可少的:
- 自托管项目:当你在自己的服务器上构建自己的 Firebase 替代品时。
- 企业解决方案:当公司安全策略禁止将用户数据存储在第三方云中时。
- 本地开发:即使你使用 Supabase Cloud,能够离线运行一个相同的认证服务器也是无价的。
Supabase Auth 是一个可靠的工具,消除了为授权重复造轮子的需要。是的,README 文档可能看起来枯燥且充满了端点列表,但代码本身是稳定的,并在 Supabase Cloud 的数百万用户中得到了验证。如果你需要一个可靠的、能够与 JWT 和 Postgres 配合的用户网关,它可能是目前 Go 中最好的解决方案之一。
相关项目