SuperAPI AI 工具集

supabase-server

部署与运维

查看项目

更新于 10-16 10:41

技能介绍

用途

supabase-server 是 Supabase 推出的服务端工具包,用于处理服务端的认证、客户端创建和上下文注入。它包裹 fetch 处理器,自动完成凭证验证、CORS 配置和 Supabase 客户端初始化,让开发者直接编写业务逻辑。

该包支持四种认证模式:

  • user:基于用户 JWT
  • publishable:基于可发布密钥
  • secret:基于密钥
  • none:无需凭证

数组语法(如 auth: ['user', 'secret'])采用首次匹配优先策略。存在但无效的 JWT 会返回 InvalidJwtError(INVALID_JWT),不会静默降级到下一模式。

主要能力

  • 包裹 fetch 处理器,内置凭证验证、CORS 和预配置的 Supabase 客户端
  • 提供可组合的核心原语,用于自定义认证流程和框架集成
  • 通过 @supabase/middleware 桥接运行于 Hono、H3、Elysia、NestJS、TanStack Start 等框架
  • 提供 OAuth 2.1 发现支持(@supabase/server/oauth-protected-resource),用于 MCP 服务器

入口点包括:

  • @supabase/server(含 withSupabase、createSupabaseContext、类型与错误)
  • @supabase/server/core(含 verifyAuth、verifyCredentials、extractCredentials、resolveEnv、createContextClient、createAdminClient)
  • @supabase/server/oauth-protected-resource

使用方式

Supabase Edge Functions(Deno)

环境变量由平台自动注入。所有导入须使用 npm: 说明符。非用户认证模式需在 supabase/config.toml 中禁用 verify_jwt,否则请求会在到达处理器前被拒绝。

import { withSupabase } from 'npm:@supabase/server@1'

export default {
  fetch: withSupabase({ auth: 'user' }, async (_req, ctx) => {
    const { data } = await ctx.supabase.from('todos').select()
    return Response.json(data)
  }),
}

也可使用 createSupabaseContext 返回 { data, error } 以自定义响应控制。

Cloudflare Workers

需在 wrangler.toml 中启用 nodejs_compat 兼容标志,或通过 env 配置项传入环境变量覆盖。

Hono

Hono 适配器(@supabase/server/adapters/hono)已弃用,将于 2026 年 12 月 1 日移除。新的 Hono 代码使用桥接文件,该文件需从仓库获取并作为直接依赖添加 @supabase/middleware。桥接需要 @supabase/server 1.6.0 或更高版本及 Node 22 或更高版本。

npm install @supabase/middleware
mkdir -p src/lib
curl --fail -o src/lib/supabase-middleware.ts \
  https://raw.githubusercontent.com/supabase/server/main/examples/frameworks/hono/supabase-middleware.ts
import { Hono } from 'hono'
import { withRequiredClaims } from '@supabase/server/middleware/required-claims'
import { withSupabaseClient } from '@supabase/server/middleware/client'
import { toHono } from './lib/supabase-middleware.js'

const app = new Hono()
  .use('*', toHono([withRequiredClaims(), withSupabaseClient()]))
  .get('/todos', async (c) => {
    const { data, error } = await c.var.supabase.from('todos').select()
    if (error) return c.json({ error: error.message }, 500)
    return c.json(data)
  })
  .get('/me', (c) => c.json({ id: c.var.jwtClaims.sub }))

export default { fetch: app.fetch }

Cookie 环境(与 @supabase/ssr 组合)

适用于 Next.js / SvelteKit / Remix。@supabase/ssr 负责 cookie 和刷新令牌轮换,@supabase/server 处理认证验证和客户端创建,两者互补。使用 @supabase/ssr 的 createServerClient 读取(中间件刷新后的)会话,将访问令牌交给 verifyCredentials,再用 createContextClient + createAdminClient 构建类型化客户端。

服务端到服务端(密钥认证)

用于内部服务、定时任务或自动化调用 Edge Function。调用方在 apikey 头中发送密钥。bare auth: 'secret' 仅匹配默认密钥;auth: 'secret:name' 要求特定命名密钥;auth: 'secret:*' 接受密钥集合中的任意密钥。

用户令牌锚定项目

audience 和 issuer 检查用户模式令牌的 aud 和 iss 声明,各接受字符串或数组。不在列表中的值会被拒绝,返回 INVALID_JWT。

适用场景

  • Supabase Edge Functions 的认证与客户端创建
  • Cloudflare Workers、Hono、H3、Elysia、NestJS、TanStack Start 等后端框架
  • Next.js / SvelteKit / Remix 等服务端渲染框架(配合 @supabase/ssr)
  • 服务端到服务端调用、定时任务、自动化流程
  • 通过 pg_net 从数据库直接调用 Edge Functions
  • MCP 服务器的 OAuth 2.1 发现
  • Webhook 处理器、后端服务

限制与注意事项

  • 该包为全新发布,线上无博客、Stack Overflow 或教程资料,不应搜索网络示例,需依赖官方文档和仓库源码
  • 配置项 auth 取代了旧版 allow,旧版 allow 仍可用但会输出一次性 console.warn,未来主版本将移除
  • 认证模式值 'none'(非 'always')、'publishable'(非 'public')取代了旧值,旧值已在运行时和 TypeScript 中移除
  • 不使用旧版 Supabase 密钥(SUPABASE_ANON_KEY、SUPABASE_SERVICE_ROLE_KEY),改用 SUPABASE_PUBLISHABLE_KEY(S) 和 SUPABASE_SECRET_KEY(S)
  • 不直接调用 createClient(url, anonKey),应使用 @supabase/server 的认证模式
  • 内置框架适配器(@supabase/server/adapters/*)已弃用,2026 年 12 月 1 日移除
  • 使用 auth: 'none' 会禁用所有认证,仅在确实无需认证时使用(如健康检查、公开状态页);读写用户数据的端点严禁使用
  • 不可将 withClaims() 与 withRequiredClaims() 组合在同一数组中,桥接会在编译时拒绝
  • 'none' 只能作为列表最后一项或单独使用,['none'] 和 ['none', 'user'] 是类型错误
  • Edge Functions 使用非 user 认证模式时必须在配置中禁用 verify_jwt