Auth error: {401: invalid claim: missing sub}
当在会话中使用无效的 JWT 调用 supabase.auth.getUser(),或者用户尝试注册/登录但在调用 getUser 时尚未完成登录时,会返回缺少子声明的错误。
🌐 The missing sub claim error is returned when supabase.auth.getUser() is called with an invalid JWT in the session or when the user attempts to register/sign in but hasn't completed the sign in when the getUser call is made.
一个常见的陷阱是,无意中使用 Supabase API 密钥(比如可发布的密钥或秘密密钥)而不是 Supabase Auth 访问令牌。
🌐 A common pitfall, is inadvertently using a Supabase API key (such as the publishable or secret keys) instead of the Supabase Auth access token.
这是为什么会发生?
- Supabase 的 API 密钥是为不同用途设计的,虽然它们能被 Supabase Auth 系统识别,但它们不包含 sub 声明。sub 声明很重要,因为它会编码用户 ID,而用户 ID 是认证流程的必填字段。这个错误会导致“缺少 sub 声明”的提示,因为系统期望的是包含用户身份信息的令牌。
如何避免这个问题:
- 确保传给
supabase.auth.getUser()的令牌确实是 Auth 访问令牌,而不是其中的某个 API 密钥。 - 你是在每次请求时创建客户端,还是创建一个全局客户端以供共享?如果你是在每次请求时创建客户端,那么你需要 somehow 把客户端的用户 JWT 会话传到服务器。这可以通过在 header 里发送用户的 JWT 来实现,比如一个
Authorization: Bearer <user_jwt>。然后你可以获取这个 header,并用用户的 JWT 调用supabase.auth.getUser(user_jwt)。 - 看看 Supabase 客户端是怎么初始化的,特别是在服务器端的情况下。