diff --git a/src/App.tsx b/src/App.tsx index 0cfa5ca..07e1eeb 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -4,11 +4,13 @@ import { SSOPage } from "@/pages/SSOPage"; import { HomePage } from "@/pages/HomePage"; import { ViewAppPage } from "@/pages/ViewAppPage"; import { Page } from "@/components/Page"; +import { InstantSetupPage } from "@/pages/InstantSetupPage"; export function App() { return ( + } /> }> } /> } /> diff --git a/src/lib/saml.ts b/src/lib/saml.ts index e16a0d1..0c46990 100644 --- a/src/lib/saml.ts +++ b/src/lib/saml.ts @@ -1,6 +1,8 @@ export interface AssertionData { idpEntityId: string; subjectId: string; + firstName: string; + lastName: string; sessionId: string; now: string; expire: string; @@ -28,7 +30,7 @@ function signedAssertion( digest: string, signature: string, ): string { - return `${digest}${signature}${assertionData.idpEntityId}${assertionData.subjectId}${assertionData.spEntityId}`; + return `${digest}${signature}${assertionData.idpEntityId}${assertionData.subjectId}${assertionData.spEntityId}${assertionData.firstName}${assertionData.lastName}`; } async function signatureValue( @@ -59,7 +61,7 @@ async function digestValue(assertionData: AssertionData): Promise { } function digestPart(assertionData: AssertionData): string { - return `${assertionData.idpEntityId}${assertionData.subjectId}${assertionData.spEntityId}`; + return `${assertionData.idpEntityId}${assertionData.subjectId}${assertionData.spEntityId}${assertionData.firstName}${assertionData.lastName}`; } function arrayBufferToBase64(buffer: ArrayBuffer): string { diff --git a/src/pages/HomePage.tsx b/src/pages/HomePage.tsx index 788df9b..b918a41 100644 --- a/src/pages/HomePage.tsx +++ b/src/pages/HomePage.tsx @@ -9,18 +9,17 @@ export function HomePage() { const navigate = useNavigate(); const handleCreateApp = () => { const id = uuidv4(); - const newState = { + setStoreData({ ...storeData, apps: { ...storeData.apps, [id]: { id, spAcsUrl: "", + spEntityId: "", }, }, - }; - console.log("want new state", newState); - setStoreData(newState); + }); navigate(`/apps/${id}`); }; diff --git a/src/pages/InstantSetupPage.tsx b/src/pages/InstantSetupPage.tsx new file mode 100644 index 0000000..d34ac35 --- /dev/null +++ b/src/pages/InstantSetupPage.tsx @@ -0,0 +1,38 @@ +import React, { useEffect } from "react"; +import { createSearchParams, useSearchParams } from "react-router-dom"; +import { useNavigate } from "react-router"; +import { useStore } from "@/lib/store"; + +export function InstantSetupPage() { + const [storeData, setStoreData] = useStore(); + const [searchParams] = useSearchParams(); + + const appId = searchParams.get("appId")!; + const spAcsUrl = searchParams.get("spAcsUrl")!; + const spEntityId = searchParams.get("spEntityId")!; + const email = searchParams.get("email")!; + const firstName = searchParams.get("firstName")!; + const lastName = searchParams.get("lastName")!; + + const navigate = useNavigate(); + useEffect(() => { + setStoreData({ + ...storeData, + apps: { + ...storeData.apps, + [appId]: { + id: appId, + spAcsUrl, + spEntityId, + }, + }, + }); + + navigate({ + pathname: `/apps/${appId}/sso`, + search: createSearchParams({ email, firstName, lastName }).toString(), + }); + }, [appId, spAcsUrl, spEntityId]); + + return <>; +} diff --git a/src/pages/SSOPage.tsx b/src/pages/SSOPage.tsx index e371f5d..b81afa3 100644 --- a/src/pages/SSOPage.tsx +++ b/src/pages/SSOPage.tsx @@ -26,6 +26,7 @@ import { } from "@/components/ui/card"; import { useSearchParams } from "react-router-dom"; import moment from "moment"; +import { clsx } from "clsx"; const formSchema = z.object({ email: z.string().email({ message: "Email must be a well-formed email." }), @@ -39,6 +40,9 @@ export function SSOPage() { const app = storeData.apps[appId!]; const [searchParams] = useSearchParams(); + const email = searchParams.get("email"); + const firstName = searchParams.get("firstName"); + const lastName = searchParams.get("lastName"); const samlRequest = searchParams.get("SAMLRequest"); const [sessionId, setSessionId] = useState(""); @@ -71,9 +75,9 @@ export function SSOPage() { const form = useForm>({ resolver: zodResolver(formSchema), defaultValues: { - email: "", - firstName: "", - lastName: "", + email: email ?? "", + firstName: firstName ?? "", + lastName: lastName ?? "", }, }); @@ -95,6 +99,8 @@ export function SSOPage() { inputRef.current!.value = await encodeAssertion(key, { idpEntityId: `https://dummyidp.com/apps/${app.id}`, subjectId: values.email, + firstName: values.firstName, + lastName: values.lastName, spEntityId: app.spEntityId, sessionId: sessionId, now: now.format(), @@ -134,7 +140,7 @@ export function SSOPage() { Email - + @@ -148,7 +154,7 @@ export function SSOPage() { First Name - + @@ -162,7 +168,7 @@ export function SSOPage() { Last Name - + @@ -170,7 +176,14 @@ export function SSOPage() { />
- +