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}
-
- )}
+
);
}
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,