diff --git a/server/auth/2fa.ts b/server/auth/2fa.ts index 970b14a..2bf62c3 100644 --- a/server/auth/2fa.ts +++ b/server/auth/2fa.ts @@ -11,7 +11,9 @@ export async function verifyTotpCode( secret: string, userId: string ): Promise { - if (code.length !== 6) { + // if code is digits only, it's totp + const isTotp = /^\d+$/.test(code); + if (!isTotp) { const validBackupCode = await verifyBackUpCode(code, userId); return validBackupCode; } else { diff --git a/server/routers/auth/verifyTotp.ts b/server/routers/auth/verifyTotp.ts index 9f54dab..3b30def 100644 --- a/server/routers/auth/verifyTotp.ts +++ b/server/routers/auth/verifyTotp.ts @@ -118,7 +118,7 @@ export async function verifyTotp( async function generateBackupCodes(): Promise { const codes = []; for (let i = 0; i < 10; i++) { - const code = generateRandomString(8, alphabet("0-9", "A-Z", "a-z")); + const code = generateRandomString(6, alphabet("0-9", "A-Z", "a-z")); codes.push(code); } return codes; diff --git a/src/app/auth/reset-password/ResetPasswordForm.tsx b/src/app/auth/reset-password/ResetPasswordForm.tsx index 9af41e1..919a417 100644 --- a/src/app/auth/reset-password/ResetPasswordForm.tsx +++ b/src/app/auth/reset-password/ResetPasswordForm.tsx @@ -45,6 +45,7 @@ import { createApiClient } from "@app/api"; import { useEnvContext } from "@app/hooks/useEnvContext"; import { passwordSchema } from "@server/auth/passwordSchema"; import { get } from "http"; +import { REGEXP_ONLY_DIGITS_AND_CHARS } from "input-otp"; const requestSchema = z.object({ email: z.string().email() @@ -354,6 +355,7 @@ export default function ResetPasswordForm({ (null); const [loading, setLoading] = useState(false); - const [mfaRequested, setMfaRequested] = useState(false); + const [mfaRequested, setMfaRequested] = useState(true); const form = useForm>({ resolver: zodResolver(formSchema), @@ -129,7 +130,7 @@ export default function LoginForm({ redirect, onLogin }: LoginFormProps) { } return ( -
+
{!mfaRequested && (
Authenticator Code
- +