mirror of
https://github.com/Dokploy/dokploy
synced 2025-06-26 18:27:59 +00:00
fix: supabase generate annon and service jwt by servicekey
This commit is contained in:
@@ -1,3 +1,4 @@
|
|||||||
|
import { createHmac, randomBytes } from "node:crypto";
|
||||||
import {
|
import {
|
||||||
type Schema,
|
type Schema,
|
||||||
type Template,
|
type Template,
|
||||||
@@ -7,6 +8,58 @@ import {
|
|||||||
generateRandomDomain,
|
generateRandomDomain,
|
||||||
} from "../utils";
|
} from "../utils";
|
||||||
|
|
||||||
|
interface JWTPayload {
|
||||||
|
role: "anon" | "service_role";
|
||||||
|
iss: string;
|
||||||
|
iat: number;
|
||||||
|
exp: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
function base64UrlEncode(str: string): string {
|
||||||
|
return Buffer.from(str)
|
||||||
|
.toString("base64")
|
||||||
|
.replace(/\+/g, "-")
|
||||||
|
.replace(/\//g, "_")
|
||||||
|
.replace(/=/g, "");
|
||||||
|
}
|
||||||
|
|
||||||
|
function generateJWT(payload: JWTPayload, secret: string): string {
|
||||||
|
const header = { alg: "HS256", typ: "JWT" };
|
||||||
|
|
||||||
|
const encodedHeader = base64UrlEncode(JSON.stringify(header));
|
||||||
|
const encodedPayload = base64UrlEncode(JSON.stringify(payload));
|
||||||
|
|
||||||
|
const signature = createHmac("sha256", secret)
|
||||||
|
.update(`${encodedHeader}.${encodedPayload}`)
|
||||||
|
.digest("base64url");
|
||||||
|
|
||||||
|
return `${encodedHeader}.${encodedPayload}.${signature}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function generateSupabaseAnonJWT(secret: string): string {
|
||||||
|
const now = Math.floor(Date.now() / 1000);
|
||||||
|
const payload: JWTPayload = {
|
||||||
|
role: "anon",
|
||||||
|
iss: "supabase",
|
||||||
|
iat: now,
|
||||||
|
exp: now + 100 * 365 * 24 * 60 * 60, // 100 years
|
||||||
|
};
|
||||||
|
|
||||||
|
return generateJWT(payload, secret);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function generateSupabaseServiceJWT(secret: string): string {
|
||||||
|
const now = Math.floor(Date.now() / 1000);
|
||||||
|
const payload: JWTPayload = {
|
||||||
|
role: "service_role",
|
||||||
|
iss: "supabase",
|
||||||
|
iat: now,
|
||||||
|
exp: now + 100 * 365 * 24 * 60 * 60, // 100 years
|
||||||
|
};
|
||||||
|
|
||||||
|
return generateJWT(payload, secret);
|
||||||
|
}
|
||||||
|
|
||||||
export function generate(schema: Schema): Template {
|
export function generate(schema: Schema): Template {
|
||||||
const mainServiceHash = generateHash(schema.projectName);
|
const mainServiceHash = generateHash(schema.projectName);
|
||||||
const randomDomain = generateRandomDomain(schema);
|
const randomDomain = generateRandomDomain(schema);
|
||||||
@@ -16,6 +69,9 @@ export function generate(schema: Schema): Template {
|
|||||||
const dashboardPassword = generatePassword(32);
|
const dashboardPassword = generatePassword(32);
|
||||||
const logflareApiKey = generatePassword(32);
|
const logflareApiKey = generatePassword(32);
|
||||||
|
|
||||||
|
const annonKey = generateSupabaseAnonJWT(jwtSecret);
|
||||||
|
const serviceRoleKey = generateSupabaseServiceJWT(jwtSecret);
|
||||||
|
|
||||||
const envs = [
|
const envs = [
|
||||||
`SUPABASE_HOST=${randomDomain}`,
|
`SUPABASE_HOST=${randomDomain}`,
|
||||||
`POSTGRES_PASSWORD=${postgresPassword}`,
|
`POSTGRES_PASSWORD=${postgresPassword}`,
|
||||||
|
|||||||
Reference in New Issue
Block a user