Add /client launcher page (auth-gated SSO ticket + embed)
Faithful to AtomCMS's NitroController: requires a session (redirects to /login), issues + persists the SSO ticket via issueSsoTicket (auth_ticket + ip_current from x-forwarded-for), and embeds the configured client URL with ?sso=. Ties auth + SSO + settings together. Verified: tsc exit 0, next build exit 0 (/client route).
This commit is contained in:
1 parent
6e34d485d4
commit
d9a8ce532f
1 file changed
+49
@@ -0,0 +1,49 @@
|
|||||||
|
import { headers } from "next/headers";
|
||||||
|
import { redirect } from "next/navigation";
|
||||||
|
import { issueSsoTicket } from "@/lib/auth/sso-ticket";
|
||||||
|
import { auth } from "@/lib/auth";
|
||||||
|
import { prisma } from "@/lib/prisma";
|
||||||
|
import { siteSettings } from "@/lib/services/site-settings";
|
||||||
|
|
||||||
|
export const dynamic = "force-dynamic";
|
||||||
|
|
||||||
|
export default async function ClientPage() {
|
||||||
|
const session = await auth();
|
||||||
|
if (!session?.user?.id) redirect("/login");
|
||||||
|
|
||||||
|
const userId = Number(session.user.id);
|
||||||
|
const [hotelName, clientUrl] = await Promise.all([
|
||||||
|
siteSettings.get("hotel_name", "Atom"),
|
||||||
|
siteSettings.get("nitro_client_url", ""),
|
||||||
|
]);
|
||||||
|
|
||||||
|
const hdrs = await headers();
|
||||||
|
const ip =
|
||||||
|
hdrs.get("x-forwarded-for")?.split(",")[0]?.trim() ?? hdrs.get("x-real-ip") ?? "0.0.0.0";
|
||||||
|
|
||||||
|
// Faithful to AtomCMS's NitroController: issue (and persist) the SSO ticket on
|
||||||
|
// the launcher render, then hand it to the client.
|
||||||
|
const ticket = await issueSsoTicket(prisma, userId, hotelName ?? "Atom", ip);
|
||||||
|
|
||||||
|
const src = clientUrl
|
||||||
|
? `${clientUrl}${clientUrl.includes("?") ? "&" : "?"}sso=${encodeURIComponent(ticket)}`
|
||||||
|
: "";
|
||||||
|
|
||||||
|
return (
|
||||||
|
<main>
|
||||||
|
<h1>Launching {hotelName ?? "Atom"}…</h1>
|
||||||
|
{src ? (
|
||||||
|
<iframe
|
||||||
|
title="Hotel client"
|
||||||
|
src={src}
|
||||||
|
style={{ width: "100%", height: "80vh", border: 0, borderRadius: 10 }}
|
||||||
|
/>
|
||||||
|
) : (
|
||||||
|
<p className="muted">
|
||||||
|
No client URL configured (set <code>nitro_client_url</code> in settings). SSO ticket
|
||||||
|
issued for this session: <code>{ticket}</code>
|
||||||
|
</p>
|
||||||
|
)}
|
||||||
|
</main>
|
||||||
|
);
|
||||||
|
}
|
||||||
Reference in new issue
Block a user