From 5307b1d53b8396d4d3eccc231fe4d37c8a08a5e3 Mon Sep 17 00:00:00 2001
From: Valentin <valentin.henriques@etu.univ-amu.fr>
Date: Sun, 10 Dec 2023 22:40:00 +0100
Subject: [PATCH] =?UTF-8?q?Mise=20en=20place=20d=C3=A9connection?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 db/database.db                    | Bin 20480 -> 24576 bytes
 index.js                          |   3 ++-
 migrations/001-db.sql             |   4 ++++
 src/routes/auth/authDisconnect.js |  22 ++++++++++++++++++++++
 src/routes/auth/authLogin.js      |   6 +-----
 src/routes/auth/authMiddleware.js |  15 ++++++---------
 src/routes/auth/authSignup.js     |   8 +-------
 7 files changed, 36 insertions(+), 22 deletions(-)
 create mode 100644 src/routes/auth/authDisconnect.js

diff --git a/db/database.db b/db/database.db
index 040e3be80b52c758fa2ceae725fca695716aebdf..ef9e61a81ab022667b3de14a2853a19442bd0565 100644
GIT binary patch
delta 490
zcmZozz}Rqrae}lU3j+fK8v_EcPSi0LXJODQTExr1z`)8gg@Hekub;P;=QYoijg4|V
z;i0T-;_B***(HfdIjNa>Wr;bNDe)!w*{OLb95&}5SH}=ng%C$4A6EqwDFqE)E(HYz
z1+XTC5Z8zhUM|heuX&`ISwb1OLN_*gb8&QQFtRfUPKn$+QR*tw<mWQH@&t_794EU>
ziGzuMB?JEl{*{{r4QBHvGcdR^u`-A@vX<nR<f|AZsTdll6oh0~>3dd|hniS8r+B7E
zW#$B0Mx};Slo&;(l?Ivyl)B|cdZy`_xdbJdX1fICm82(EhVwD9Fo=sMrsQVkfeBF1
zF!HA|@TYDTREXxUZ<JtUZZc1;^vXzbPtNqu^zsa?@-+0z^epzw3o=c1_B8X%E{F(o
z_OjGVt@JWXHVUis%qlSV%+1O6%*wA!3og%040ki|%*wCut8%RL%?dQ|&2laGarVkd
z^>EDe&vG^Pb@8n9b4fPw4RNy6Gbt|&4$m?&OAW{=kI+q#iT5q^cl9VYs|*d+P4tPV
R$~MhSHce0Q4+x3O2LMk;k+T2*

delta 413
zcmZoTz}T>Wae}lU8v_FaD+2<sOw=(JWn<7QTExr1z`(-unt?x(ub;P;=k;bmg>s(F
zuX&`ISvncGIyW}fb8&Q)FtRfUPA=RWD|MA=bDHctB|cWZ%MAP<_*d{J@=Nhu-Ylqa
zkgwjAm6buXk+meVBvZvGNyX4W#h}7BJs`+CIXu(CFgrgf#XsDnqD0Rl(9BTZ%f~Up
zFfcRGJhL>dRIk*a+||)7r68mvE7+9<VoYL5BGi}+FXxK9WMem@6h}SR(g;%%r!ptk
zQi~$XT+7^4H#Z|cf1hlBzxpt91M?&U3rqhhUrS4iU{_{{Ir$~|P;=6~b2I%56EiBk
z9TVLRgDkQvlKi9mE2<2W0@J<I3XIExvMdWqLV}WA!W_+#oV){zUGh`im{=La8(9-m
zax?Rw=2#SYq?@`{X1PSB`gnvGg}ND;W)}MEoA{Z!d3dCG2N%0Um8X_Qx)(%-I2wid
VTNoJx26(#jF|sg-i-XMp699n|bu0h?

diff --git a/index.js b/index.js
index 3a5cdd7..5ef99e5 100644
--- a/index.js
+++ b/index.js
@@ -24,7 +24,7 @@ import bcrypt from 'bcrypt';
 import authSignup from './src/routes/auth/authSignup.js';
 import authLogin from './src/routes/auth/authLogin.js';
 import authMiddleware from './src/routes/auth/authMiddleware.js';
-
+import authDisconnect from './src/routes/auth/authDisconnect.js';
 async function createDb() {
     if(fs.existsSync('./db/database.db') == false){
         const db = await open({
@@ -65,6 +65,7 @@ api.use(express.json());
 
 api.use('/auth/signup',authSignup);
 api.use('/auth/login',authLogin);
+api.use('/auth/disconnect', authDisconnect);
 
 api.use('/hello',authMiddleware,helloRoute);
 api.use('/monkey/deleteAll',monkeyDeletteAll);
diff --git a/migrations/001-db.sql b/migrations/001-db.sql
index 9e9552c..2424d4e 100644
--- a/migrations/001-db.sql
+++ b/migrations/001-db.sql
@@ -27,6 +27,10 @@ CREATE TABLE user (
     password VARCHAR(50) NOT NULL
 );
 
+CREATE TABLE invalid_token (
+    token TEXT
+);
+
 -- Insertion des données dans la table 'user'
 INSERT INTO user (id, username, password) VALUES
 (1, 'admin', 'admin');
diff --git a/src/routes/auth/authDisconnect.js b/src/routes/auth/authDisconnect.js
new file mode 100644
index 0000000..c73eda7
--- /dev/null
+++ b/src/routes/auth/authDisconnect.js
@@ -0,0 +1,22 @@
+import express from 'express';
+import bcrypt from 'bcrypt';
+import jwt from 'jsonwebtoken';
+import sqlite from 'better-sqlite3';
+import dotenv from 'dotenv';
+dotenv.config();
+
+const router = express.Router();
+
+export let blacklistedTokens = [];
+
+router.post('/', (req, res) => {
+    const db = new sqlite('./db/database.db');
+    const token = req.header('x-auth-token');
+    if (!token) {
+        return res.status(401).json({ msg: 'Aucun token, autorisation refusée' });
+    }
+    db.prepare('INSERT INTO invalid_token (token) VALUES (?)').run(token);
+    res.json({ msg: 'Déconnecté avec succès' });
+});
+
+export default router;
\ No newline at end of file
diff --git a/src/routes/auth/authLogin.js b/src/routes/auth/authLogin.js
index 2a358fc..df8cc48 100644
--- a/src/routes/auth/authLogin.js
+++ b/src/routes/auth/authLogin.js
@@ -11,22 +11,18 @@ router.post('/', async (req, res) => {
     try {
         const { username, password } = req.body;
 
-        // Ouvrez la base de données
         const db = new sqlite('./db/database.db');
 
-        // Vérifiez si l'utilisateur existe
         let user = db.prepare('SELECT * FROM user WHERE username = ?').get(username);
         if (!user) {
             return res.status(400).json({ msg: 'Cet utilisateur n\'existe pas' });
         }
 
-        // Vérifiez le mot de passe
         const isMatch = await bcrypt.compare(password, user.password);
         if (!isMatch) {
             return res.status(400).json({ msg: 'Mot de passe incorrect' });
         }
 
-        // Créez et renvoyez un token JWT
         const payload = {
             user: {
                 id: user.id
@@ -35,7 +31,7 @@ router.post('/', async (req, res) => {
 
         jwt.sign(
             payload,
-            process.env.JWT_SECRET, // Assurez-vous d'avoir défini cette variable d'environnement
+            process.env.JWT_SECRET,
             { expiresIn: 3600 },
             (err, token) => {
                 if (err) throw err;
diff --git a/src/routes/auth/authMiddleware.js b/src/routes/auth/authMiddleware.js
index ecd76ed..0bc4094 100644
--- a/src/routes/auth/authMiddleware.js
+++ b/src/routes/auth/authMiddleware.js
@@ -1,23 +1,20 @@
 import jwt from 'jsonwebtoken';
 import sqlite from 'better-sqlite3';
 
+
 const authMiddleware = (req, res, next) => {
-    // Récupérez le token du header de la requête
     const token = req.header('x-auth-token');
-
-    // Vérifiez si le token n'existe pas
+    const db = new sqlite('./db/database.db');
     if (!token) {
         return res.status(401).json({ msg: 'Aucun token, autorisation refusée' });
     }
-
-    // Vérifiez le token
+    let tokenExists = db.prepare('SELECT token FROM invalid_token WHERE token = ?').get(token);
+    if (tokenExists) {
+        return res.status(401).json({ msg: 'Token sur la liste noire, veuillez vous reconnecter' });
+    }
     try {
         const decoded = jwt.verify(token, process.env.JWT_SECRET);
 
-        // Ouvrez la base de données
-        const db = new sqlite('./db/database.db');
-
-        // Vérifiez si l'utilisateur existe
         let user = db.prepare('SELECT * FROM user WHERE id = ?').get(decoded.user.id);
         if (!user) {
             return res.status(401).json({ msg: 'Token non valide' });
diff --git a/src/routes/auth/authSignup.js b/src/routes/auth/authSignup.js
index 078a09f..7b4a865 100644
--- a/src/routes/auth/authSignup.js
+++ b/src/routes/auth/authSignup.js
@@ -11,26 +11,20 @@ router.post('/', async (req, res) => {
     try {
         const { username, password } = req.body;
 
-        // Ouvrez la base de données
         const db = new sqlite('./db/database.db');
 
-        // Vérifiez si l'utilisateur existe déjà
         let user = db.prepare('SELECT * FROM user WHERE username = ?').get(username);
         if (user) {
             return res.status(400).json({ msg: 'Cet utilisateur existe déjà' });
         }
 
-        // Hachez le mot de passe
         const salt = await bcrypt.genSalt(10);
         const hashedPassword = await bcrypt.hash(password, salt);
 
-        // Créez un nouvel utilisateur
         db.prepare('INSERT INTO user (username, password) VALUES (?, ?)').run(username, hashedPassword);
 
-        // Récupérez l'utilisateur de la base de données
         user = db.prepare('SELECT * FROM user WHERE username = ?').get(username);
 
-        // Créez et renvoyez un token JWT
         const payload = {
             user: {
                 id: user.id
@@ -39,7 +33,7 @@ router.post('/', async (req, res) => {
 
         jwt.sign(
             payload,
-            process.env.JWT_SECRET, // Assurez-vous d'avoir défini cette variable d'environnement
+            process.env.JWT_SECRET, 
             { expiresIn: 3600 },
             (err, token) => {
                 if (err) throw err;
-- 
GitLab