You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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,再用服务角色删除用户?

火山引擎 最新活动