GET /auth/email-callback?token_hash=xxx&type=email
或真实 Supabase 回调形式:
GET /auth/email-callback?code=eb...
GET /auth/email-callback?error=access_denied&error_code=otp_expired&error_description=Email+link+is+invalid+or+has+expired
GET /auth/email-callback#access_token=...&refresh_token=...&expires_in=3600&token_type=bearer
它会做这些事:
若是 token_hash / type 模式,调用 Supabase /auth/v1/verify
若是 code 模式,尝试交换 PKCE 授权码
若是 error 模式,读取失败参数并渲染错误页
若是 #access_token= 模式,直接生成 Deep Link
生成 myapp://callback#... 这种自定义 scheme 的深链接
返回对应的 HTML 状态页
3. OAuth 回调
GET /auth/oauth-callback?code=xxx
GET /auth/oauth-callback?code=xxx&code_verifier=yyy
Worker 会请求:
POST {SUPABASE_URL}/auth/v1/token?grant_type=pkce
并使用返回的 session 生成 deep link。该回调主要用于自己维护 PKCE 流程的 OAuth 登录场景。
Supabase Auth Callback Worker
English version | 中文版
这是一个 Cloudflare Worker,用于接收 Supabase 认证回调,验证邮箱验证结果或 OAuth 授权结果,并把成功后的 session 转成自定义 Deep Link,唤起本地 App。
功能概览
/auth/email-callback/auth/oauth-callback/healthtoken_hash+type形式(手工 / 兼容模式)?code=.../?error=.../#access_token=...myapp://...Deep Link端点说明
1. 健康检查
返回 JSON:
2. 邮箱验证回调
或真实 Supabase 回调形式:
它会做这些事:
token_hash/type模式,调用 Supabase/auth/v1/verifycode模式,尝试交换 PKCE 授权码error模式,读取失败参数并渲染错误页#access_token=模式,直接生成 Deep Linkmyapp://callback#...这种自定义 scheme 的深链接3. OAuth 回调
Worker 会请求:
并使用返回的 session 生成 deep link。该回调主要用于自己维护 PKCE 流程的 OAuth 登录场景。
Deep Link 生成规则
Worker 会把 session 参数拼成 hash 片段:
然后生成:
例如:
App 收到这个链接之后,就能用 access_token / refresh_token 直接恢复登录状态。
结果页
Worker 会返回两个状态页:
成功页会自动在 700ms 后尝试
window.location.href = deepLink,如果没有自动跳转,就显示手动“打开 App”按钮。环境变量
在 Cloudflare Worker 中使用这些变量:
说明:
SUPABASE_URL:Supabase Project URLSUPABASE_ANON_KEY:Supabase 的 anon / publishable keySUPABASE_REDIRECT_URL:用于邮箱验证的回调地址,必须和 Supabase Auth 配置中的 Redirect URL 一致DEEP_LINK_SCHEME:App 的 custom scheme,例如myappDEEP_LINK_HOST:App 的 deep link host,例如callbackMAIL_ENABLED:邮件功能开关,默认开启;但必须同时存在RESEND_API_KEY和MAIL_FROM才真正可用Mailer(可选)
src/mailer.js中实现了 Resend 邮件发送:isMailerEnabled(env):判断是否允许发送邮件sendEmail(env, mail):通用发送接口sendWelcomeEmail(env, to, appName):验证成功后的欢迎邮件发送条件:
如果未满足条件,Worker 会静默跳过发送,不影响认证流程。
本地开发
然后访问:
生产部署
如果要设置敏感变量:
其余非敏感变量可放在
wrangler.toml的[vars]中。Supabase 配置建议
1. Auth URL 配置
在 Supabase 控制台里配置:
至少包含:
如果你在认证邮件模板中使用自定义
redirect_to,请确保它和这里配置的一致。2. 邮箱验证码模板
这个 Worker 接收的标准邮箱验证入口通常是:
也支持 Supabase 实际回调返回的
?code=...或?error=...形式,因此可以直接用在真实邮件跳转场景中。典型用例
邮箱注册成功后
OAuth 登录成功后
code/auth/oauth-callback?code=...token接口链接失效或过期
error=access_denied&error_code=otp_expired...注意事项
service_rolesecret 传给 Worker 或前端SUPABASE_REDIRECT_URL必须和 Supabase Auth 配置一致许可证
本项目按你所在仓库的实际许可证发布。
OAuth 登录
上面的 OAuth 写法让 Supabase 直接把登录结果交给 Flutter,推荐用于
supabase_flutter。此流程不经过/auth/oauth-callback,也不需要把 Flutter SDK 内部的code_verifier传给 Worker。如果客户端自行实现 PKCE 并能安全保存
code_verifier,才使用 Worker OAuth 地址:回调请求必须包含与授权请求对应的
code_verifier,并且该地址也必须加入 Supabase 的 Authentication → URL Configuration → Redirect URLs。