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密钥与项目后台配置完全一致
- 检查Token的
后端Supabase客户端初始化配置错误
若后端Supabase客户端初始化时,未正确配置anon密钥或service_role密钥,或者JWT_SECRET不匹配,会导致数据库请求签名验证失败。检查初始化代码,确保密钥和项目后台的配置完全一致。
内容的提问来源于stack exchange,提问作者J. Jackson
相关产品推荐
相关产品推荐

