使用密钥生成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
相关产品推荐
相关产品推荐

