You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

寻求PostgreSQL中pgjwt的替代方案——适配Supabase与AWS/Azure托管数据库

替代pgjwt的可行方案

针对AWS RDS、Azure PostgreSQL等不支持pgjwt扩展的场景,你可以用以下几种方案替代:

1. 用PostgreSQL原生函数手动实现JWT生成与验证

JWT的核心逻辑是Base64URL编码的Header+Claims,加上HMAC签名,完全可以用PostgreSQL内置的encode()、decode()、hmac()函数实现,不需要任何扩展。

示例实现代码:

-- 生成符合JWT标准的Token
CREATE OR REPLACE FUNCTION generate_jwt(claims json, secret text) RETURNS text AS $$
DECLARE
  header json := '{"alg":"HS256","typ":"JWT"}';
  -- 处理Base64URL编码(替换+为-,/为_)
  encoded_header text := replace(replace(encode(header::bytea, 'base64'), '+', '-'), '/', '_');
  encoded_claims text := replace(replace(encode(claims::bytea, 'base64'), '+', '-'), '/', '_');
  -- 生成HMAC-SHA256签名
  signature text := replace(replace(encode(hmac(encoded_header || '.' || encoded_claims, secret, 'sha256'), 'base64'), '+', '-'), '/', '_');
BEGIN
  RETURN encoded_header || '.' || encoded_claims || '.' || signature;
END;
$$ LANGUAGE plpgsql;

-- 验证JWT并返回解析后的Claims
CREATE OR REPLACE FUNCTION verify_jwt(token text, secret text) RETURNS json AS $$
DECLARE
  parts text[] := string_to_array(token, '.');
  header json;
  claims json;
  expected_signature text;
BEGIN
  IF array_length(parts, 1) != 3 THEN
    RAISE EXCEPTION 'Invalid JWT format';
  END IF;

  -- 解码Base64URL格式的Header和Claims
  header := decode(replace(replace(parts[1], '-', '+'), '_', '/'), 'base64')::json;
  claims := decode(replace(replace(parts[2], '-', '+'), '_', '/'), 'base64')::json;
  -- 生成预期签名并对比
  expected_signature := replace(replace(encode(hmac(parts[1] || '.' || parts[2], secret, 'sha256'), 'base64'), '+', '-'), '/', '_');

  IF parts[3] != expected_signature THEN
    RAISE EXCEPTION 'Invalid JWT signature';
  END IF;

  RETURN claims;
END;
$$ LANGUAGE plpgsql;

这个方案完全兼容所有云托管PostgreSQL服务,而且可以保持和pgjwt一致的接口逻辑,直接替换即可适配Supabase的认证流程。

2. 借助pgcrypto扩展简化实现

多数云托管PostgreSQL(包括AWS RDS、Azure)都支持pgcrypto扩展,它提供了更高效的加密函数,可以简化JWT的签名逻辑:

首先启用扩展:

CREATE EXTENSION IF NOT EXISTS pgcrypto;

基于pgcrypto的JWT实现逻辑和第一种方案一致,但可以用digest()函数优化签名生成,性能会更好一些。

3. 将JWT处理移至应用层

如果不想在数据库层处理JWT,可以修改Supabase的认证逻辑,在应用服务器端完成JWT的生成与验证:

  • 用编程语言的JWT库(比如Node.js的jsonwebtoken、Python的PyJWT)生成Token
  • 验证Token后,将用户的身份信息(比如用户ID、权限)传递给数据库,在数据库中仅做权限校验,不处理JWT签名

这个方案适合对数据库操作有严格限制的场景,也能降低数据库的负载。

内容的提问来源于stack exchange,提问作者Yash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 20:24:23