From 70a1ca25d9e746cdd54d5b404017988b24be5008 Mon Sep 17 00:00:00 2001 From: peintnermax Date: Mon, 16 Sep 2024 11:36:44 +0200 Subject: [PATCH] password page changes, doc --- apps/login/readme.md | 22 ++++++++++ apps/login/screenshots/password.png | Bin 0 -> 84874 bytes apps/login/src/app/(login)/mfa/set/page.tsx | 10 ++++- .../src/app/(login)/passkey/add/page.tsx | 9 ++-- apps/login/src/app/(login)/password/page.tsx | 8 ++-- apps/login/src/lib/server/loginname.ts | 16 ------- apps/login/src/ui/PasswordForm.tsx | 41 +++++++++--------- 7 files changed, 60 insertions(+), 46 deletions(-) create mode 100644 apps/login/screenshots/password.png diff --git a/apps/login/readme.md b/apps/login/readme.md index b7b26ea2512..cd355a54858 100644 --- a/apps/login/readme.md +++ b/apps/login/readme.md @@ -80,3 +80,25 @@ If no previous condition is met we throw an error stating the user was not found **EXCEPTIONS:** If the outcome after this order produces a no authentication methods found, or user not found, we check whether `loginSettings?.ignoreUnknownUsernames` is set to `true` as in this case we redirect to the /password page regardless (to not leak information about a registered user). > NOTE: We ignore `loginSettings.allowExternalIdp` as the information whether IDPs are available comes as response from `getActiveIdentityProviders(org?)`. + +### /password + +/password + +This page shows a password field to hydrate the current session with password as a factor. +Below the password field, a reset password link is shown which allows to send a reset email. + +Requests to the APIs made: + +- `getLoginSettings(org?)` +- `getBrandingSettings(org?)` +- `listAuthenticationMethodTypes` + +**MFA AVAILABLE:** After the password has been submitted, additional authentication Methods are loaded. +If the user has set up an additional **single** second factor, it is redirected to add the next factor. Depending on the available method he is redirected to `/otp/time-based`,`/otp/sms?`, `/otp/email?` or `/u2f?`. If the user has multiple second factors, he is redirected to `/mfa` to select his preferred method to continue. + +**NO MFA, FORCE MFA:** If no MFA method is available, and the settings force MFA, the user is sent to `/mfa/set` which prompts to setup a second factor. + +**PROMPT PASSKEY** If the settings do not enforce MFA, we check if passkeys are allowed with `loginSettings?.passkeysType === PasskeysType.ALLOWED` and redirect the user to `/passkey/add` if no passkeys are setup. This step can be skipped. + +If none of the previous conditions apply, we continue to sign in. diff --git a/apps/login/screenshots/password.png b/apps/login/screenshots/password.png new file mode 100644 index 0000000000000000000000000000000000000000..05cf8747bb449155446e0a9757139ca37590bda7 GIT binary patch literal 84874 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 literal 0 HcmV?d00001 diff --git a/apps/login/src/app/(login)/mfa/set/page.tsx b/apps/login/src/app/(login)/mfa/set/page.tsx index def34bb066f..e3389185503 100644 --- a/apps/login/src/app/(login)/mfa/set/page.tsx +++ b/apps/login/src/app/(login)/mfa/set/page.tsx @@ -18,8 +18,14 @@ export default async function Page({ }: { searchParams: Record; }) { - const { loginName, checkAfter, authRequestId, organization, sessionId } = - searchParams; + const { + loginName, + checkAfter, + force, + authRequestId, + organization, + sessionId, + } = searchParams; const sessionWithData = sessionId ? await loadSessionById(sessionId, organization) diff --git a/apps/login/src/app/(login)/passkey/add/page.tsx b/apps/login/src/app/(login)/passkey/add/page.tsx index beec6902c68..15aaa6436a9 100644 --- a/apps/login/src/app/(login)/passkey/add/page.tsx +++ b/apps/login/src/app/(login)/passkey/add/page.tsx @@ -10,18 +10,17 @@ export default async function Page({ }: { searchParams: Record; }) { - const { loginName, promptPasswordless, organization, authRequestId } = - searchParams; + const { loginName, prompt, organization, authRequestId } = searchParams; const session = await loadMostRecentSession({ loginName, organization, }); - const title = !!promptPasswordless + const title = !!prompt ? "Authenticate with a passkey" : "Use your passkey to confirm it's really you"; - const description = !!promptPasswordless + const description = !!prompt ? "When set up, you will be able to authenticate without a password." : "Your device will ask for your fingerprint, face, or screen lock"; @@ -68,7 +67,7 @@ export default async function Page({ {session?.id && ( diff --git a/apps/login/src/app/(login)/password/page.tsx b/apps/login/src/app/(login)/password/page.tsx index 7476eb39677..9b35b5c70c9 100644 --- a/apps/login/src/app/(login)/password/page.tsx +++ b/apps/login/src/app/(login)/password/page.tsx @@ -4,14 +4,14 @@ import Alert from "@/ui/Alert"; import DynamicTheme from "@/ui/DynamicTheme"; import PasswordForm from "@/ui/PasswordForm"; import UserAvatar from "@/ui/UserAvatar"; +import { PasskeysType } from "@zitadel/proto/zitadel/settings/v2/login_settings_pb"; export default async function Page({ searchParams, }: { searchParams: Record; }) { - const { loginName, organization, promptPasswordless, authRequestId, alt } = - searchParams; + const { loginName, organization, authRequestId, alt } = searchParams; const sessionFactors = await loadMostRecentSession({ loginName, @@ -51,7 +51,9 @@ export default async function Page({ authRequestId={authRequestId} organization={organization} loginSettings={loginSettings} - promptPasswordless={promptPasswordless === "true"} + promptPasswordless={ + loginSettings?.passkeysType === PasskeysType.ALLOWED + } isAlternative={alt === "true"} /> )} diff --git a/apps/login/src/lib/server/loginname.ts b/apps/login/src/lib/server/loginname.ts index 20475e4104a..a566b30ad84 100644 --- a/apps/login/src/lib/server/loginname.ts +++ b/apps/login/src/lib/server/loginname.ts @@ -1,6 +1,5 @@ "use server"; -import { PasskeysType } from "@zitadel/proto/zitadel/settings/v2/login_settings_pb"; import { AuthenticationMethodType } from "@zitadel/proto/zitadel/user/v2/user_service_pb"; import { headers } from "next/headers"; import { redirect } from "next/navigation"; @@ -108,13 +107,6 @@ export async function sendLoginname(command: SendLoginnameCommand) { command.organization ?? session.factors?.user?.organizationId; } - if ( - loginSettings?.passkeysType && - loginSettings?.passkeysType === PasskeysType.ALLOWED - ) { - paramsPassword.promptPasswordless = `true`; - } - if (command.authRequestId) { paramsPassword.authRequestId = command.authRequestId; } @@ -164,10 +156,6 @@ export async function sendLoginname(command: SendLoginnameCommand) { // user has no passkey setup and login settings allow passkeys const paramsPasswordDefault: any = { loginName: command.loginName }; - if (loginSettings?.passkeysType === PasskeysType.ALLOWED) { - paramsPasswordDefault.promptPasswordless = `true`; // PasskeysType.PASSKEYS_TYPE_ALLOWED, - } - if (command.authRequestId) { paramsPasswordDefault.authRequestId = command.authRequestId; } @@ -235,10 +223,6 @@ export async function sendLoginname(command: SendLoginnameCommand) { if (loginSettings?.ignoreUnknownUsernames) { const paramsPasswordDefault: any = { loginName: command.loginName }; - if (loginSettings?.passkeysType === PasskeysType.ALLOWED) { - paramsPasswordDefault.promptPasswordless = `true`; - } - if (command.authRequestId) { paramsPasswordDefault.authRequestId = command.authRequestId; } diff --git a/apps/login/src/ui/PasswordForm.tsx b/apps/login/src/ui/PasswordForm.tsx index 4afa89c3208..d7b50979cac 100644 --- a/apps/login/src/ui/PasswordForm.tsx +++ b/apps/login/src/ui/PasswordForm.tsx @@ -153,29 +153,10 @@ export default function PasswordForm({ } return router.push(`/mfa?` + params); - } else if ( - submitted.factors && - !submitted.factors.webAuthN && // if session was not verified with a passkey - promptPasswordless && // if explicitly prompted due policy - !isAlternative // escaped if password was used as an alternative method - ) { - const params = new URLSearchParams({ - loginName: submitted.factors.user.loginName, - promptPasswordless: "true", - }); - - if (authRequestId) { - params.append("authRequestId", authRequestId); - } - - if (organization) { - params.append("organization", organization); - } - - return router.push(`/passkey/add?` + params); } else if (loginSettings?.forceMfa && !availableSecondFactors.length) { const params = new URLSearchParams({ loginName: submitted.factors.user.loginName, + force: "true", // this defines if the mfa is forced in the settings checkAfter: "true", // this defines if the check is directly made after the setup }); @@ -189,6 +170,26 @@ export default function PasswordForm({ // TODO: provide a way to setup passkeys on mfa page? return router.push(`/mfa/set?` + params); + } else if ( + submitted.factors && + !submitted.factors.webAuthN && // if session was not verified with a passkey + promptPasswordless && // if explicitly prompted due policy + !isAlternative // escaped if password was used as an alternative method + ) { + const params = new URLSearchParams({ + loginName: submitted.factors.user.loginName, + prompt: "true", + }); + + if (authRequestId) { + params.append("authRequestId", authRequestId); + } + + if (organization) { + params.append("organization", organization); + } + + return router.push(`/passkey/add?` + params); } else if (authRequestId && submitted.sessionId) { const params = new URLSearchParams({ sessionId: submitted.sessionId,