Autenticación · modules/iam
Adapter listo para producciónBetterAuth,
detrás de un port.
El auth es la parte que un repo en blanco shippea inseguro. UseDeploy cablea BetterAuth dentro del bounded context de IAM detrás de un port tipado IAuthProvider — con el hasher argon2id recomendado por OWASP, segundos factores de primera clase y sesiones por cookie desde el día uno.
Un adapter, todos los métodos
createBetterAuth cablea el adapter de sesión Prisma, el hasher argon2id respaldado por la API nativa de passwords de Bun, y los plugins de magic links, segundo factor y passkeys. Google OAuth se activa solo cuando su client id/secret están presentes.
1 return betterAuth({
2 database: prismaAdapter(prisma, { provider: 'postgresql' }),
3 emailAndPassword: { enabled: true, password: argon2Hasher },
4 socialProviders: cfg.google ? { google: cfg.google } : undefined,
5 plugins: [
6 magicLink({ sendMagicLink }),
7 twoFactor({ /* TOTP */ }),
8 passkey({ /* WebAuthn */ }),
9 ],
10 });
Lo que tenés el día uno
Hashing de passwords con argon2id
Bun trae argon2id en el core — sin dependencia de npm. Es el default recomendado por OWASP para aplicaciones nuevas.
Magic links
Sign-in sin password vía un delivery hook que reenvía al proveedor de email configurado (o loguea el link en dev).
Segundo factor TOTP
El plugin de segundo factor da de alta apps autenticadoras y controla el sign-in con un paso twoFactorRedirect.
Passkeys (WebAuthn)
El plugin de passkey registra autenticadores de plataforma contra tu RP id / origin.
Google OAuth
El sign-in social se activa cuando GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRET están seteados — el campo avatar se mapea al schema de Prisma así el alta social nunca falla.
Sesiones por cookie
Las sesiones son por cookie de punta a punta. El cliente manda las credenciales con withCredentials — sin bearer tokens en localStorage.
Referencia de configuración
Variables de entorno
BETTER_AUTH_SECRETrequeridamin 32 chars
BETTER_AUTH_URLrequeridathe server’s own URL
CORS_ORIGINSrequeridatrusted browser origins
GOOGLE_CLIENT_IDopcionalenables Google OAuth
GOOGLE_CLIENT_SECRETopcional
Dónde vive
apps/server/src/modules/iam/infrastructure/auth/better-auth.adapter.tsapps/server/src/modules/iam/application/ports/auth-provider.ts
No dejes que tu agente escriba el auth desde cero.
Arrancá con 2FA, passkeys, magic links y OAuth ya cableados detrás de un port tipado — la parte que un repo en blanco shippea roto.