如何通过Express透明代理Supabase Auth V1实现OAuth白标品牌化?
问题
我希望将Supabase项目域名(如xyz.supabase.co)隐藏在自定义API域名(api.mydomain.com)之后,实现更简洁的OAuth品牌化,让谷歌等平台的“选择账户继续访问...”界面显示我的域名而非Supabase域名。
我使用Express搭配http-proxy中间件,已成功代理/auth/v1和/rest/v1端点,但在OAuth重定向环节遇到问题:Supabase返回的302响应中Location头常指向原supabase.co域名,导致代理链断裂。
我在@supabase/supabase-js中使用了flowtype: 'pkce',有以下疑问:
- 代理这些请求是否会干扰加密握手或
state参数? - 如何正确配置
changeorigin和xfwd头,避免Supabase因主机不匹配拒绝请求? - 当前的中间件实现是否正确,能在不破坏OAuth完整性的前提下实现BaaS白标?
- 有没有无需升级Supabase Pro计划的更优架构?
当前中间件代码:
const supabaseProxy = createProxyMiddleware({ target: 'https://xyz.supabase.co', changeOrigin: true, secure: true, xfwd: true, logLevel: 'error', onProxyRes: (proxyRes, req, res) => { if (proxyRes.headers['location']) { proxyRes.headers['location'] = proxyRes.headers['location'] .replace('xyz.supabase.co', 'api.mydomain.com'); } } });
解决方案与分析
1. 代理对PKCE/state参数的影响
使用flowtype: 'pkce'时,代理不会干扰加密握手或state参数:
- PKCE的
code_verifier和code_challenge由客户端本地生成,全程不经过代理,Supabase仅验证客户端提交的这两个参数,代理仅做请求透传,不会触碰这些加密字段。 state参数是客户端生成的随机校验值,代理仅转发请求,不会修改该值,只要请求完整透传,Supabase的state校验逻辑就能正常工作。
2. changeorigin和xfwd的正确配置
你的当前配置已经符合要求:
changeOrigin: true:会将请求头中的Host替换为Supabase项目域名(xyz.supabase.co),确保Supabase收到的请求主机头匹配自身域名,不会触发主机不匹配的拒绝逻辑。xfwd: true:会添加X-Forwarded-For、X-Forwarded-Proto等头信息,让Supabase知晓请求的原始来源,Supabase能正确处理这些头,不会影响请求合法性。- 额外注意:如果自定义域名使用HTTPS,
secure: true必须保留,避免SSL证书校验失败导致请求中断。
3. 当前实现的正确性与OAuth完整性
你的实现方向正确,但需要补充几个关键细节:
- 完善Location头替换逻辑:当前的字符串替换仅处理域名部分,建议用正则表达式确保全局替换,避免遗漏特殊场景:
proxyRes.headers['location'] = proxyRes.headers['location'].replace(/https:\/\/xyz\.supabase\.co/g, 'https://api.mydomain.com'); - 配置合法的重定向URI:
- 在谷歌开发者控制台中,将
https://api.mydomain.com/auth/v1/callback添加为授权重定向URI; - 在Supabase控制台的Auth设置中,将同一地址加入允许的重定向URL列表。
这一步是核心,否则谷歌会因重定向URI不匹配拒绝请求,Supabase也会校验回调地址的合法性。
- 在谷歌开发者控制台中,将
- 修正Cookie的Domain属性:Supabase设置的
sb-*会话Cookie默认绑定xyz.supabase.co,代理时需要修改Cookie的Domain为你的自定义域名根域(如mydomain.com),否则客户端无法正常保存和携带会话Cookie:if (proxyRes.headers['set-cookie']) { proxyRes.headers['set-cookie'] = proxyRes.headers['set-cookie'].map(cookie => cookie.replace(/Domain=xyz\.supabase\.co/g, 'Domain=mydomain.com') ); }
4. 无需升级Supabase Pro的替代架构
如果不想维护Express代理,还有两种免费方案可选:
- Cloudflare Workers反向代理:用Cloudflare Workers实现轻量反向代理,逻辑和Express一致:转发请求到Supabase,修改Location和Cookie头。优势是无需自己维护服务器,Cloudflare提供免费SSL和CDN支持,免费额度足够个人项目使用。
- 注意:Supabase免费计划仅支持Storage和Edge Functions绑定自定义域名,Auth和REST API不支持,因此无法通过CNAME解析实现OAuth品牌化需求。
内容的提问来源于stack exchange,提问作者ceemv22
相关产品推荐
相关产品推荐

