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,