mirror of
https://github.com/woodchen-ink/Q58Connect.git
synced 2025-07-19 06:21:55 +08:00
51 lines
1.5 KiB
TypeScript
51 lines
1.5 KiB
TypeScript
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<string, string> {
|
|
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 (
|
|
<main className="flex min-h-screen flex-col items-center justify-center">
|
|
<div className="flex items-center justify-center">
|
|
<Suspense>
|
|
<AuthorizationCard client={client} oauthParams={searchParams.oauth} />
|
|
</Suspense>
|
|
</div>
|
|
</main>
|
|
);
|
|
}
|