Construire une plateforme de gestion de fichiers complète — upload, authentification, analytics, sécurité fail2ban et déploiement Docker.
OpenFiler utilise Better Auth — une librairie d'authentification TypeScript-first, sans dépendance cloud, qui stocke les sessions dans votre propre base de données.
La plupart des tutoriels utilisent NextAuth ou Clerk. Better Auth est différent : il ne dépend d'aucun service externe, il est typé de bout en bout, et il gère email/password, sessions, et OAuth sans configuration obscure.
import { betterAuth } from 'better-auth'
import Database from 'better-sqlite3'
export const auth = betterAuth({
database: new Database(process.env.DATABASE_URL!),
emailAndPassword: {
enabled: true,
},
trustedOrigins: [process.env.BETTER_AUTH_TRUSTED_ORIGINS!],
})Better Auth crée automatiquement les tables user, session, account et verification dans SQLite. La migration CLI vue au chapitre 1 fait exactement ça.
import { auth } from '@/lib/auth/server'
import { toNextJsHandler } from 'better-auth/next-js'
export const { GET, POST } = toNextJsHandler(auth)Un seul fichier route gère toutes les opérations : POST /api/auth/sign-in/email, POST /api/auth/sign-out, etc.
import { NextRequest, NextResponse } from 'next/server'
export function middleware(request: NextRequest) {
// Bloquer l'inscription publique
if (request.nextUrl.pathname === '/signup') {
return NextResponse.redirect(new URL('/login', request.url))
}
return NextResponse.next()
}OpenFiler est mono-utilisateur par design — le seul compte se crée via le seed.
import { auth } from './server'
import { headers } from 'next/headers'
import { NextResponse } from 'next/server'
export async function requireSession() {
const session = await auth.api.getSession({ headers: await headers() })
if (!session) {
return { session: null, error: NextResponse.json({ error: 'Non autorisé' }, { status: 401 }) }
}
return { session, error: null }
}Chaque route API protégée commence par :
const { session, error } = await requireSession()
if (error) return errorimport { createAuthClient } from 'better-auth/react'
export const authClient = createAuthClient({
baseURL: process.env.NEXT_PUBLIC_APP_URL!,
})Côté client, on utilise authClient.signIn.email() et authClient.signOut(). Better Auth gère les cookies de session automatiquement.