Supabase Python客户端JWT认证搭配RLS失效问题求助
解决Supabase RLS更新失败:正确传递JWT到Python客户端
你的问题核心是Supabase客户端执行数据库请求时未携带用户JWT,导致RLS规则中的auth.uid()无法获取到当前用户ID,最终auth.uid() = user_id校验不通过,更新被拦截。以下是两种可行的解决方案:
方法1:全局绑定JWT到客户端
如果当前客户端仅处理单个用户的请求,可以在初始化客户端时直接绑定JWT,后续所有请求都会自动携带该身份信息:
from supabase import create_client, Client # 替换为你的项目信息 SUPABASE_URL = "你的Supabase项目URL" SUPABASE_ANON_KEY = "你的Supabase anon key" user_jwt = "前端传入的用户JWT" # 初始化客户端,关闭自动刷新和会话持久化(后端场景不需要) supabase: Client = create_client( SUPABASE_URL, SUPABASE_ANON_KEY, options={"auth": {"auto_refresh_token": False, "persist_session": False}} ) # 将JWT绑定到客户端会话 supabase.auth.set_session(user_jwt, "") # refresh token留空即可
之后执行你的update代码,无需额外配置,RLS规则会正确识别auth.uid():
user = supabase.auth.get_user(user_jwt) user_id = user.dict()["user"]["id"] response = ( supabase .table("users") .update({"credits": 10}) .eq("user_id", user_id) .execute() )
方法2:单个请求携带JWT
如果客户端需要处理多用户请求,或者不想全局绑定身份,可以在每次数据库请求中通过headers参数手动传递JWT:
user = supabase.auth.get_user(user_jwt) user_id = user.dict()["user"]["id"] response = ( supabase .table("users") .update({"credits": 10}) .eq("user_id", user_id) # 手动添加Authorization头 .execute(headers={"Authorization": f"Bearer {user_jwt}"}) )
关键说明
你之前调用supabase.auth.get_user(jwt)仅用于解析用户ID,不会自动将JWT绑定到后续的数据库请求。Supabase的RLS规则依赖请求头中的JWT来识别用户,必须显式传递才能让auth.uid()返回正确的用户ID,匹配你的更新规则。
内容的提问来源于stack exchange,提问作者shredEngineer
相关产品推荐
相关产品推荐

