feat(auth): password strongest + docs
This commit is contained in:
135
devbook.md
135
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] Bouton d'ajout/retrait des favoris
|
||||||
- [x] Menu dédié dans la sidebar avec la liste des séries favorites
|
- [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
|
- [ ] 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
|
- [ ] Filtres et tri avancés
|
||||||
- [ ] Recherche globale
|
- [ ] Recherche globale
|
||||||
- [ ] Bouton pour marquer comme lu
|
- [x] Bouton pour marquer comme lu
|
||||||
|
|
||||||
### 📖 Lecteur
|
### 📖 Lecteur
|
||||||
|
|
||||||
- [ ] Revue API thumbnail => thumbnails
|
- [x] Navigation entre les pages
|
||||||
- [ ] Thumbnails : prefetch en 2 secondes
|
- [x] Touches clavier (flèches, espace)
|
||||||
- [ ] Thumbnails : UI : barre de scroll plus grande
|
- [x] Swipe sur mobile
|
||||||
- [ ] Thumbnails : UI : scroll horizontal
|
- [x] Boutons de navigation
|
||||||
- [ ] Page fantome avant le lecteur
|
- [x] Mode double page
|
||||||
- [ ] switch to 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
|
### 📖 Lecture
|
||||||
|
|
||||||
- [ ] Téléchargement local des livres
|
- [x] Téléchargement local des livres
|
||||||
- [ ] Bouton de téléchargement
|
- [x] Bouton de téléchargement
|
||||||
- [ ] Gestion de la progression
|
- [x] Gestion de la progression
|
||||||
- [ ] Stockage local sécurisé
|
- [x] Stockage local sécurisé
|
||||||
- [ ] Bouton pour supprimer le téléchargement
|
- [x] Bouton pour supprimer le téléchargement
|
||||||
- [ ] Bouton pour supprimer tous les livres téléchargés dans les préférences
|
- [ ] Bouton pour supprimer tous les livres téléchargés dans les préférences
|
||||||
- [ ] Support de nouveaux formats
|
- [ ] Support de nouveaux formats
|
||||||
- [ ] EPUB
|
- [ ] EPUB
|
||||||
@@ -41,16 +54,15 @@ Application web moderne pour la lecture de BD/mangas/comics via un serveur Komga
|
|||||||
|
|
||||||
### 🔄 Cache et Performance
|
### 🔄 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
|
- [ ] Invalidation du cache sur les mutations
|
||||||
- [ ] Stratégie de revalidation à la demande
|
- [x] Stratégie de revalidation à la demande
|
||||||
- [ ] Prefetching intelligent
|
- [x] Prefetching intelligent
|
||||||
- [ ] Lazy loading amélioré
|
- [x] Lazy loading amélioré
|
||||||
- [ ] Préférences : pouvoir vider chaque cache indépendemment
|
|
||||||
|
|
||||||
### 👥 Gestion des utilisateurs
|
### 👥 Gestion des utilisateurs
|
||||||
|
|
||||||
- [ ] Système d'inscription
|
- [x] Système d'inscription
|
||||||
- [ ] Profil utilisateur enrichi
|
- [ ] Profil utilisateur enrichi
|
||||||
- [ ] Nom/Prénom
|
- [ ] Nom/Prénom
|
||||||
- [ ] Email
|
- [ ] Email
|
||||||
@@ -78,16 +90,16 @@ Application web moderne pour la lecture de BD/mangas/comics via un serveur Komga
|
|||||||
|
|
||||||
### 📝 Documentation
|
### 📝 Documentation
|
||||||
|
|
||||||
- [ ] README
|
- [x] README
|
||||||
- [ ] Installation
|
- [x] Installation
|
||||||
- [ ] Configuration
|
- [x] Configuration
|
||||||
- [ ] Development
|
- [x] Development
|
||||||
- [ ] Guide d'utilisation
|
- [ ] Guide d'utilisation
|
||||||
- [ ] Features
|
- [ ] Features
|
||||||
- [ ] Shortcuts
|
- [ ] Shortcuts
|
||||||
- [ ] Tips & tricks
|
- [ ] Tips & tricks
|
||||||
- [ ] Documentation API
|
- [x] Documentation API
|
||||||
- [ ] Endpoints
|
- [x] Endpoints
|
||||||
- [ ] Types
|
- [ ] Types
|
||||||
- [ ] Examples
|
- [ ] Examples
|
||||||
|
|
||||||
@@ -264,3 +276,76 @@ Application web moderne pour la lecture de BD/mangas/comics via un serveur Komga
|
|||||||
### Gestion des séries
|
### Gestion des séries
|
||||||
|
|
||||||
- [x] Système de favoris (ajout/retrait d'une série des favoris)
|
- [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
|
||||||
|
|||||||
148
docs/refacto.md
Normal file
148
docs/refacto.md
Normal file
@@ -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
|
||||||
@@ -22,6 +22,17 @@ export async function POST(request: Request) {
|
|||||||
{ status: 400 }
|
{ 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;
|
throw error;
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|||||||
@@ -13,6 +13,11 @@ export class AuthServerService {
|
|||||||
static async createUser(email: string, password: string): Promise<UserData> {
|
static async createUser(email: string, password: string): Promise<UserData> {
|
||||||
await connectDB();
|
await connectDB();
|
||||||
|
|
||||||
|
//check if password is strong
|
||||||
|
if (!AuthServerService.isPasswordStrong(password)) {
|
||||||
|
throw new Error("PASSWORD_NOT_STRONG");
|
||||||
|
}
|
||||||
|
|
||||||
// Check if user already exists
|
// Check if user already exists
|
||||||
const existingUser = await UserModel.findOne({ email: email.toLowerCase() });
|
const existingUser = await UserModel.findOne({ email: email.toLowerCase() });
|
||||||
if (existingUser) {
|
if (existingUser) {
|
||||||
@@ -36,6 +41,22 @@ export class AuthServerService {
|
|||||||
|
|
||||||
return userData;
|
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 {
|
static setUserCookie(userData: UserData): void {
|
||||||
// Encode user data in base64
|
// Encode user data in base64
|
||||||
|
|||||||
Reference in New Issue
Block a user