diff --git a/packages/website/src/pages/api/patreon/auth/index.ts b/packages/website/src/pages/api/patreon/auth/index.ts new file mode 100644 index 000000000..9612a0118 --- /dev/null +++ b/packages/website/src/pages/api/patreon/auth/index.ts @@ -0,0 +1,34 @@ +import { assertSecret, type BlitzkitResponse } from '@blitzkit/core'; +import type { APIContext } from 'astro'; + +export const prerender = false; + +export async function GET({ request, params }: APIContext) { + const code = request.headers.get('code'); + + if (!code) { + return Response.json({ + status: 'error', + error: 'UNDEFINED_CODE', + } satisfies BlitzkitResponse); + } + + const response = await fetch( + `https://www.patreon.com/api/oauth2/token?code=${ + code + }&grant_type=authorization_code&client_id=${assertSecret( + import.meta.env.PUBLIC_PATREON_CLIENT_ID, + )}&client_secret=${assertSecret( + import.meta.env.PATREON_CLIENT_SECRET, + )}&redirect_uri=${assertSecret( + import.meta.env.PUBLIC_PATREON_REDIRECT_URI, + )}`, + { + method: 'POST', + headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, + }, + ); + const json = await response.json(); + + return Response.json(json); +} diff --git a/packages/website/src/pages/api/patreon/membership/index.ts b/packages/website/src/pages/api/patreon/membership/index.ts index baa8e5611..347c713e7 100644 --- a/packages/website/src/pages/api/patreon/membership/index.ts +++ b/packages/website/src/pages/api/patreon/membership/index.ts @@ -3,5 +3,5 @@ import type { APIContext } from 'astro'; export const prerender = false; export async function GET({}: APIContext) { - return Response.json({ hello: 'world' }); + return Response.json({ hello: Math.random() }); } diff --git a/packages/website/src/pages/auth/[provider]/_index.tsx b/packages/website/src/pages/auth/[provider]/_index.tsx index 310a783ec..6e53a1ed1 100644 --- a/packages/website/src/pages/auth/[provider]/_index.tsx +++ b/packages/website/src/pages/auth/[provider]/_index.tsx @@ -62,9 +62,9 @@ function Content({ provider }: AuthorizeProps) { case 'patreon': { if (!searchParams.get('code')) break; - const response = await fetch( - `/api/patreon/auth/${searchParams.get('code')}`, - ); + const response = await fetch('/api/patreon/auth', { + headers: { code: searchParams.get('code')! }, + }); const data = (await response.json()) as PatreonAuthResponse; mutateApp((draft) => {