From 5ee4beb662f9058a4db705e982fbe944e956ccbc Mon Sep 17 00:00:00 2001 From: Atridad Lahiji Date: Thu, 17 Aug 2023 16:40:09 -0600 Subject: [PATCH 1/3] Weird middleware issues --- src/middleware.ts | 12 ++++++++++++ src/pages/api/external/ping.ts | 8 ++------ src/server/unkey.ts | 16 +++++----------- 3 files changed, 19 insertions(+), 17 deletions(-) diff --git a/src/middleware.ts b/src/middleware.ts index 807e65c..ca6282b 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -1,7 +1,19 @@ import { authMiddleware } from "@clerk/nextjs"; +import { validateRequest } from "./server/unkey"; +import { NextResponse } from "next/server"; export default authMiddleware({ publicRoutes: ["/", "/api/(.*)"], + beforeAuth: async (req) => { + if (req.nextUrl.pathname.startsWith("/api/external")) { + const isValid = await validateRequest(req); + console.log("Is Valid?: ", isValid); + if (isValid) { + return NextResponse.next(); + } + return new NextResponse("UNAUTHORIZED", { status: 403 }); + } + }, }); export const config = { diff --git a/src/pages/api/external/ping.ts b/src/pages/api/external/ping.ts index 9125d74..9c32a57 100644 --- a/src/pages/api/external/ping.ts +++ b/src/pages/api/external/ping.ts @@ -1,13 +1,9 @@ import type { NextApiRequest, NextApiResponse } from "next"; -import { validateRequest } from "~/server/unkey"; export default async function handler( req: NextApiRequest, res: NextApiResponse ) { - const isValid = await validateRequest(req, res); - - if (isValid) { - res.status(200).json({ result: "Pong!" }); - } + console.log("Made it to the function!"); + res.status(200).json({ result: "Pong!" }); } diff --git a/src/server/unkey.ts b/src/server/unkey.ts index ad2163d..15686b8 100644 --- a/src/server/unkey.ts +++ b/src/server/unkey.ts @@ -1,5 +1,5 @@ import { Unkey } from "@unkey/api"; -import type { NextApiRequest, NextApiResponse } from "next"; +import { NextRequest } from "next/server"; import { env } from "~/env.mjs"; export const unkey = new Unkey({ token: env.UNKEY_ROOT_KEY }); @@ -15,22 +15,16 @@ export const validateApiKey = async (key: string) => { } }; -export const validateRequest = async ( - req: NextApiRequest, - res: NextApiResponse -) => { +export const validateRequest = async (req: NextRequest) => { let isValidKey: boolean = false; + const authorization = req.headers.get("authorization"); // Get the auth bearer token if it exists - if (req.headers.authorization) { - const key = req.headers.authorization.split("Bearer ").at(1); + if (authorization) { + const key = authorization.split("Bearer ").at(1); if (key) { isValidKey = await validateApiKey(key); } } - if (!isValidKey) { - res.status(403).json({ error: "UNAUTHORIZED" }); - } - return isValidKey; }; From c58690307812d3e5ec6222ce9d6469c1125b6208 Mon Sep 17 00:00:00 2001 From: Atridad Lahiji Date: Thu, 17 Aug 2023 20:55:56 -0600 Subject: [PATCH 2/3] :| finally --- src/middleware.ts | 25 ++++++++++++++++++++----- src/pages/api/external/ping.ts | 9 --------- src/pages/api/private/ping.ts | 13 +++++++++++++ src/pages/api/public/ping.ts | 13 +++++++++++++ src/pages/api/webhooks/index.ts | 6 ------ src/server/unkey.ts | 1 + 6 files changed, 47 insertions(+), 20 deletions(-) delete mode 100644 src/pages/api/external/ping.ts create mode 100644 src/pages/api/private/ping.ts create mode 100644 src/pages/api/public/ping.ts diff --git a/src/middleware.ts b/src/middleware.ts index ca6282b..c4ea50d 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -1,17 +1,32 @@ -import { authMiddleware } from "@clerk/nextjs"; +import { authMiddleware, redirectToSignIn } from "@clerk/nextjs"; import { validateRequest } from "./server/unkey"; import { NextResponse } from "next/server"; export default authMiddleware({ - publicRoutes: ["/", "/api/(.*)"], - beforeAuth: async (req) => { - if (req.nextUrl.pathname.startsWith("/api/external")) { + publicRoutes: ["/", "/api/public/(.*)"], + afterAuth: async (auth, req) => { + if (!auth.userId && auth.isPublicRoute) { + console.log("1"); + return NextResponse.next(); + } + + if ( + req.nextUrl.pathname.includes("/api/webhooks") || + req.nextUrl.pathname.includes("/api/private") + ) { + console.log("2"); const isValid = await validateRequest(req); console.log("Is Valid?: ", isValid); if (isValid) { return NextResponse.next(); + } else { + return new NextResponse("UNAUTHORIZED", { status: 403 }); } - return new NextResponse("UNAUTHORIZED", { status: 403 }); + } + if (!auth.userId && !auth.isPublicRoute) { + console.log(req.nextUrl); + console.log("3"); + return redirectToSignIn({ returnBackUrl: req.url }); } }, }); diff --git a/src/pages/api/external/ping.ts b/src/pages/api/external/ping.ts deleted file mode 100644 index 9c32a57..0000000 --- a/src/pages/api/external/ping.ts +++ /dev/null @@ -1,9 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from "next"; - -export default async function handler( - req: NextApiRequest, - res: NextApiResponse -) { - console.log("Made it to the function!"); - res.status(200).json({ result: "Pong!" }); -} diff --git a/src/pages/api/private/ping.ts b/src/pages/api/private/ping.ts new file mode 100644 index 0000000..6a8ca54 --- /dev/null +++ b/src/pages/api/private/ping.ts @@ -0,0 +1,13 @@ +import { NextResponse } from "next/server"; + +export const config = { + runtime: "edge", + regions: ["pdx1"], +}; + +export default async function handler() { + return NextResponse.json( + { message: "Private Pong!" }, + { status: 200, statusText: "SUCCESS" } + ); +} diff --git a/src/pages/api/public/ping.ts b/src/pages/api/public/ping.ts new file mode 100644 index 0000000..7af559a --- /dev/null +++ b/src/pages/api/public/ping.ts @@ -0,0 +1,13 @@ +import { NextResponse } from "next/server"; + +export const config = { + runtime: "edge", + regions: ["pdx1"], +}; + +export default async function handler() { + return NextResponse.json( + { message: "Public Pong!" }, + { status: 200, statusText: "SUCCESS" } + ); +} diff --git a/src/pages/api/webhooks/index.ts b/src/pages/api/webhooks/index.ts index b699ab2..294f7a8 100644 --- a/src/pages/api/webhooks/index.ts +++ b/src/pages/api/webhooks/index.ts @@ -10,12 +10,6 @@ export default async function handler( req: NextApiRequest, res: NextApiResponse ) { - const isValid = await validateRequest(req, res); - - if (!isValid) { - return; - } - try { const requestBody = WebhookEventBodySchema.parse(req.body); diff --git a/src/server/unkey.ts b/src/server/unkey.ts index 15686b8..7c04922 100644 --- a/src/server/unkey.ts +++ b/src/server/unkey.ts @@ -17,6 +17,7 @@ export const validateApiKey = async (key: string) => { export const validateRequest = async (req: NextRequest) => { let isValidKey: boolean = false; + const authorization = req.headers.get("authorization"); // Get the auth bearer token if it exists if (authorization) { From 310f67e0e91d9264ad95a3b960aa685bbef2f052 Mon Sep 17 00:00:00 2001 From: Atridad Lahiji Date: Thu, 17 Aug 2023 20:58:19 -0600 Subject: [PATCH 3/3] Lint --- src/middleware.ts | 7 +------ src/pages/api/private/ping.ts | 2 +- src/pages/api/public/ping.ts | 2 +- src/pages/api/webhooks/index.ts | 1 - 4 files changed, 3 insertions(+), 9 deletions(-) diff --git a/src/middleware.ts b/src/middleware.ts index c4ea50d..bf28af1 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -6,7 +6,6 @@ export default authMiddleware({ publicRoutes: ["/", "/api/public/(.*)"], afterAuth: async (auth, req) => { if (!auth.userId && auth.isPublicRoute) { - console.log("1"); return NextResponse.next(); } @@ -14,9 +13,7 @@ export default authMiddleware({ req.nextUrl.pathname.includes("/api/webhooks") || req.nextUrl.pathname.includes("/api/private") ) { - console.log("2"); const isValid = await validateRequest(req); - console.log("Is Valid?: ", isValid); if (isValid) { return NextResponse.next(); } else { @@ -24,9 +21,7 @@ export default authMiddleware({ } } if (!auth.userId && !auth.isPublicRoute) { - console.log(req.nextUrl); - console.log("3"); - return redirectToSignIn({ returnBackUrl: req.url }); + redirectToSignIn({ returnBackUrl: req.url }); } }, }); diff --git a/src/pages/api/private/ping.ts b/src/pages/api/private/ping.ts index 6a8ca54..ca89e26 100644 --- a/src/pages/api/private/ping.ts +++ b/src/pages/api/private/ping.ts @@ -5,7 +5,7 @@ export const config = { regions: ["pdx1"], }; -export default async function handler() { +export default function handler() { return NextResponse.json( { message: "Private Pong!" }, { status: 200, statusText: "SUCCESS" } diff --git a/src/pages/api/public/ping.ts b/src/pages/api/public/ping.ts index 7af559a..e5b6a76 100644 --- a/src/pages/api/public/ping.ts +++ b/src/pages/api/public/ping.ts @@ -5,7 +5,7 @@ export const config = { regions: ["pdx1"], }; -export default async function handler() { +export default function handler() { return NextResponse.json( { message: "Public Pong!" }, { status: 200, statusText: "SUCCESS" } diff --git a/src/pages/api/webhooks/index.ts b/src/pages/api/webhooks/index.ts index 294f7a8..1599c00 100644 --- a/src/pages/api/webhooks/index.ts +++ b/src/pages/api/webhooks/index.ts @@ -1,5 +1,4 @@ import type { NextApiRequest, NextApiResponse } from "next"; -import { validateRequest } from "~/server/unkey"; import { onUserCreatedHandler, onUserDeletedHandler,