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

Supabase返回JWSError JWSInvalidSignature错误的排查求助

问题:Supabase查询users表时出现JWSInvalidSignature错误,auth.getUser()却正常

我用自定义Node GraphQL后端+Vue3前端,两者都集成了Supabase。前端把Bearer Token传给后端,后端验证Token后和本地Supabase实例交互。现在实现currentUser查询时遇到异常:

代码实现

import { userError } from '@/helpers/errors';
import supabase from '@/lib/supabase';
import { CurrentUserPayload } from '@/generated/types';
import { Context } from '@/context';

const me = async (_parent: any, _params: any, context: Context): Promise<MePayload> => {
  try {
    const { data: sessionUser, error: sessionError } = await supabase.auth.getUser(context.token.replace('Bearer ', ''));
    console.log({ sessionUser });
    console.log({ sessionError });

    if (!sessionUser.user || sessionError) {
      return {
        ...userError({ message: 'Must be logged in', path: 'me resolver' }),
      };
    }

    const userId = sessionUser.user?.id;
    const { data: user, error: error } = await supabase
      .from('users')
      .select('*, notifications(*)')
      .eq('id', userId)
      .single();

    console.log({ user });
    console.log({ error });

    if (!user || error) {
      return {
        ...userError({ message: 'Unable to fetch currentUser', path: 'me resolver' }),
      };
    }

    return {
      user,
      errors: null,
    };
  } catch (err) {
    return {
      ...userError({ message: 'Error running me resolver', path: 'me resolver' }),
      notifications: [],
      onboardingSteps: [],
    };
  }
};

export default me;

错误信息

auth.getUser()执行正常,能返回正确数据且无错误,但查询users表时返回null用户及以下错误:

{
  error: {
    code: 'PGRST301',
    details: null,
    hint: null,
    message: 'JWSError JWSInvalidSignature'
  }
}

我已经确认JWT密钥和Supabase公钥正确(否则auth.getUser()无法通过),想请教可能的原因?


解决思路

  • Supabase客户端未携带有效Token到数据库请求
    auth.getUser()仅验证Token的有效性,但查询PostgREST接口时,你的Supabase客户端并没有自动带上前端传来的这个Token,而是用了初始化时的默认配置,导致PostgREST验证签名失败。
    解决方法:在查询数据库前,将前端传来的Token设置到Supabase客户端:

    // 方法1:全局设置auth
    await supabase.auth.setAuth(context.token.replace('Bearer ', ''));
    
    // 方法2:单请求设置headers
    const { data: user, error: error } = await supabase
      .from('users')
      .select('*, notifications(*)')
      .eq('id', userId)
      .single()
      .headers({
        Authorization: context.token
      });
    
  • JWT字段或签名算法不符合PostgREST要求
    虽然auth.getUser()通过了验证,但PostgREST对JWT的字段要求更严格:

    • 检查Token的aud字段是否为你的Supabase项目URL(如https://<项目ID>.supabase.co)
    • 检查iss字段是否为https://<项目ID>.supabase.co/auth/v1
    • 确认签名算法为HS256(Supabase默认),且JWT密钥与项目后台配置完全一致
  • 后端Supabase客户端初始化配置错误
    若后端Supabase客户端初始化时,未正确配置anon密钥或service_role密钥,或者JWT_SECRET不匹配,会导致数据库请求签名验证失败。检查初始化代码,确保密钥和项目后台的配置完全一致。

内容的提问来源于stack exchange,提问作者J. Jackson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 07:06:04