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

使用密钥生成Supabase短时效service_role JWT遇格式问题求助

解决Supabase短时效Service Role JWT生成问题

问题原因

你使用的djwt库中,HS256算法要求密钥必须是Uint8Array类型,但你直接传入了字符串格式的JWT_SECRET,导致类型不匹配报错。

修复后的代码

import { getEnvOrExplode } from "./env.ts";
import { create, getNumericDate } from "https://deno.land/x/djwt/mod.ts";

// 将字符串密钥转换为Uint8Array格式
const stringToUint8Array = (secret: string) => new TextEncoder().encode(secret);

export const generateArbitraryRoleJWT = async (
  role:
    | "service_role"
    | "billing_admin"
    | "project_admin"
    | "stripe_admin"
    | "usage_plage_admin"
    | "usage_meter_admin",
  expirySeconds = 60
) => {
  const payload = {
    iss: "supabase",
    ref: getEnvOrExplode("REFERENCE_ID"),
    role: role,
    iat: getNumericDate(0),
    exp: getNumericDate(expirySeconds),
  };

  // 转换密钥类型后传入create方法
  const jwtSecret = stringToUint8Array(getEnvOrExplode("JWT_SECRET"));

  return await create(
    {
      alg: "HS256",
      typ: "JWT",
    },
    payload,
    jwtSecret
  );
};

关键说明

  • 新增stringToUint8Array工具函数,通过TextEncoder把环境变量中的字符串密钥转换成djwt库要求的Uint8Array类型
  • 保留原有payload结构,确保完全符合Supabase的JWT规范(包含iss、ref、role、iat、exp必填字段)
  • 短时效逻辑通过expirySeconds参数控制,默认60秒,可根据需求调整

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 08:35:09