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

自托管Supabase实时连接Kong返回403错误,Python客户端求助

自托管Supabase实时连接返回403错误(Python客户端)

问题描述

我正在开发一个简单的Python应用,想用anon_key连接自托管的Supabase实例,读取指定表的变更数据。代码如下:

# after importing necessary packages

SUPABASE_URL = "url"
SUPABASE_ANON_KEY = "key"


async def supafunc():
    supaclient = await create_client(SUPABASE_URL, SUPABASE_ANON_KEY)

    await supaclient.realtime.connect()
    await (supaclient.realtime
            .channel("my_channel")
            .on_postgres_changes("*", schema="public", table="configs", callback=my_callback)
            .subscribe())
    await supaclient.realtime.listen()

def my_callback(payload):
    print(payload)

asyncio.run(supafunc())

调用connect()时连接失败,服务器端Kong日志显示:

172.18.0.13 - - [22/Jan/2025:13:09:24 +0000] "GET /realtime/v1/websocket?apikey=myapikeyhere HTTP/1.0" 403 0 "-" "Python/3.11 websockets/13.1"

已经尝试过重建表、启用/禁用RLS、调整表的实时策略,问题依旧,求解决办法。


解决步骤

1. 检查自托管Supabase的Realtime核心配置

  • 确认docker-compose.yml中realtime服务已启用,且环境变量匹配:
    • 确保REALTIME_JWT_SECRET与Supabase全局的JWT_SECRET完全一致
    • 检查REALTIME_ENABLED是否设置为true
  • 登录Supabase Dashboard的Realtime面板,确认public.configs表已开启实时监听,且勾选了需要监听的事件类型(INSERT/UPDATE/DELETE)

2. 验证Anon Key的权限

  • 用JWT解码工具查看你的anon_key payload,确认包含realtime:connect权限,payload中应有类似字段:
    "realtime": {"connect": true}
    
  • 如果权限缺失,需更新Supabaseroles表中anon角色的权限,或生成包含Realtime连接权限的新anon_key

3. 修正Python客户端的连接逻辑

  • 调整代码执行顺序,先创建并订阅频道,再启动连接监听:
    async def supafunc():
        supaclient = await create_client(SUPABASE_URL, SUPABASE_ANON_KEY)
        
        # 先构建频道并绑定回调
        channel = supaclient.realtime.channel("my_channel")
        channel.on_postgres_changes(
            event="*",
            schema="public",
            table="configs",
            callback=my_callback
        )
        await channel.subscribe()
        
        # 启动实时监听
        await supaclient.realtime.listen()
    
  • 升级到最新版supabase-py库,旧版本可能存在自托管环境兼容性问题:
    pip install --upgrade supabase
    

4. 检查Kong的路由与权限规则

  • 确认Kong中/realtime/v1/websocket路由配置正确,允许携带anon_key的请求访问
  • 排查Kong的访问控制插件,是否有规则拦截了WebSocket请求

5. 确认Realtime相关的数据库配置

  • 即使禁用RLS,也需要确保表开启了复制功能:
    ALTER TABLE public.configs ENABLE REPLICATION;
    CREATE PUBLICATION supabase_realtime FOR TABLE public.configs;
    
  • 如果启用RLS,需为anon角色添加表访问权限:
    CREATE POLICY "Allow anon to access configs" ON public.configs
    FOR ALL USING (true);
    

内容的提问来源于stack exchange,提问作者Yafet Getachew

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 20:12:14