发生了什么
每封验证、魔法链接、邀请和重置邮件都包含一个返回你应用的链接。你的认证服务商或框架根据某个设置生成这个链接:站点 URL、重定向 URL,或邮件发送程序配置的主机。如果该设置仍是 http://localhost:3000,每封邮件都会指向开发者自己的电脑。
有时链接本身是托管的,例如 https://yourproject.supabase.co/auth/v1/verify?...,只有它之后重定向到的页面是本地的。验证成功后,浏览器被送到 localhost:3000 并失败。这种情况很容易被忽略,因为邮件看起来没问题。
在 Supabase 中修复(包括在你自己的 Supabase 项目上的 Lovable 应用)
- 在 Supabase 控制台中,打开 Authentication → URL Configuration。
- 把 Site URL 设置为你的线上地址,例如
https://your-app.lovable.app或你自己的域名。新的 Supabase 项目这里默认是http://localhost:3000。 - 把你使用的其他所有环境(预发布、预览域名、用于开发的 localhost)添加到 Redirect URLs。预览部署支持通配符。
- 如果你的代码在调用注册或登录时传入
emailRedirectTo或redirectTo,请根据当前站点生成,例如window.location.origin,或使用环境变量。不在允许列表中的重定向会回退到 Site URL。 - 如果你自定义了邮件模板,检查它们使用的是模板的确认 URL 或站点 URL 变量,而不是硬编码的地址。
在 Firebase Authentication 中修复
- 检查你的代码在发送验证或登录链接时,在操作代码设置中传入的继续 URL。它应来自环境配置,而不是硬编码的
http://localhost。 - 在 Authentication → Settings → Authorized domains 下添加你的线上域名。
在其他技术栈中修复
- Auth.js / NextAuth: 在托管平台无法自动推断的情况下,设置部署 URL(
AUTH_URL,旧版本为NEXTAUTH_URL)。 - Ruby on Rails: 在每个环境的配置中设置
config.action_mailer.default_url_options,并使用正确的host。 - Django: 根据请求或 Sites 框架生成链接,并确保站点的域名不再是
example.com或localhost。 - Laravel: 为每个环境设置
APP_URL。 - 其他技术栈: 在代码中搜索
localhost:3000,并把它移到环境变量中。
在手机模拟器上
iOS 模拟器与你的电脑共享网络,所以 localhost 链接能在其中打开。Android 模拟器不行:它通过 10.0.2.2 访问你的电脑,所以指向 localhost:3000 的链接什么也打不开。对于这类模拟器,把应用的链接指向 http://10.0.2.2:3000,更好的做法是指向两者都能访问的预发布地址。详见移动应用。
Proxy Mail QA 如何标记
当测试邮件中的链接指向本地地址,或验证后重定向到本地地址时,Proxy Mail QA 会在 Accounts 行上标记(“重定向到 localhost:3000”),并在收件箱中说明原因。你一眼就能看出是环境配置错误,而不用等别人报告“验证坏了”。
如果你是有意测试本地构建,请选择 This is my dev environment。之后该项目中指向该主机的链接不再被标记,邮件检查也会放行它们。你可以在项目设置中再次移除。编程智能体可以用 MCP 工具 mark_dev_host 自行标记该主机,测试套件可以用 POST /v1/project/dev-hosts(Node.js 客户端中的 markDevHost,Python 辅助库中的 mark_dev_host)。