# 准备工作
华为云RDS Supabase提供数据库、用户认证、文件存储、实时订阅四项开箱即用的能力，可作为系统或应用的后端底座直接接入，无需自建后端服务。使用前需先完成对接准备，方便客户快速、高效、安全地通过API或SDK调用平台服务化能力。
 #### 步骤一：获取访问地址
RDS Supabase应用服务端口固定为**8443**，所有SDK与REST API请求均经此端口访问。依据客户端所处网络环境，访问途径分以下三类，地址有所不同。
表1访问方式与访问地址 
| 访问方式             | 适用场景             | 访问地址                       |
|:---|:---|:---|
| 内网访问           | 客户端与应用同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网关地址](https://support.huaweicloud.com/usermanual-rds-pg/rds_supabase_15.html)。
  
  - 不支持邮箱认证与GitHub认证场景，详见[用户认证Auth配置管理](https://support.huaweicloud.com/usermanual-rds-pg/rds_supabase_20.html)。
   
- 公网访问（EIP方式） 为应用直接绑定一个弹性公网EIP，客户端经该EIP加8443端口访问，适用于需独立公网入口、无需端口映射的场景。
  - 需先为应用绑定弹性公网EIP。
  
  - 绑定与解绑操作，详见[绑定和解绑弹性公网IP](https://support.huaweicloud.com/usermanual-rds-pg/rds_supabase_19.html)。
  
  - 公网邮箱认证与GitHub认证场景，必须使用此方式，详见[用户认证Auth配置管理](https://support.huaweicloud.com/usermanual-rds-pg/rds_supabase_20.html)。
   
- 安全组配置 无论哪种公网访问方式，都须确保应用所属安全组在**入方向放通8443端口的TCP规则**，否则公网请求被拦截。
  - 每个应用仅支持配置一个安全组，请合理规划规则。
  
  - 安全组创建与规则管理，详见[管理应用安全组](https://support.huaweicloud.com/usermanual-rds-pg/rds_supabase_16.html)。
   
- SSL与HTTPS SSL为可选项，默认不启用。如需以HTTPS（https://）访问：
  - SSL证书由华为云CCM服务提供，需单独购买。
  
  - 在应用详情页「网络信息」开启SSL并选择证书后，地址前缀由http://切换为https://。
  
  - SSL开启与关闭操作，详见[开启或关闭SSL](https://support.huaweicloud.com/usermanual-rds-pg/rds_supabase_11.html)。
   
![](https://support.huaweicloud.com/usermanual-rds-pg/public_sys-resources/notice_3.0-zh-cn.png)
若弹性公网EIP已用于邮箱认证、GitHub认证回调或邮件模板引用等用户认证场景，请勿直接解绑该EIP；需先在用户认证配置中关闭相关功能、确认地址不再被引用后再解绑，否则将导致认证回调地址失效、业务中断，详见[用户认证Auth配置管理](https://support.huaweicloud.com/usermanual-rds-pg/rds_supabase_20.html)。
 #### 步骤二：获取API Key
参考[查看API Key](https://support.huaweicloud.com/usermanual-rds-pg/rds_supabase_13.html)，获取API Key密钥。华为云RDS Supabase提供四种API Key，按使用场景进行选取。
表2API 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指绕过该行级控制、拥有完整数据权限。更多详细信息，请参见[后续操作]。
![](https://support.huaweicloud.com/usermanual-rds-pg/public_sys-resources/notice_3.0-zh-cn.png)
**安全提示：** Secret Key与Service Role Key拥有绕过RLS的高权限，仅限服务端使用，严禁写入前端代码或暴露到浏览器。Key与数据库角色的对应关系见[后续操作]。
#### 步骤三：功能对接
- [SDK调用方式]
  以JavaScript前端语言为例，SDK方式通过@supabase/supabase-js封装调用，鉴权与请求细节由SDK自动处理，适合大多数场景。其他语言可参考[Supabase开源文档](https://supabase.com/docs)。
  **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调用方式]
  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）](https://support.huaweicloud.com/usermanual-rds-pg/rds_supabase_23.html)。
- **RLS行级安全**
  RLS由两层防护构成，缺一不可。
  表3RLS两层防护机制 
  | 层级   | 机制     | 作用                                        | 类比       |
  |:---|:---|:---|:---|
  | 第一层 | GRANT权限 | 表级门控，决定角色能否SELECT、INSERT、UPDATE或DELETE。 | 房间门禁      |
  | 第二层   | RLS策略   | 行级过滤，决定哪些行可被哪些角色看到。                       | 门禁内可打开的抽屉 |
     
  - 仅启用RLS而不GRANT：角色无权访问表，RLS策略形同虚设。
  
  - 仅GRANT而不设RLS策略：所有行对授权角色可见，等于没有行级保护。
   

- **Key与角色映射**
  API Key本身不直接读写数据，实际操作由其映射的数据库角色执行。角色由Key类型与登录状态共同决定，下表列出对应关系。
  表4Key与角色映射 
  | Key + 认证状态                    | 映射角色           | 说明                     |
  |:---|:---|:---|
  | Publishable Key + 未登录        | anon           | 匿名访问，仅可操作RLS策略允许的行。   |
  | Publishable Key + 已登录            | authenticated | 已认证访问，受RLS策略约束。         |
  | Secret Key / Service Role Key | BYPASSRLS      | 绕过所有行级安全策略，拥有完整数据访问权限。 |
     
  
 
#### 参考文档
以下为Supabase开源相关文档，仅供参考。
- [Supabase JavaScript SDK](https://supabase.com/docs/reference/javascript/introduction)
- [Supabase Row Level Security](https://supabase.com/docs/guides/database/postgres/row-level-security)
- [Supabase Auth](https://supabase.com/docs/guides/auth)
 
