diff --git a/devbook.md b/devbook.md index 19f1a72..7b235bc 100644 --- a/devbook.md +++ b/devbook.md @@ -13,27 +13,40 @@ Application web moderne pour la lecture de BD/mangas/comics via un serveur Komga - [x] Bouton d'ajout/retrait des favoris - [x] Menu dédié dans la sidebar avec la liste des séries favorites - [ ] Carousel dédié dans sur la homepage de toutes les séries favorites -- [ ] Vue liste/grille configurable +- [ ] Vue liste/grille - [ ] Filtres et tri avancés - [ ] Recherche globale -- [ ] Bouton pour marquer comme lu +- [x] Bouton pour marquer comme lu ### 📖 Lecteur -- [ ] Revue API thumbnail => thumbnails -- [ ] Thumbnails : prefetch en 2 secondes -- [ ] Thumbnails : UI : barre de scroll plus grande -- [ ] Thumbnails : UI : scroll horizontal -- [ ] Page fantome avant le lecteur -- [ ] switch to page +- [x] Navigation entre les pages + - [x] Touches clavier (flèches, espace) + - [x] Swipe sur mobile + - [x] Boutons de navigation +- [x] Mode double page + - [x] Détection automatique en paysage + - [x] Toggle manuel + - [x] Gestion des spreads +- [x] Préchargement des pages + - [x] Cache des pages adjacentes + - [x] Nettoyage automatique du cache +- [x] Améliorations des thumbnails + - [x] Prefetch en 2 secondes + - [x] UI : barre de scroll plus grande + - [x] UI : scroll horizontal + - [x] Revue API thumbnail +- [x] Navigation avancée + - [x] Page fantôme avant le lecteur + - [ ] Switch to page direct ### 📖 Lecture -- [ ] Téléchargement local des livres - - [ ] Bouton de téléchargement - - [ ] Gestion de la progression - - [ ] Stockage local sécurisé - - [ ] Bouton pour supprimer le téléchargement +- [x] Téléchargement local des livres + - [x] Bouton de téléchargement + - [x] Gestion de la progression + - [x] Stockage local sécurisé + - [x] Bouton pour supprimer le téléchargement - [ ] Bouton pour supprimer tous les livres téléchargés dans les préférences - [ ] Support de nouveaux formats - [ ] EPUB @@ -41,16 +54,15 @@ Application web moderne pour la lecture de BD/mangas/comics via un serveur Komga ### 🔄 Cache et Performance -- [ ] Revoir si tous les services utilisent bien le cache +- [x] Revoir si tous les services utilisent bien le cache - [ ] Invalidation du cache sur les mutations -- [ ] Stratégie de revalidation à la demande -- [ ] Prefetching intelligent -- [ ] Lazy loading amélioré -- [ ] Préférences : pouvoir vider chaque cache indépendemment +- [x] Stratégie de revalidation à la demande +- [x] Prefetching intelligent +- [x] Lazy loading amélioré ### 👥 Gestion des utilisateurs -- [ ] Système d'inscription +- [x] Système d'inscription - [ ] Profil utilisateur enrichi - [ ] Nom/Prénom - [ ] Email @@ -78,16 +90,16 @@ Application web moderne pour la lecture de BD/mangas/comics via un serveur Komga ### 📝 Documentation -- [ ] README - - [ ] Installation - - [ ] Configuration - - [ ] Development +- [x] README + - [x] Installation + - [x] Configuration + - [x] Development - [ ] Guide d'utilisation - [ ] Features - [ ] Shortcuts - [ ] Tips & tricks -- [ ] Documentation API - - [ ] Endpoints +- [x] Documentation API + - [x] Endpoints - [ ] Types - [ ] Examples @@ -264,3 +276,76 @@ Application web moderne pour la lecture de BD/mangas/comics via un serveur Komga ### Gestion des séries - [x] Système de favoris (ajout/retrait d'une série des favoris) + +### 🔐 Authentification et Sécurité + +- [ ] Renforcement de la sécurité + - [ ] Implémentation des JWT + - [ ] Tokens d'accès et de rafraîchissement + - [ ] Rotation des clés de signature + - [ ] Sécurisation des cookies + - [ ] Flags HttpOnly, Secure, SameSite + - [ ] Chiffrement des données sensibles + - [ ] Gestion des sessions + - [ ] Table de sessions en base de données + - [ ] Détection des connexions simultanées + - [ ] Système "Se souvenir de moi" + - [ ] Protection contre les attaques + - [ ] Rate limiting + - [ ] Protection CSRF + - [ ] Validation des entrées avec Zod + - [ ] Audit et logging + - [ ] Journalisation des connexions + - [ ] Alertes de sécurité + +### 🎨 UI/UX + +- [x] Composants de base + - [x] Boutons et inputs + - [x] Cards et grilles + - [x] Modals et popovers +- [x] Navigation + - [x] Sidebar responsive + - [x] Breadcrumbs + - [x] Menu utilisateur +- [ ] Thèmes + - [x] Mode sombre/clair + - [ ] Thèmes personnalisés + - [ ] Persistance des préférences + +### 🔍 Performance + +- [x] Optimisation des images + - [x] Format WebP + - [x] Tailles responsives + - [x] Lazy loading +- [ ] Cache + - [x] Stratégies par type de contenu + - [x] Invalidation intelligente + - [x] Prefetching sélectif +- [ ] Métriques + - [ ] Core Web Vitals + - [ ] Analytics de performance + - [ ] Monitoring des erreurs + +### 📊 Analytics et Monitoring + +- [ ] Tracking utilisateur + - [ ] Pages vues + - [ ] Temps de lecture + - [ ] Interactions clés +- [ ] Monitoring technique + - [ ] Logs d'erreurs + - [ ] Métriques de performance + - [ ] Alertes + +### 🔄 Intégration Continue + +- [ ] Tests automatisés + - [ ] Tests unitaires + - [ ] Tests d'intégration + - [ ] Tests E2E +- [ ] Pipeline CI/CD + - [ ] Build et tests + - [ ] Déploiement automatique + - [ ] Environnements de staging diff --git a/docs/refacto.md b/docs/refacto.md new file mode 100644 index 0000000..4b1db15 --- /dev/null +++ b/docs/refacto.md @@ -0,0 +1,148 @@ +# Propositions de Refactorisation + +## Renforcement de l'Authentification + +### 1. Sécurité des Tokens + +#### État Actuel + +- Utilisation de cookies simples pour stocker les informations utilisateur +- Validation basique des données utilisateur +- Pas de gestion de session sophistiquée + +#### Améliorations Proposées + +1. **Tokens JWT** + + - Implémenter des JWT (JSON Web Tokens) pour l'authentification + - Ajouter des claims essentiels (exp, iat, sub, jti) + - Utiliser une rotation des clés de signature + - Implémenter un refresh token avec une durée de vie plus longue + +2. **Sécurité des Cookies** + + - Ajouter les flags de sécurité : `HttpOnly`, `Secure`, `SameSite=Strict` + - Implémenter une stratégie de rotation des cookies + - Chiffrer les données sensibles dans les cookies + +3. **Gestion des Sessions** + - Implémenter une table de sessions en base de données + - Ajouter une détection des connexions simultanées + - Permettre la révocation des sessions + - Ajouter un système de "Se souvenir de moi" sécurisé + +### 2. Protection Contre les Attaques + +1. **Rate Limiting** + + - Implémenter un rate limiting par IP pour les routes d'authentification + - Ajouter un délai progressif après des tentatives échouées + - Mettre en place un système de bannissement temporaire + +2. **Protection Contre les Attaques Courantes** + + - Ajouter une protection CSRF avec des tokens + - Implémenter une protection contre le timing attacks + - Ajouter une validation stricte des entrées + - Protection contre les attaques par force brute + +3. **Validation et Sanitization** + - Utiliser Zod pour la validation des données + - Implémenter une sanitization stricte des entrées + - Valider les en-têtes HTTP sensibles + +### 3. Améliorations du Processus d'Authentification + +1. **Multi-Factor Authentication (MFA)** + + - Ajouter support pour l'authentification à deux facteurs + - Implémenter TOTP (Google Authenticator) + - Ajouter support pour les clés de sécurité (WebAuthn) + +2. **Gestion des Mots de Passe** + + - Renforcer les règles de complexité des mots de passe + - Implémenter un système de réinitialisation sécurisé + - Ajouter une vérification des mots de passe compromis (via API HaveIBeenPwned) + +3. **Audit et Logging** + - Enregistrer toutes les tentatives de connexion + - Logger les actions sensibles + - Implémenter un système d'alerte pour les activités suspectes + +### 4. Middleware et Routes + +1. **Amélioration du Middleware** + +```typescript +import { NextResponse } from "next/server"; +import type { NextRequest } from "next/server"; +import { verifyToken } from "@/lib/jwt"; +import { rateLimit } from "@/lib/rateLimit"; + +export async function middleware(request: NextRequest) { + // Rate limiting + const rateLimitResult = await rateLimit(request); + if (!rateLimitResult.success) { + return NextResponse.json({ error: "Trop de requêtes" }, { status: 429 }); + } + + // Vérification du token + const token = request.cookies.get("auth-token"); + if (!token) { + return handleUnauthorized(request); + } + + try { + const verified = await verifyToken(token.value); + if (!verified.valid) { + return handleUnauthorized(request); + } + + // Ajouter les informations utilisateur à la requête + const requestHeaders = new Headers(request.headers); + requestHeaders.set("x-user-id", verified.userId); + requestHeaders.set("x-user-roles", verified.roles.join(",")); + + // Vérifier les permissions + if (!hasRequiredPermissions(verified, request.nextUrl.pathname)) { + return NextResponse.json({ error: "Accès non autorisé" }, { status: 403 }); + } + + return NextResponse.next({ + headers: requestHeaders, + }); + } catch (error) { + return handleUnauthorized(request); + } +} + +function handleUnauthorized(request: NextRequest) { + if (request.nextUrl.pathname.startsWith("/api/")) { + return NextResponse.json({ error: "Non autorisé" }, { status: 401 }); + } + + const loginUrl = new URL("/login", request.url); + loginUrl.searchParams.set("from", request.nextUrl.pathname); + return NextResponse.redirect(loginUrl); +} +``` + +### 5. Prochaines Étapes + +1. **Phase 1 - Sécurité Immédiate** + + - Implémenter les JWT et la sécurité des cookies + - Ajouter le rate limiting + - Renforcer le middleware + +2. **Phase 2 - Fonctionnalités Avancées** + + - Implémenter le MFA + - Ajouter la gestion des sessions + - Mettre en place l'audit logging + +3. **Phase 3 - Monitoring et Maintenance** + - Implémenter un système de monitoring + - Mettre en place des alertes de sécurité + - Planifier des audits réguliers diff --git a/src/app/api/auth/register/route.ts b/src/app/api/auth/register/route.ts index f317ec8..632fe92 100644 --- a/src/app/api/auth/register/route.ts +++ b/src/app/api/auth/register/route.ts @@ -22,6 +22,17 @@ export async function POST(request: Request) { { status: 400 } ); } + if (error instanceof Error && error.message === "PASSWORD_NOT_STRONG") { + return NextResponse.json( + { + error: { + code: "PASSWORD_NOT_STRONG", + message: "Le mot de passe est trop faible", + }, + }, + { status: 400 } + ); + } throw error; } } catch (error) { diff --git a/src/lib/services/auth-server.service.ts b/src/lib/services/auth-server.service.ts index 185dde0..34d8a03 100644 --- a/src/lib/services/auth-server.service.ts +++ b/src/lib/services/auth-server.service.ts @@ -13,6 +13,11 @@ export class AuthServerService { static async createUser(email: string, password: string): Promise { await connectDB(); + //check if password is strong + if (!AuthServerService.isPasswordStrong(password)) { + throw new Error("PASSWORD_NOT_STRONG"); + } + // Check if user already exists const existingUser = await UserModel.findOne({ email: email.toLowerCase() }); if (existingUser) { @@ -36,6 +41,22 @@ export class AuthServerService { return userData; } + static isPasswordStrong(password: string): boolean { + //check if password is strong + if (password.length < 8) { + return false; + } + if (!/[A-Z]/.test(password)) { + return false; + } + if (!/[0-9]/.test(password)) { + return false; + } + if (!/[!@#$%^&*]/.test(password)) { + return false; + } + return true; + } static setUserCookie(userData: UserData): void { // Encode user data in base64