diff --git a/apps/login/src/components/auth-methods.tsx b/apps/login/src/components/auth-methods.tsx index 578fdee810..23b5de1a95 100644 --- a/apps/login/src/components/auth-methods.tsx +++ b/apps/login/src/components/auth-methods.tsx @@ -32,7 +32,7 @@ const LinkWrapper = ({ export const TOTP = (alreadyAdded: boolean, link: string) => { return ( - +
{ )} > - - - - - + timer-lock-outline + {" "} Authenticator App
@@ -93,7 +60,7 @@ C72,238.87917,85.87916,225,102.99997,225H248z" export const U2F = (alreadyAdded: boolean, link: string) => { return ( - +
{ export const EMAIL = (alreadyAdded: boolean, link: string) => { return ( - +
{ export const SMS = (alreadyAdded: boolean, link: string) => { return ( - +
{ export const PASSKEYS = (alreadyAdded: boolean, link: string) => { return ( - +
{ export const PASSWORD = (alreadyAdded: boolean, link: string) => { return ( - +
)} {codeRequired && ( -
+
)} -
+
-
+
-
+
- m !== AuthenticationMethodType.PASSWORD && - m !== AuthenticationMethodType.PASSKEY, - ); - const humanUser = user.type.case === "human" ? user.type.value : undefined; - if ( - availableSecondFactors?.length == 0 && - humanUser?.passwordChangeRequired - ) { + // check if the user has to change password first + if (humanUser?.passwordChangeRequired) { const params = new URLSearchParams({ loginName: session.factors?.user?.loginName, }); @@ -176,7 +168,13 @@ export async function sendPassword(command: UpdateSessionCommand) { return { redirect: "/password/change?" + params }; } - if (availableSecondFactors?.length == 1) { + const availableMultiFactors = authMethods?.filter( + (m: AuthenticationMethodType) => + m !== AuthenticationMethodType.PASSWORD && + m !== AuthenticationMethodType.PASSKEY, + ); + + if (availableMultiFactors?.length == 1) { const params = new URLSearchParams({ loginName: session.factors?.user.loginName, }); @@ -192,7 +190,7 @@ export async function sendPassword(command: UpdateSessionCommand) { ); } - const factor = availableSecondFactors[0]; + const factor = availableMultiFactors[0]; // if passwordless is other method, but user selected password as alternative, perform a login if (factor === AuthenticationMethodType.TOTP) { return { redirect: `/otp/time-based?` + params }; @@ -203,7 +201,7 @@ export async function sendPassword(command: UpdateSessionCommand) { } else if (factor === AuthenticationMethodType.U2F) { return { redirect: `/u2f?` + params }; } - } else if (availableSecondFactors?.length >= 1) { + } else if (availableMultiFactors?.length >= 1) { const params = new URLSearchParams({ loginName: session.factors.user.loginName, }); @@ -226,7 +224,7 @@ export async function sendPassword(command: UpdateSessionCommand) { return { error: "Initial User not supported" }; } else if ( (loginSettings?.forceMfa || loginSettings?.forceMfaLocalOnly) && - !availableSecondFactors.length + !availableMultiFactors.length ) { const params = new URLSearchParams({ loginName: session.factors.user.loginName, diff --git a/apps/login/src/lib/server/u2f.ts b/apps/login/src/lib/server/u2f.ts index a174d0bc56..5cbd80611b 100644 --- a/apps/login/src/lib/server/u2f.ts +++ b/apps/login/src/lib/server/u2f.ts @@ -32,23 +32,25 @@ export async function addU2F(command: RegisterU2FCommand) { sessionToken: sessionCookie.token, }); - const domain = (await headers()).get("host"); + const host = (await headers()).get("host"); - if (!domain) { + if (!host) { return { error: "Could not get domain" }; } + const [hostname, port] = host.split(":"); + + if (!hostname) { + throw new Error("Could not get hostname"); + } + const userId = session?.session?.factors?.user?.id; if (!session || !userId) { return { error: "Could not get session" }; } - return registerU2F( - userId, - domain, - // sessionCookie.token - ); + return registerU2F(userId, hostname); } export async function verifyU2F(command: VerifyU2FCommand) { diff --git a/apps/login/src/lib/zitadel.ts b/apps/login/src/lib/zitadel.ts index 8e50916b87..306d168b63 100644 --- a/apps/login/src/lib/zitadel.ts +++ b/apps/login/src/lib/zitadel.ts @@ -620,17 +620,7 @@ export async function createPasskeyRegistrationLink( * @returns the newly set email */ -// TODO check for token requirements! -export async function registerU2F( - userId: string, - domain: string, - // token: string, -) { - // const transport = createServerTransport(token, { - // baseUrl: process.env.ZITADEL_API_URL!, - // }); - - // const service = createUserServiceClient(transport); +export async function registerU2F(userId: string, domain: string) { return userService.registerU2F({ userId, domain,