自托管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} - 如果权限缺失,需更新Supabase
roles表中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
相关产品推荐
相关产品推荐

