Supabase Edge Function在Flutter删除用户时返回“No user found for JWT”错误的解决求助
Supabase Edge Function在Flutter删除用户时返回“No user found for JWT”错误的解决求助
我现在在Flutter应用里用Supabase Edge Functions实现「删除账号」功能,遇到了个棘手的问题:从Flutter客户端调用Edge Function时,函数那边总是验证不了用户会话,抛出No user found for JWT!错误。我的需求很明确:用用户当前的JWT做身份验证,在Edge Function里确认身份后,用服务角色密钥删除用户账号。
下面是我的代码和问题细节:
Flutter客户端代码(基于supabase_flutter包)
用户处于登录状态时才会调用这个方法,逻辑是先调用Edge Function,再执行本地登出:
@override Future<void> deleteCurrentUser() async { try { // 调用Edge Function await _client.functions.invoke('delete-user'); // 本地登出 await logout(); } on FunctionException catch (e) { throw Exception('Function failed: $e (Status: ${e.status})'); } catch (e) { throw Exception('Error deleting account: $e'); } }
Edge Function代码(TypeScript)
我尝试用客户端传来的Authorization头初始化Supabase客户端,同时使用服务角色密钥创建实例:
import { serve } from 'https://deno.land/std@0.182.0/http/server.ts'; import { createClient } from 'https://esm.sh/@supabase/supabase-js@2.14.0'; import { corsHeaders } from '../_shared/cors.ts'; serve(async (request) => { if (request.method === 'OPTIONS') { return new Response('ok', { headers: corsHeaders }) } try { // 用服务角色密钥创建Supabase客户端实例 const supabaseClient = createClient( Deno.env.get('SUPABASE_URL') ?? '', Deno.env.get('SUPABASE_SERVICE_ROLE_KEY') ?? '', { global: { headers: { Authorization: request.headers.get('Authorization')! } } } ); // 尝试从JWT获取用户信息 const { data: { user }, } = await supabaseClient.auth.getUser() // 这里总是失败,user始终为null if (!user) throw new Error('No user found for JWT!'); // 用服务角色客户端执行删除用户操作 const supabaseAdmin = createClient( Deno.env.get('SUPABASE_URL') ?? '', Deno.env.get('SUPABASE_SERVICE_ROLE_KEY') ?? '' ) const { data: deletion_data, error: deletion_error } = await supabaseAdmin.auth.admin.deleteUser(user.id) return new Response('User deleted: ' + JSON.stringify(deletion_data, null, 2), { headers: { ...corsHeaders, 'Content-Type': 'application/json' }, status: 200, }); } catch (error) { return new Response(JSON.stringify({ error: error.message }), { headers: { ...corsHeaders, 'Content-Type': 'application/json' }, status: 400, }) } });
问题核心
我本来以为用服务角色密钥创建的客户端,带上用户的Authorization头,就能通过auth.getUser()拿到当前用户,但实际每次都返回null,抛出错误。我确认过调用函数时用户处于登录状态,难道客户端没有自动带上Authorization头?还是我在Edge Function里的客户端初始化方式有问题?
有没有大佬能帮我排查下问题?应该怎么正确在Edge Function里验证用户的JWT,再用服务角色删除用户?




