diff --git a/apps/login/app/(login)/loginname/[loginname]/page.tsx b/apps/login/app/(login)/loginname/[loginname]/page.tsx deleted file mode 100644 index 406a05b975e..00000000000 --- a/apps/login/app/(login)/loginname/[loginname]/page.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import { getLoginSettings, server } from "#/lib/zitadel"; -import UsernameForm from "#/ui/UsernameForm"; - -export default async function Page({ - params, -}: { - params: { loginname: string }; -}) { - const login = await getLoginSettings(server); - - return ( -
-

Welcome back!

-

Enter your login data.

- - -
- ); -} diff --git a/apps/login/app/(login)/loginname/page.tsx b/apps/login/app/(login)/loginname/page.tsx index 069fb0160b8..468711fbc44 100644 --- a/apps/login/app/(login)/loginname/page.tsx +++ b/apps/login/app/(login)/loginname/page.tsx @@ -1,12 +1,109 @@ +import { + createSession, + getLoginSettings, + listAuthenticationMethodTypes, + server, +} from "#/lib/zitadel"; import UsernameForm from "#/ui/UsernameForm"; +import { AuthenticationMethodType, Factors } from "@zitadel/server"; -export default function Page() { - return ( -
-

Welcome back!

-

Enter your login data.

+type SessionAuthMethods = { + authMethodTypes: AuthenticationMethodType[]; + sessionId: string; + factors: Factors; +}; - -
+async function updateCookie(loginName: string) { + const res = await fetch( + `${process.env.VERCEL_URL ?? "http://localhost:3000"}/session`, + { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + loginName, + }), + } ); + + const response = await res.json(); + + if (!res.ok) { + console.log("damn"); + return Promise.reject(response.details); + } + return response; +} + +async function getSessionAndAuthMethods( + loginName: string, + domain: string +): Promise { + const createdSession = await createSession( + server, + loginName, + domain, + undefined, + undefined + ); + + if (createdSession) { + return updateCookie(loginName) + .then((resp) => { + return listAuthenticationMethodTypes(resp.factors.user.id) + .then((methods) => { + return { + authMethodTypes: methods.authMethodTypes, + sessionId: createdSession.sessionId, + factors: resp?.factors, + }; + }) + .catch((error) => { + throw "Could not get auth methods"; + }); + }) + .catch((error) => { + console.log(error); + throw "Could not add session to cookie"; + }); + } else { + throw "Could not create session"; + } +} + +export default async function Page({ + searchParams, +}: { + searchParams: Record; +}) { + const domain: string = process.env.VERCEL_URL ?? "localhost"; + + const loginName = searchParams?.loginName; + if (loginName) { + const login = await getLoginSettings(server); + console.log(login); + const sessionAndAuthMethods = await getSessionAndAuthMethods( + loginName, + domain + ); + console.log(sessionAndAuthMethods); + return ( +
+

Welcome back!

+

Enter your login data.

+ + +
+ ); + } else { + return ( +
+

Welcome back!

+

Enter your login data.

+ + +
+ ); + } } diff --git a/apps/login/ui/UsernameForm.tsx b/apps/login/ui/UsernameForm.tsx index 606b4f06c5c..7e9503ace07 100644 --- a/apps/login/ui/UsernameForm.tsx +++ b/apps/login/ui/UsernameForm.tsx @@ -6,10 +6,6 @@ import { TextInput } from "./Input"; import { useForm } from "react-hook-form"; import { useRouter } from "next/navigation"; import { Spinner } from "./Spinner"; -import { - ListAuthenticationMethodTypesResponse, - AuthenticationMethodType, -} from "@zitadel/server"; type Inputs = { loginName: string; @@ -20,38 +16,30 @@ export default function UsernameForm() { mode: "onBlur", }); + const router = useRouter(); + const [loading, setLoading] = useState(false); - async function submitUsernameAndGetAuthenticationMethods( - values: Inputs - ): Promise { - setLoading(true); - const res = await fetch("/methods", { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ - loginName: values.loginName, - }), - }); - - setLoading(false); - if (!res.ok) { - throw new Error("Failed to load authentication methods"); - } - return res.json(); - } - - function submitUsernameAndContinue(value: Inputs): Promise { - return submitUsernameAndGetAuthenticationMethods(value).then( - ({ factors, sessionId, authMethodTypes }) => { - console.log(factors, sessionId, authMethodTypes); - if (authMethodTypes.length === 1) { - } else { - } - } + function resubmitWithUsername(values: Inputs) { + return router.push( + `/loginname?` + new URLSearchParams({ loginName: values.loginName }) ); + // setLoading(true); + // const res = await fetch("/methods", { + // method: "POST", + // headers: { + // "Content-Type": "application/json", + // }, + // body: JSON.stringify({ + // loginName: values.loginName, + // }), + // }); + + // setLoading(false); + // if (!res.ok) { + // throw new Error("Failed to load authentication methods"); + // } + // return res.json(); } const { errors } = formState; @@ -78,7 +66,7 @@ export default function UsernameForm() { className="self-end" variant={ButtonVariants.Primary} disabled={loading || !formState.isValid} - onClick={handleSubmit(submitUsernameAndContinue)} + onClick={handleSubmit(resubmitWithUsername)} > {loading && } continue diff --git a/apps/login/utils/cookies.ts b/apps/login/utils/cookies.ts index fded8ed392a..6697ce6c131 100644 --- a/apps/login/utils/cookies.ts +++ b/apps/login/utils/cookies.ts @@ -19,6 +19,7 @@ function setSessionHttpOnlyCookie(sessions: SessionCookie[]) { path: "/", }); } + export async function addSessionToCookie(session: SessionCookie): Promise { const cookiesList = cookies(); const stringifiedCookie = cookiesList.get("sessions"); @@ -37,7 +38,9 @@ export async function addSessionToCookie(session: SessionCookie): Promise { currentSessions = [...currentSessions, session]; } - setSessionHttpOnlyCookie(currentSessions); + console.log(currentSessions); + + return setSessionHttpOnlyCookie(currentSessions); } export async function updateSessionCookie( diff --git a/packages/zitadel-server/src/index.ts b/packages/zitadel-server/src/index.ts index b33bc625715..4fbca57026b 100644 --- a/packages/zitadel-server/src/index.ts +++ b/packages/zitadel-server/src/index.ts @@ -19,7 +19,10 @@ export { Challenges_Passkey, } from "./proto/server/zitadel/session/v2alpha/challenge"; -export { Session } from "./proto/server/zitadel/session/v2alpha/session"; +export { + Session, + Factors, +} from "./proto/server/zitadel/session/v2alpha/session"; export { ListSessionsResponse, GetSessionResponse,