From ce79f8f170ad2fbb3ae082b9642c6ddfab355794 Mon Sep 17 00:00:00 2001 From: peintnermax Date: Fri, 18 Oct 2024 11:29:59 +0200 Subject: [PATCH] userId as alternative to support email --- .../src/app/(login)/password/set/page.tsx | 65 +++++++++++++------ apps/login/src/components/login-otp.tsx | 61 ++++++++--------- .../src/components/set-password-form.tsx | 3 - 3 files changed, 76 insertions(+), 53 deletions(-) diff --git a/apps/login/src/app/(login)/password/set/page.tsx b/apps/login/src/app/(login)/password/set/page.tsx index ac61442b3b7..8e0a8a69932 100644 --- a/apps/login/src/app/(login)/password/set/page.tsx +++ b/apps/login/src/app/(login)/password/set/page.tsx @@ -7,7 +7,10 @@ import { getBrandingSettings, getLoginSettings, getPasswordComplexitySettings, + getUserByID, } from "@/lib/zitadel"; +import { Session } from "@zitadel/proto/zitadel/session/v2/session_pb"; +import { HumanUser, User } from "@zitadel/proto/zitadel/user/v2/user_pb"; import { getLocale, getTranslations } from "next-intl/server"; export default async function Page({ @@ -19,54 +22,74 @@ export default async function Page({ const t = await getTranslations({ locale, namespace: "password" }); const tError = await getTranslations({ locale, namespace: "error" }); - const { loginName, organization, authRequestId, code } = searchParams; + const { userId, loginName, organization, authRequestId, code } = searchParams; // also allow no session to be found (ignoreUnkownUsername) - const sessionFactors = await loadMostRecentSession({ - loginName, - organization, - }); + let session: Session | undefined; + if (loginName) { + session = await loadMostRecentSession({ + loginName, + organization, + }); + } const branding = await getBrandingSettings(organization); const passwordComplexity = await getPasswordComplexitySettings( - sessionFactors?.factors?.user?.organizationId, + session?.factors?.user?.organizationId, ); const loginSettings = await getLoginSettings(organization); + let user: User | undefined; + let displayName: string | undefined; + if (userId) { + const userResponse = await getUserByID(userId); + user = userResponse.user; + + if (user?.type.case === "human") { + displayName = (user.type.value as HumanUser).profile?.displayName; + } + } + return (
-

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

+

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

{t("set.description")}

{/* show error only if usernames should be shown to be unknown */} - {(!sessionFactors || !loginName) && - !loginSettings?.ignoreUnknownUsernames && ( -
- {tError("unknownContext")} -
- )} + {loginName && !session && !loginSettings?.ignoreUnknownUsernames && ( +
+ {tError("unknownContext")} +
+ )} - {sessionFactors && ( + {session ? ( - )} + ) : user ? ( + + ) : null} {t("set.codeSent")} {passwordComplexity && - loginName && - sessionFactors?.factors?.user?.id ? ( + (loginName ?? user?.preferredLoginName) && + (userId ?? session?.factors?.user?.id) ? ( { - setError(error.message ?? "Could not verify OTP code"); + }).catch(() => { + setError("Could not verify OTP code"); setLoading(false); + return; }); setLoading(false); @@ -151,39 +152,41 @@ export function LoginOTP({ function setCodeAndContinue(values: Inputs, organization?: string) { return submitCode(values, organization).then((response) => { - if (authRequestId && response && response.sessionId) { - const params = new URLSearchParams({ - sessionId: response.sessionId, - authRequest: authRequestId, - }); + if (response) { + if (authRequestId && response && response.sessionId) { + const params = new URLSearchParams({ + sessionId: response.sessionId, + authRequest: authRequestId, + }); - if (organization) { - params.append("organization", organization); - } + if (organization) { + params.append("organization", organization); + } - if (authRequestId) { - params.append("authRequest", authRequestId); - } + if (authRequestId) { + params.append("authRequest", authRequestId); + } - if (sessionId) { - params.append("sessionId", sessionId); - } + if (sessionId) { + params.append("sessionId", sessionId); + } - return router.push(`/login?` + params); - } else { - const params = new URLSearchParams(); - if (response?.factors?.user?.loginName) { - params.append("loginName", response.factors.user.loginName); - } - if (authRequestId) { - params.append("authRequestId", authRequestId); - } + return router.push(`/login?` + params); + } else { + const params = new URLSearchParams(); + if (response?.factors?.user?.loginName) { + params.append("loginName", response.factors.user.loginName); + } + if (authRequestId) { + params.append("authRequestId", authRequestId); + } - if (organization) { - params.append("organization", organization); - } + if (organization) { + params.append("organization", organization); + } - return router.push(`/signedin?` + params); + return router.push(`/signedin?` + params); + } } }); } diff --git a/apps/login/src/components/set-password-form.tsx b/apps/login/src/components/set-password-form.tsx index ead010484d3..d32fabcd5a0 100644 --- a/apps/login/src/components/set-password-form.tsx +++ b/apps/login/src/components/set-password-form.tsx @@ -11,7 +11,6 @@ import { create } from "@zitadel/client"; import { ChecksSchema } from "@zitadel/proto/zitadel/session/v2/session_service_pb"; import { PasswordComplexitySettings } from "@zitadel/proto/zitadel/settings/v2/password_settings_pb"; import { useTranslations } from "next-intl"; -import { useRouter } from "next/navigation"; import { useState } from "react"; import { FieldValues, useForm } from "react-hook-form"; import { Alert } from "./alert"; @@ -58,8 +57,6 @@ export function SetPasswordForm({ const [loading, setLoading] = useState(false); const [error, setError] = useState(""); - const router = useRouter(); - async function submitRegister(values: Inputs) { setLoading(true); const changeResponse = await changePassword({