iducationducation
IndexArticlesFormationsProfilOutilsBibliothech
N°014 — 2026
Navigation
01Index02Articles03Formations04Profil05Outils06Bibliothech
N°014 — 2026
iducationducation
IndexArticlesFormationsProfilOutilsBibliothech
N°014 — 2026
Navigation
01Index02Articles03Formations04Profil05Outils06Bibliothech
N°014 — 2026
Formations
TypeScript · Avancé

OpenFiler

Construire une plateforme de gestion de fichiers complète — upload, authentification, analytics, sécurité fail2ban et déploiement Docker.

Next.js 15TypeScriptSQLiteBetter AuthTailwind CSS v4
GitHub
01Setup et configuration02Authentification avec Better Auth03Base de données SQLite04Système d'upload de fichiers05Dashboard et interface06Corbeille et liens de partage07Déploiement Docker
Chapitre 2·25 min

Authentification avec Better Auth

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.

Pourquoi Better Auth

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.

Configuration serveur

lib/auth/server.ts
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.

Route API catch-all

app/api/auth/[...all]/route.ts
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.

Middleware de protection

middleware.ts
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.

Vérifier la session côté serveur

lib/auth/require-session.ts
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 error

Client auth

lib/auth/client.ts
import { 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.

Précédent
Setup et configuration
Suivant
Base de données SQLite

Développeur fullstack passionné. J'apprends en construisant et je documente tout — front, back, outils. Le code s'apprend mieux en public.

Naviguer

IndexTous les articlesFormationsProfilOutilsBibliothech

Ailleurs

GitHub RSS

Newsletter

Les articles, libs et découvertes. Une fois par semaine, pas plus.

© 2026 William LoreeConçu & codé à la main