You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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:
    1. 在谷歌开发者控制台中,将https://api.mydomain.com/auth/v1/callback添加为授权重定向URI;
    2. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 21:07:29