From 72d0364fee63c92095c23174797ad7b13fc492d3 Mon Sep 17 00:00:00 2001 From: BennyKok Date: Fri, 15 Dec 2023 19:15:41 +0800 Subject: [PATCH] fix: update plugin api call --- web-plugin/index.js | 77 ++++++++++++++++++++++++++++++-- web/.env.example | 4 +- web/bun.lockb | Bin 329863 -> 335182 bytes web/package.json | 2 + web/src/app/api/upload/route.ts | 38 ++++++++++++++-- web/src/server/curdApiKeys.ts | 33 +++++++++----- 6 files changed, 135 insertions(+), 19 deletions(-) diff --git a/web-plugin/index.js b/web-plugin/index.js index 7d22642..967bd30 100644 --- a/web-plugin/index.js +++ b/web-plugin/index.js @@ -126,16 +126,23 @@ function addButton() { console.log(graph); console.log(prompt); + const endpoint = localStorage.getItem("endpoint"); + const apiKey = localStorage.getItem("apiKey"); + + if (!endpoint || !apiKey) { + configDialog.show(); + return; + } + deploy.textContent = "Deploying..."; deploy.style.color = "orange"; - const apiRoute = "http://localhost:3000/api/upload"; - const userId = "user_2ZA6vuKD3IJXju16oJVQGLBcWwg"; + const apiRoute = endpoint + "/api/upload" + // const userId = apiKey try { let data = await fetch(apiRoute, { method: "POST", body: JSON.stringify({ - user_id: userId, workflow_name, workflow_id, workflow: prompt.workflow, @@ -143,6 +150,7 @@ function addButton() { }), headers: { "Content-Type": "application/json", + "Authorization": "Bearer " + apiKey, }, }); @@ -181,7 +189,15 @@ function addButton() { } }; + const config = document.createElement("button"); + config.textContent = "Config"; + config.className = "configbtn"; + config.onclick = () => { + configDialog.show(); + }; + menu.append(deploy); + menu.append(config); } app.registerExtension(ext); @@ -220,4 +236,57 @@ export class InfoDialog extends ComfyDialog { } } -export const infoDialog = new InfoDialog() \ No newline at end of file +export const infoDialog = new InfoDialog() + +export class ConfigDialog extends ComfyDialog { + constructor() { + super(); + this.element.classList.add("comfy-normal-modal"); + } + + createButtons() { + return [ + $el("button", { + type: "button", + textContent: "Save", + onclick: () => this.save(), + }), + $el("button", { + type: "button", + textContent: "Close", + onclick: () => this.close(), + }), + ]; + } + + close() { + this.element.style.display = "none"; + } + + save() { + const endpoint = this.textElement.querySelector("#endpoint").value; + const apiKey = this.textElement.querySelector("#apiKey").value; + localStorage.setItem("endpoint", endpoint); + localStorage.setItem("apiKey", apiKey); + this.close(); + } + + show() { + this.textElement.innerHTML = ` +
+ + +
+ `; + this.element.style.display = "flex"; + this.element.style.zIndex = 1001; + } +} + +export const configDialog = new ConfigDialog(); \ No newline at end of file diff --git a/web/.env.example b/web/.env.example index 1127d75..a398c8f 100644 --- a/web/.env.example +++ b/web/.env.example @@ -15,4 +15,6 @@ SPACES_ENDPOINT_CDN="http://localhost:4566" SPACES_REGION="nyc3" SPACES_BUCKET="comfyui-deploy" SPACES_KEY="xyz" -SPACES_SECRET="aaa" \ No newline at end of file +SPACES_SECRET="aaa" + +JWT_SECRET="openssl rand -hex 32" \ No newline at end of file diff --git a/web/bun.lockb b/web/bun.lockb index 44a53d613cd9c2d0fb5b2a886f6a93967a969519..bd05d757bc53a1cbdf2ced6e1321e18ca0cd9d66 100755 GIT binary patch delta 66003 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

I!q9hUo~eq<&XFm@|kKdI5_X57Zm zYy;#(E+vCjx(N*Ca3glKN^<#V^fd#d5OXfxx!MdAKK%Yu3%7cQS?z{pZ)_x!yisalOLPYsaMc~s133xL6N zR-sB8`|T#tIR=c^3a#EFCne$gZBq;o<-9?7cAAF1#&>xG6wB-{?@8`AM(>p|Td=vR zRBOtRnYnc2HToyeTB83r8>ioo-wgQLKwGLcW!l}jOC_8LoKU*mtGV0d)0;v&1L@7& zrJh6l-b(9`pb%DwJn|)NEhajoe7w)Qgl8~n>^g7%IA{|7^PZLW}cNt!Ho8_!hQdf z$l75)^}`3Dhz}W~R7=W`*Lk!Pw9?s&Tr$sNuAjEBFX)CSR5s+>=2Ic#?vc+^NK8ui zH5J@4*={j%jVn$^yZ~WdxM|$qcb|2-^AZr9V{?|G6k4IhCGrxq9wq~6RC%p6{!SzN z&|7GGh0X}tZGzWTiW0RtA@C|)E2nj`bl z7IXep$|I!p6BoDgT4%12&h^{g!2SW%oYE=Qkm6|4H45Z1iz$iUU${3}lNg0APnZ{^KO_MT4 zslg^g%<|~tijb_-G$~^sO|}C@>1k5NC^b#W5TwaPjJDJ?DPxoxZZc#`9-U*7m6|4H z45UeOQ*bXexMYk{)1(aXx=-Gq6;|A*Nv7K6(#8jTnlyE^i1?ywpD@_H84sZy56H0+ zV=2g^)`*za3ZH#T6JKsol}%|RRF01 z+Nxeo?&b=lU=a6@MvKz>htYtE_d_zuVdG z&v<9qXj#&~-O|tRfUajnuwz$gNeMZ5R;RX2XjPojMb;{@QlJSVlP5M0N>EY`l zDg=RkWD#d=*3tc}S?fFOoWYHq0J~}?0>b34`E2x^b=~WJCzzl>a$`r>bBd^q89MvE zh`h{@ZPyji0@ikWLFss}4|>6~czcTtBWiB?itVN{_ksDwz2xrG?YGzY7Y60`lY481 zGb|0{scf#ba+?8+I_ULjtl6bG+Yc@@V5|Xz9h@DkUSw%%cAxFMLLf$)_EJNG&9yb8 zvq1S2C}taqlP4^%&$gx&l#xXg1@;0&UvI9()%+sztpZ=v6?3Ky_O0#nnaxP8Oo2tU ziw1*nU>Ic&M&&W!HCI%JUj2IYSolL4=Ye03apf2m<=KH4hEAKRK*-WHZa~LYkn5e- z8hTYl+f3NHn4GFYioW68@{1C-^m{e!C{r9;nIR%^mK|6X*}RmqZ2as7Q~HT0?rwQr z>vOw4T7_$lEFNJ;HpU##n)IgERkhYkDK)FXj;N=5R?}LU4i~lZOqrymvDLKg5VP!G zh~J2yi6epoy9_+`>0SF@aVvjMHEnJDgvBK^b=aSMV)1ac-_)P_Z?Lmwf479CgXuN; zReo*Za$y41vCy`SxHW~pp4Hqn$7E9F;)&z^f`nu_QX@8jo~XH80)6jyp-|7j(xxCD`Y_{JSY8j{C>CQ-68|V1P3tT zE1mxAWRteeHW|hUr?q^n_sXXhS!jP0=;s>R&r(m<(60D2b$myyN4eB;UA105^jBN0 sL+aop?T!kj{v(2$eluir=#cT0@KS3_4sEr+Q2ZLLHr4f4t##1<0QP@KO#lD@ diff --git a/web/package.json b/web/package.json index 9f6f6d3..b7d8df7 100644 --- a/web/package.json +++ b/web/package.json @@ -28,11 +28,13 @@ "@radix-ui/react-slot": "^1.0.2", "@radix-ui/react-tabs": "^1.0.4", "@tanstack/react-table": "^8.10.7", + "@types/jsonwebtoken": "^9.0.5", "@types/uuid": "^9.0.7", "class-variance-authority": "^0.7.0", "clsx": "^2.0.0", "dayjs": "^1.11.10", "drizzle-orm": "^0.29.1", + "jsonwebtoken": "^9.0.2", "lucide-react": "^0.294.0", "nanoid": "^5.0.4", "next": "14.0.3", diff --git a/web/src/app/api/upload/route.ts b/web/src/app/api/upload/route.ts index 139d48d..a8d71f3 100644 --- a/web/src/app/api/upload/route.ts +++ b/web/src/app/api/upload/route.ts @@ -7,6 +7,7 @@ import { } from "@/db/schema"; import { parseDataSafe } from "@/lib/parseDataSafe"; import { sql } from "drizzle-orm"; +import jwt from "jsonwebtoken"; import { NextResponse } from "next/server"; import { z } from "zod"; @@ -17,7 +18,7 @@ const corsHeaders = { }; const UploadRequest = z.object({ - user_id: z.string(), + // user_id: z.string(), workflow_id: z.string().optional(), workflow_name: z.string().optional(), workflow: workflowType, @@ -35,8 +36,39 @@ export async function OPTIONS(request: Request) { }); } +const APIKeyBodyRequest = z.object({ + user_id: z.string().optional(), + org_id: z.string().optional(), + iat: z.number(), +}); + +function parseJWT(token: string) { + try { + // Verify the token - this also decodes it + const decoded = jwt.verify(token, process.env.JWT_SECRET!); + return APIKeyBodyRequest.parse(decoded); + } catch (err) { + // Handle error (token is invalid, expired, etc.) + console.error(err); + return null; + } +} + export async function POST(request: Request) { - console.log("hi"); + const token = request.headers.get("Authorization")?.split(" ")?.[1]; // Assuming token is sent as "Bearer your_token" + const userData = token ? parseJWT(token) : undefined; + if (!userData) { + return new NextResponse("Invalid or expired token", { + status: 401, + headers: corsHeaders, + }); + } + + console.log(userData); + + const { user_id, org_id } = userData; + + if (!user_id) return new NextResponse("Invalid user_id", { status: 401 }); const [data, error] = await parseDataSafe( UploadRequest, @@ -47,7 +79,7 @@ export async function POST(request: Request) { if (!data || error) return error; const { - user_id, + // user_id, workflow, workflow_api, workflow_id: _workflow_id, diff --git a/web/src/server/curdApiKeys.ts b/web/src/server/curdApiKeys.ts index d55bc47..0dbbf44 100644 --- a/web/src/server/curdApiKeys.ts +++ b/web/src/server/curdApiKeys.ts @@ -4,31 +4,42 @@ import { db } from "@/db/db"; import { apiKeyTable } from "@/db/schema"; import { auth } from "@clerk/nextjs"; import { and, desc, eq } from "drizzle-orm"; -import { customAlphabet } from "nanoid"; +import jwt from "jsonwebtoken"; import { revalidatePath } from "next/cache"; -export const nanoid = customAlphabet( - "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz" -); +// export const nanoid = customAlphabet( +// "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz" +// ); -const prefixes = { - cd: "cd", -} as const; +// const prefixes = { +// cd: "cd", +// } as const; -function newId(prefix: keyof typeof prefixes): string { - return [prefixes[prefix], nanoid(16)].join("_"); -} +// function newId(prefix: keyof typeof prefixes): string { +// return [prefixes[prefix], nanoid(16)].join("_"); +// } export async function addNewAPIKey(name: string) { const { userId, orgId } = auth(); if (!userId) throw new Error("No user id"); + let token: string; + + if (orgId) { + token = jwt.sign( + { user_id: userId, org_id: orgId }, + process.env.JWT_SECRET! + ); + } else { + token = jwt.sign({ user_id: userId }, process.env.JWT_SECRET!); + } + const key = await db .insert(apiKeyTable) .values({ name: name, - key: newId("cd"), + key: token, user_id: userId, org_id: orgId, })