ExpressJS: Middleware
Un middleware est une fonction qui intercepte les requêtes HTTP reçue permettant de :
- Modifier la requête (req) reçu avant d'exécuter une fonction du controller
- Exécuter des vérifications (utilisateur connecté ...) avant d'exécuter une fonction du controller
- Exécuter des vérifications sur les attributs de la request reçue
- Sauvegarder des logs de navigation
routage.js
/*importer la bilbiothèque exprejss*/
const express = require('express')
/*Créer une instance du module Router */
let app = express.Router()
/*un middleware Globale qui intercepte toutes les route avec toutes méthodes http
Get /hello
Post /a/b/x
....
*/
app.use('/', function(req, res, next){
//toujour exéuté
console.log("save log"+req )
/*on peut faire des vérification sur l'objet req de type request:
if(req.body...) res.send("Erreur")
....
*/
//Si la vérification passe on laisse passé la requête vers le mapping route/methodeHTTP
next();
});
//example route
app.get('/okBien', function(req, res){
res.send('Traitment Faite aprés Le middleware');
});
/*1.Middleware : On peut spécifier aussi sur quelle route on active un middleware */
app.use('/user/:id', (req, res, next) => {
console.log('Request Type:', req.method)
next()
})
/*2.la route intercepté */
app.get('/user/:id', (req, res, next) => {
res.send('USER')
})
/*On peut appliquer une série de middleware sur la meme route */
app.use('/test/:id', (req, res, next) => {
console.log('Request URL:', req.originalUrl)
next()
}, (req, res, next) => {
console.log('Request Type:', req.method)
next()
})
//un middleware Globale sera active sur toutes routes et les methodes http
app.use((req, res, next) => {
console.log('Time:', Date.now())
next()
})
//la méthode http get mappé avec la route /
app.get('/', function (req, res) {
res.send('Afficher la listes des tests');
});
//.....
//n'importe quelle autre route
app.get('*', function(req, res){
res.send('404 route not found');
});
module.exports = app
module.exports = app
L'objet req
req est un objet de type httpRequest contenant les attributs suivants :
- req.baseUrl:la route qui envoie la requête
- req.body :les données envoyées reçues (formulaire)
- eq.params: Les données envoyées via les URL
- req.cookies : les cookies envoyés
- req.ip : l'adresse IP du client
- ....
Exemple2:Connexion
server.js
Exemple3:afficher le log de chaque Request
server.js
Créer un middleware :module
On peut créer un module contenant un ensemebles de fonctions qui joue le role d'un middleware
Exemple1
validateDataMiddleware.js
server.js
Exemple2
un middleware pour gérer l'authentification des utilisateurs. Le middleware va vérifier la présence d'un jeton d'authentification dans l'en-tête de la requête.
authMiddleware.js
server.js
Exemple3
Middlewares.js
//intercepter toutes les requêtes puis vérifier si les données envoyées sont codées sous forme de json
module.exports.fonction1 = () => {
return (req, res, next) => {
if (req.headers['content-type'] !== 'application/json') {
res.status(400).send('Server requires application/json')
} else {
next()
}
}
}
//...
Serveur.js
//importer expressjs
var express = require('express');
var app = express();
//tester la connexion
const middlewares = require('./Middlewares');
app.get('/testJson', middlewares.fonction1(), (req, res, next) => {
res.send('Bien Reçu');
});
//les routes
const test = require('./routage')
app.use('/tests',test)
//démarer le serveur sur le port 8081
app.listen(8081, function () {
console.log('Écoute du port 8081');
});
morgan Middleware
c'est quoi un middleware qui pemet d'intercepter les requetes http et générer un log pour toutes les routes et les apis comsomer
Installer morgan
Serveur.js
//importer expressjs
var express = require('express');
var app = express();
/*Importer le module*/
const morgan = require("morgan")
// appliquer le Middleware
app.use(morgan("common"))
//les routes
const test = require('./routage')
app.use('/tests',test)
//démarer le serveur sur le port 8081
app.listen(8081, function () {
console.log('Écoute du port 8081');
});
Middleware Helmet
helmet est un middleware qui permet de protéger une application ExpressJS contre les vulnérabilité connue de ExpressJS en cachant des informations du header
Installer Helmet
Serveur.js
//importer expressjs
var express = require('express');
var app = express();
// Morgan Middlewares
const helmet = require("helmet");
app.use(helmet());
/*Importer le module*/
const morgan = require("morgan")
// appliquer le Middleware
app.use(morgan("common"))
//les routes
const test = require('./routage')
app.use('/tests',test)
//démarer le serveur sur le port 8081
app.listen(8081, function () {
console.log('Écoute du port 8081');
});
Middleware Rate Limit
le middleware Rate Limit permet de limiter le nombre de requête pas adresse IP afin de sécuriser l'application entre les attacks DDos attack
Installer Helmet
Serveur.js
//importer expressjs
var express = require('express');
var app = express();
//express-rate-limit Middleware
const rateLimit = require("express-rate-limit");
const limiter = rateLimit({
windowMs: 1 * 60 * 1000, // durant chaque minute une adresse ip poura appeler (max) http requête dans le serveur
max: 5, // 5 requêtes http pour chaque windowMs
message: "Plusieurs requête from this ip"
});
/*On peut appliquer un limiter sur toutes les requêtes http*/
app.use(limiter);
/*On peut appliquer un limiter seulement sur une racine des routes*/
app.use("/apis/", limiter);
// Morgan Middleware
const helmet = require("helmet");
app.use(helmet());
/*Importer le module*/
const morgan = require("morgan")
// appliquer le Middleware
app.use(morgan("common"))
//les routes
const test = require('./routage')
app.use('/tests',test)
//démarer le serveur sur le port 8081
app.listen(8081, function () {
console.log('Écoute du port 8081');
});