import type { Route } from './+types' import { parse } from 'cookie' export async function loader({ request, context }: Route.LoaderArgs) { const cookies = parse(request.headers.get('Cookie') || '') const url = new URL(request.url) const loginUrl = new URL('/', url.origin) const issuerUrl = new URL('/authorize', context.cloudflare.env.ISSUER_URL) issuerUrl.search = url.search loginUrl.search = url.search if (!cookies?.SID) { return new Response(null, { status: 302, headers: { Location: loginUrl.toString() } }) } try { const r = await fetch(issuerUrl.toString(), { method: 'GET', headers: new Headers([ ['Content-Type', 'application/json'], ['Cookie', request.headers.get('Cookie') as string] ]), redirect: 'manual' }) if (r.status === 302) { return new Response(await r.text(), { status: r.status, headers: r.headers }) } console.log('Authorize response', { json: await r.json(), headers: r.headers, status: r.status }) // Deny authorization if user lacks scopes requested by client if (r.status === 302) { return new Response(null, { status: r.status, headers: { Location: new URL('/deny', url.origin).toString() } }) } return new Response(null, { status: 302, headers: { Location: loginUrl.toString() } }) } catch (error) { console.error(error) return new Response(null, { status: 500 }) } }