diff --git a/src/client/pages/auth/login.tsx b/src/client/pages/auth/login.tsx index bc0a5f96..0f353363 100644 --- a/src/client/pages/auth/login.tsx +++ b/src/client/pages/auth/login.tsx @@ -128,6 +128,12 @@ export default function Login() { } }; + const handleTotpChange = async (val: string) => { + setTotp('pin', val); + + if (val.length === 6) await handleLoginSubmit(form.values, val); + }; + if (configLoading || !config) return ; if (configError) return ; @@ -139,7 +145,7 @@ export default function Login() { setTotp('pin', val)} + onPinChange={(val) => handleTotpChange(val)} onVerify={() => handleLoginSubmit(form.values, totp.pin)} onCancel={() => { setTotp('open', false); diff --git a/src/components/pages/login/TotpModal.tsx b/src/components/pages/login/TotpModal.tsx index 300147f6..c77a7801 100644 --- a/src/components/pages/login/TotpModal.tsx +++ b/src/components/pages/login/TotpModal.tsx @@ -14,32 +14,39 @@ export default function TotpModal({ }) { return ( -
- -
- {state.error && ( - - {state.error} - - )} +
+
+ +
+ {state.error && ( + + {state.error} + + )} - - - - + + + + +
); } diff --git a/src/lib/totp.ts b/src/lib/totp.ts index f05a56e4..b3ef3caf 100644 --- a/src/lib/totp.ts +++ b/src/lib/totp.ts @@ -1,18 +1,20 @@ import { generateSecret, generateURI, verify } from 'otplib'; import { toDataURL } from 'qrcode'; -export function generateKey() { +export function generateKey(): string { return generateSecret({ length: 16, }); } -export async function verifyTotpCode(code: string, secret: string) { - return verify({ +export async function verifyTotpCode(code: string, secret: string): Promise { + const result = await verify({ secret, token: code, epochTolerance: 30, }); + + return result.valid; } export function totpQrcode({ @@ -23,7 +25,7 @@ export function totpQrcode({ issuer?: string; username: string; secret: string; -}) { +}): Promise { return toDataURL( generateURI({ secret,