准备工作
华为云RDS Supabase提供数据库、用户认证、文件存储、实时订阅四项开箱即用的能力,可作为系统或应用的后端底座直接接入,无需自建后端服务。使用前需先完成对接准备,方便客户快速、高效、安全地通过API或SDK调用平台服务化能力。
步骤一:获取访问地址
RDS Supabase应用服务端口固定为8443,所有SDK与REST API请求均经此端口访问。依据客户端所处网络环境,访问途径分以下三类,地址有所不同。
| 访问方式 | 适用场景 | 访问地址 |
|---|---|---|
| 内网访问 | 客户端与应用同VPC、同子网且网络互通 | http(s)://{应用内网IP}:8443 |
| 公网访问(DNAT网关方式) | 多实例共享公网IP、需端口映射 | http(s)://{DNAT公网IP}:{公网端口号} |
| 公网访问(EIP方式) | 为应用绑定独立公网IP | http(s)://{弹性公网EIP}:8443 |
- 内网访问
直接使用应用内网IP,适合与Supabase应用同VPC、同子网且网络互通的客户端。
- 应用创建时自动分配IPv4内网地址,创建后不可修改。
- 客户端需与应用内网地址网络可达,建议同VPC同子网。
- 公网访问(DNAT网关方式)
通过公网NAT网关与DNAT规则,将公网IP指定端口映射至应用内网8443端口,适用于多实例共享同一公网IP、需端口映射的场景。
- 需先购买公网NAT网关与弹性公网IP,绑定至应用所在VPC与子网,并在DNAT规则中关联应用内网地址。
- 对外公网端口号由DNAT规则决定,可与8443不同。
- NAT网关与弹性公网IP单独计费。
- 绑定与解绑操作,详见绑定和解绑DNAT网关地址。
- 不支持邮箱认证与GitHub认证场景,详见用户认证Auth配置管理。
- 公网访问(EIP方式)
为应用直接绑定一个弹性公网EIP,客户端经该EIP加8443端口访问,适用于需独立公网入口、无需端口映射的场景。
- 需先为应用绑定弹性公网EIP。
- 绑定与解绑操作,详见绑定和解绑弹性公网IP。
- 公网邮箱认证与GitHub认证场景,必须使用此方式,详见用户认证Auth配置管理。
- 安全组配置
无论哪种公网访问方式,都须确保应用所属安全组在入方向放通8443端口的TCP规则,否则公网请求被拦截。
- 每个应用仅支持配置一个安全组,请合理规划规则。
- 安全组创建与规则管理,详见管理应用安全组。
- SSL与HTTPS
SSL为可选项,默认不启用。如需以HTTPS(https://)访问:
- SSL证书由华为云CCM服务提供,需单独购买。
- 在应用详情页「网络信息」开启SSL并选择证书后,地址前缀由http://切换为https://。
- SSL开启与关闭操作,详见开启或关闭SSL。
若弹性公网EIP已用于邮箱认证、GitHub认证回调或邮件模板引用等用户认证场景,请勿直接解绑该EIP;需先在用户认证配置中关闭相关功能、确认地址不再被引用后再解绑,否则将导致认证回调地址失效、业务中断,详见用户认证Auth配置管理。
步骤二:获取API Key
参考查看API Key,获取API Key密钥。华为云RDS Supabase提供四种API Key,按使用场景进行选取。
| Key类型 | 前缀 | 权限 | 使用场景 | 浏览器安全 |
|---|---|---|---|---|
| Publishable Key | sb_publishable_xxx | 低权限(受RLS约束) | 客户端JS SDK、REST API | ✅ 可安全出现在下发到客户端的源码中(受RLS约束,泄露也无法越权) |
| Secret Key | sb_secret_xxx | 高权限(BYPASSRLS) | 服务端JS SDK(Node.js) | ❌ 浏览器使用返回401,仅限服务端 |
| Anon Key | JWT格式 | 低权限 | Publishable Key的旧版形式 | ✅ |
| Service Role Key | JWT格式 | 高权限(BYPASSRLS) | Secret Key的旧版形式 | ❌ 仅限服务端 |
对接只需两把:客户端(浏览器、移动端)用Publishable Key,服务端(Node.js)用Secret Key。Anon Key与Service Role Key为旧版形式,功能分别与Publishable Key、Secret Key等价,旧项目可继续使用。
RLS(行级安全)指数据库逐行控制访问的机制,决定一把Key最终能读写哪些行;BYPASSRLS指绕过该行级控制、拥有完整数据权限。更多详细信息,请参见后续操作。
安全提示:Secret Key与Service Role Key拥有绕过RLS的高权限,仅限服务端使用,严禁写入前端代码或暴露到浏览器。Key与数据库角色的对应关系见后续操作。
步骤三:功能对接
以JavaScript前端语言为例,SDK方式通过@supabase/supabase-js封装调用,鉴权与请求细节由SDK自动处理,适合大多数场景。其他语言可参考Supabase开源文档。
SDK初始化
安装SDK依赖包:
npm install @supabase/supabase-js
创建Supabase客户端对象:
// {Supabase应用访问地址}与{Supabase应用API Key}为占位符,分别从步骤一:获取访问地址和步骤二:获取API Key获取并替换为实际值。
import { createClient } from '@supabase/supabase-js'
const supabaseUrl = "{Supabase应用访问地址}"
const supabaseApiKey = "{Supabase应用API Key}"
export const supabase = createClient(supabaseUrl, supabaseApiKey) SDK调用
以下示例均对商品products表读写,该表需先在数据库章节建好并配置GRANT权限与RLS策略,否则查询返回空、写入被拒绝。
客户端JS SDK(浏览器)
适用于浏览器、移动端等运行在用户设备上的客户端。代码随应用下发、密钥可被提取,故API Key填浏览器安全的Publishable Key(sb_publishable_xxx);其受RLS约束,仅可操作策略放行的行,即便泄露也无法越权。查询等操作通过初始化的supabase实例发起:
const { data } = await supabase.from('products').select('*') 该实例初始化一次、全局复用,Publishable Key可安全写入客户端源码。浏览器侧跨域访问受CORS约束,若前端域名与Supabase访问地址不同源会被拦截,请确认实例已放行前端域名。
服务端JS SDK(Node.js)
适用于服务器、云函数、Serverless等受信后端,密钥不出服务器、不向用户暴露。此类场景常需数据迁移、批量处理等高权限操作,故API Key填仅限服务端的Secret Key(sb_secret_xxx),其带BYPASSRLS、拥有完整数据访问权限,严禁下发到客户端。查询等操作通过初始化的supabase实例发起:
const { data } = await supabase.from('products').select('*') 旧版Service Role Key(JWT格式)功能与Secret Key等价,用法相同。实例同样初始化一次后复用,适用于后台任务、定时同步等不受行级约束的写操作,切勿用于响应终端用户的接口。
API方式以HTTP直接调用Data API,不引入SDK,适合不方便引入依赖的环境。两种方式访问同一套Data API,能力等价。
REST API(fetch)
适用于不引入SDK、直接以HTTP调用Data API的场景。此时SDK自动附加Key的行为需手动完成——请求头携带apikey和Authorization:
const res = await fetch('{Supabase应用访问地址}/rest/v1/products', {
headers: {
apikey: 'sb_publishable_xxxx_xx',
Authorization: 'Bearer sb_publishable_xxxx_xx'
}
})
const data = await res.json() 注意:apikey和Authorization必须同时提供,缺一不可。URL按{Supabase应用访问地址}/rest/v1/{表名}拼接,返回JSON,接口参数遵循PostgREST约定。响应状态码非2xx通常意味着Key无效或RLS未放行,建议检查res.ok并据状态码排查。
后续操作
完成对接后,客户端对数据的访问受行级安全(Row Level Security,RLS)约束。RLS决定一把Key、一个登录状态最终能读写哪些行,是数据隔离的核心机制。本小节帮助理解API Key与访问结果的对应关系。关于RLS策略配置见数据库API(Database Data API)。
- RLS行级安全
RLS由两层防护构成,缺一不可。
表3 RLS两层防护机制 层级
机制
作用
类比
第一层
GRANT权限
表级门控,决定角色能否SELECT、INSERT、UPDATE或DELETE。
房间门禁
第二层
RLS策略
行级过滤,决定哪些行可被哪些角色看到。
门禁内可打开的抽屉
- 仅启用RLS而不GRANT:角色无权访问表,RLS策略形同虚设。
- 仅GRANT而不设RLS策略:所有行对授权角色可见,等于没有行级保护。
- Key与角色映射
API Key本身不直接读写数据,实际操作由其映射的数据库角色执行。角色由Key类型与登录状态共同决定,下表列出对应关系。
表4 Key与角色映射 Key + 认证状态
映射角色
说明
Publishable Key + 未登录
anon
匿名访问,仅可操作RLS策略允许的行。
Publishable Key + 已登录
authenticated
已认证访问,受RLS策略约束。
Secret Key / Service Role Key
BYPASSRLS
绕过所有行级安全策略,拥有完整数据访问权限。