import { Suspense } from "react"; import { redirect } from "next/navigation"; import { findAuthorization } from "@/lib/dto/authorization"; import { getClientByClientId } from "@/lib/dto/client"; import { getAuthorizeUrl } from "@/lib/oauth/authorize-url"; import { q58CallbackVerify } from "@/lib/q58/verify"; import { AuthorizationCard } from "@/components/auth/authorization-card"; export interface Q58CallbackParams extends Record { sig: string; sso: string; oauth: string; } export default async function Q58CallbackPage({ searchParams, }: { searchParams: Q58CallbackParams; }) { const oauthParams = new URLSearchParams(atob(searchParams.oauth)); // check client info const client = await getClientByClientId( oauthParams.get("client_id") as string, ); if (!client) { throw new Error("Client Id invalid (code: -1004)."); } // verify discourse callback const user = await q58CallbackVerify(searchParams.sso, searchParams.sig); // check authorization const authorization = await findAuthorization(user.id, client.id); if (authorization) { const redirectUrl = await getAuthorizeUrl(oauthParams); return redirect(redirectUrl); } return (
); }