acc93de708
Uses better-auth's built-in twoFactor plugin rather than hand-rolling TOTP — adds the two_factors table and users.twoFactorEnabled, wires the server/client plugins (allowPasswordless: true so OAuth-only accounts aren't locked out of managing 2FA), and adds a custom rate limit for the verify endpoints (5/min — far stricter than the default 100/10s, since a 6-digit code has a much smaller keyspace than a password). New Settings → Security section walks through enable (password confirm -> QR + backup codes -> confirm a live code before it's actually turned on, per the plugin's default flow) and disable. New /verify-2fa page handles the post-password mid-login step, with a backup-code fallback. Verified live end-to-end: enable, confirm, forced re-auth on next sign-in, TOTP accepted, backup code accepted (single-use), disable. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
20 lines
391 B
TypeScript
20 lines
391 B
TypeScript
"use client";
|
|
|
|
import { createAuthClient } from "better-auth/react";
|
|
import { genericOAuthClient, twoFactorClient } from "better-auth/client/plugins";
|
|
|
|
export const authClient = createAuthClient({
|
|
plugins: [
|
|
genericOAuthClient(),
|
|
twoFactorClient({ twoFactorPage: "/verify-2fa" }),
|
|
],
|
|
});
|
|
|
|
export const {
|
|
signIn,
|
|
signUp,
|
|
signOut,
|
|
useSession,
|
|
getSession,
|
|
} = authClient;
|