Files
noteflow/middleware/auth.js
T
Claude 7a716dc17a Création complète de l'application NoteFlow - Notes & Todo List
Application web Dockerisée moderne avec:
- Backend Node.js + Express + SQLite
- Frontend HTML/CSS/JavaScript vanilla
- Authentification JWT + bcrypt
- Gestion des notes avec images et todos intégrés
- Sidebar todos globaux avec filtres
- Interface utilisateur fluide avec animations CSS
- Administration des utilisateurs
- Sécurité production-ready (Helmet, rate limiting, validation)
- Configuration Docker complète
- Documentation README détaillée

Stack technique:
- Node.js 20 Alpine
- SQLite3 avec indexes optimisés
- Multer pour upload d'images
- Winston pour logging
- Express-validator pour validation
- Architecture modulaire (routes, middleware, config)

Fonctionnalités:
- Notes: CRUD complet, recherche, images, todos intégrés
- Todos globaux: création, toggle, filtres, suppression
- Auth: JWT 24h, bcrypt 12 rounds
- Admin: gestion utilisateurs complète
- UI: masonry grid, modal animations, responsive

Configuration Docker:
- Healthcheck intégré
- Volumes persistants pour data et uploads
- Network nginx_default pour reverse proxy
- Variables d'environnement configurables

Prêt pour déploiement avec: docker-compose up -d
2025-11-11 09:36:32 +00:00

75 lines
1.9 KiB
JavaScript

// Middleware d'authentification JWT
const jwt = require('jsonwebtoken');
const logger = require('../config/logger');
const JWT_SECRET = process.env.JWT_SECRET || 'change_me_in_production_please_use_strong_secret';
if (JWT_SECRET === 'change_me_in_production_please_use_strong_secret' && process.env.NODE_ENV === 'production') {
logger.warn('⚠️ ATTENTION: JWT_SECRET par défaut utilisé en production! Changez-le immédiatement!');
}
/**
* Middleware pour vérifier le token JWT
*/
function authenticateToken(req, res, next) {
const authHeader = req.headers['authorization'];
const token = authHeader && authHeader.split(' ')[1]; // Format: "Bearer TOKEN"
if (!token) {
return res.status(401).json({ error: 'Token d\'authentification manquant' });
}
jwt.verify(token, JWT_SECRET, (err, user) => {
if (err) {
logger.warn(`Tentative d'accès avec token invalide: ${err.message}`);
return res.status(403).json({ error: 'Token invalide ou expiré' });
}
// Ajouter les informations utilisateur à la requête
req.user = user;
next();
});
}
/**
* Middleware pour vérifier que l'utilisateur est admin
*/
function requireAdmin(req, res, next) {
if (!req.user || !req.user.is_admin) {
logger.warn(`Tentative d'accès admin par utilisateur non autorisé: ${req.user?.username || 'unknown'}`);
return res.status(403).json({ error: 'Accès réservé aux administrateurs' });
}
next();
}
/**
* Générer un token JWT
*/
function generateToken(user) {
const payload = {
id: user.id,
username: user.username,
is_admin: user.is_admin
};
// Token valide pour 24 heures
return jwt.sign(payload, JWT_SECRET, { expiresIn: '24h' });
}
/**
* Vérifier un token JWT (sans middleware)
*/
function verifyToken(token) {
try {
return jwt.verify(token, JWT_SECRET);
} catch (err) {
return null;
}
}
module.exports = {
authenticateToken,
requireAdmin,
generateToken,
verifyToken
};