diff --git a/apps/login/src/app/(login)/password/page.tsx b/apps/login/src/app/(login)/password/page.tsx index f68073a3523..d6c87850ebb 100644 --- a/apps/login/src/app/(login)/password/page.tsx +++ b/apps/login/src/app/(login)/password/page.tsx @@ -32,6 +32,8 @@ export default async function Page({ const branding = await getBrandingSettings(organization); const loginSettings = await getLoginSettings(organization); + console.log(sessionFactors); + return (
diff --git a/apps/login/src/app/(login)/password/set/page.tsx b/apps/login/src/app/(login)/password/set/page.tsx new file mode 100644 index 00000000000..d6c87850ebb --- /dev/null +++ b/apps/login/src/app/(login)/password/set/page.tsx @@ -0,0 +1,75 @@ +import { Alert } from "@/components/alert"; +import { DynamicTheme } from "@/components/dynamic-theme"; +import { PasswordForm } from "@/components/password-form"; +import { UserAvatar } from "@/components/user-avatar"; +import { loadMostRecentSession } from "@/lib/session"; +import { getBrandingSettings, getLoginSettings } from "@/lib/zitadel"; +import { PasskeysType } from "@zitadel/proto/zitadel/settings/v2/login_settings_pb"; +import { getLocale, getTranslations } from "next-intl/server"; + +export default async function Page({ + searchParams, +}: { + searchParams: Record; +}) { + const locale = getLocale(); + const t = await getTranslations({ locale, namespace: "password" }); + + const { loginName, organization, authRequestId, alt } = searchParams; + + // also allow no session to be found (ignoreUnkownUsername) + let sessionFactors; + try { + sessionFactors = await loadMostRecentSession({ + loginName, + organization, + }); + } catch (error) { + // ignore error to continue to show the password form + console.warn(error); + } + + const branding = await getBrandingSettings(organization); + const loginSettings = await getLoginSettings(organization); + + console.log(sessionFactors); + + return ( + +
+

{sessionFactors?.factors?.user?.displayName ?? t("title")}

+

{t("description")}

+ + {/* show error only if usernames should be shown to be unknown */} + {(!sessionFactors || !loginName) && + !loginSettings?.ignoreUnknownUsernames && ( +
+ {t("error:unknownContext")} +
+ )} + + {sessionFactors && ( + + )} + + {loginName && ( + + )} +
+
+ ); +} diff --git a/apps/login/src/lib/server/loginname.ts b/apps/login/src/lib/server/loginname.ts index 299d5f95846..2d67b46f3a0 100644 --- a/apps/login/src/lib/server/loginname.ts +++ b/apps/login/src/lib/server/loginname.ts @@ -2,6 +2,7 @@ import { create } from "@zitadel/client"; import { ChecksSchema } from "@zitadel/proto/zitadel/session/v2/session_service_pb"; +import { UserState } from "@zitadel/proto/zitadel/user/v2/user_pb"; import { AuthenticationMethodType } from "@zitadel/proto/zitadel/user/v2/user_service_pb"; import { headers } from "next/headers"; import { redirect } from "next/navigation"; @@ -135,6 +136,25 @@ export async function sendLoginname(command: SendLoginnameCommand) { return { error: "Could not create session for user" }; } + if (users.result[0].state === UserState.INITIAL) { + const params = new URLSearchParams({ + loginName: session.factors?.user?.loginName, + }); + + if (command.organization || session.factors?.user?.organizationId) { + params.append( + "organization", + command.organization ?? session.factors?.user?.organizationId, + ); + } + + if (command.authRequestId) { + params.append("authRequestid", command.authRequestId); + } + + return redirect("/password/set?" + params); + } + const methods = await listAuthenticationMethodTypes( session.factors?.user?.id, );