diff --git a/MCD.png b/MCD.png
new file mode 100644
index 0000000000000000000000000000000000000000..aaea7d9bfa73d7656dc306a42810c631ce4c8409
Binary files /dev/null and b/MCD.png differ
diff --git a/documentation.md b/documentation.md
index 9d969d674d199a07f47cd916771f076231f92422..f12b9923ff6c317945d5ce6ad8a63926360bf9c1 100644
--- a/documentation.md
+++ b/documentation.md
@@ -2,11 +2,28 @@
 
 ## Description Générale
 
-CampusTalk est une application WEB de réseau social permettant aux utilisateurs de créer des fils de discussion, d'y poster des messages textuels, et de lire les messages des autres abonnés au même fil. L'application est développée en JEE (jakarta) avec une architecture MVC, et elle est conçue pour être responsive, fonctionnant aussi bien sur ordinateur que sur smartphone.
+CampusTalk est une application web qui permet aux utilisateurs de créer et de participer à des fils de discussion, pour partager des informations et collaborer sur divers sujets. Tous les fils sont ouverts à tous les utilisateurs pour favoriser la transparence et l'inclusion, où chacun peut librement contribuer, apprendre et s'engager dans des conversations.
+
+Fonctionnalités Clés :
+
+    Création de Fils de Discussion : Les utilisateurs peuvent créer des discussions sur des sujets variés, allant des projets académiques aux événements sociaux.
+    Publication de Messages : Possibilité de publier des messages textuels et d'y joindre des images pour enrichir les échanges.
+    Abonnement aux Fils : Les utilisateurs peuvent s'abonner à des fils spécifiques pour recevoir des notifications sur les nouvelles publications.
+    Interactions Sociales : Fonctionnalités de "like" pour exprimer son appréciation des messages et encourager les contributions positives.
+    Gestion des Utilisateurs : Inscription, authentification et gestion des paramètres de compte pour une expérience utilisateur personnalisée.
+
+Technologies Utilisées :
+
+    Jakarta EE
+    JSP (JavaServer Pages)
+    Base de Données Relationnelle
+    TailwindCSS
+
+CampusTalk est conçue pour être accessible et intuitive, avec une interface responsive qui s'adapte à tous les types d'appareils, garantissant ainsi une expérience utilisateur fluide sur ordinateur comme sur smartphone. En mettant l'accent sur la simplicité et l'efficacité.
 
 ## MCD
 
-A FAIRE
+![MCD](./MCD.png)
 
 ## MLD
 
diff --git a/sae/WEB-INF/src/controleur/Accueil.java b/sae/WEB-INF/src/controleur/Accueil.java
index 1524c2f3bcfe5c353fe7e94f3feff9e6bfe17497..0b9284109ff62e96141b435192c36a26d41dc9bd 100644
--- a/sae/WEB-INF/src/controleur/Accueil.java
+++ b/sae/WEB-INF/src/controleur/Accueil.java
@@ -13,10 +13,10 @@ import org.apache.commons.text.StringEscapeUtils;
 public class Accueil extends HttpServlet {
 
     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
-        if (request.getSession(false) == null || request.getSession().getAttribute("email") == null) {
-            response.sendRedirect(request.getContextPath() + "/login");
+        if (!Auth.checkLog(request, response)) {
             return;
         }
+
         HttpSession session = request.getSession();
         String email = StringEscapeUtils.escapeHtml4((String) session.getAttribute("email"));
         request.setAttribute("email", email);
diff --git a/sae/WEB-INF/src/controleur/Auth.java b/sae/WEB-INF/src/controleur/Auth.java
new file mode 100644
index 0000000000000000000000000000000000000000..e4301b73c671ddae621bb046b443151226af664c
--- /dev/null
+++ b/sae/WEB-INF/src/controleur/Auth.java
@@ -0,0 +1,39 @@
+package controleur;
+
+import jakarta.servlet.http.Cookie;
+import jakarta.servlet.http.HttpSession;
+import modele.UtilisateurDao;
+import java.io.IOException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+
+public class Auth {
+    public static boolean checkLog(HttpServletRequest request, HttpServletResponse response) throws IOException {
+        HttpSession session = request.getSession(false);
+        if (session == null || session.getAttribute("email") == null) {
+            Cookie[] cookies = request.getCookies();
+            if (cookies != null) {
+                for (Cookie cookie : cookies) {
+                    if ("token".equals(cookie.getName())) {
+                        String token = cookie.getValue();
+                        UtilisateurDao udao = new UtilisateurDao();
+                        if (udao.check(token)) {
+                            String email = udao.findEmailByToken(token);
+                            session = request.getSession(true);
+                            session.setAttribute("token", token);
+                            session.setAttribute("email", email);
+                            return true;
+                        }
+                    }
+                }
+            }
+        }
+
+        if (session == null || session.getAttribute("email") == null) {
+            response.sendRedirect(request.getContextPath() + "/login");
+            return false;
+        }
+
+        return true;
+    }
+}
diff --git a/sae/WEB-INF/src/controleur/CreerFil.java b/sae/WEB-INF/src/controleur/CreerFil.java
index 45e88ce3d98cf2884903cfb191a046de37ad2d90..e5d9fa6e9317fdd670bb11bfe5e62909f3e9dace 100644
--- a/sae/WEB-INF/src/controleur/CreerFil.java
+++ b/sae/WEB-INF/src/controleur/CreerFil.java
@@ -28,8 +28,7 @@ public class CreerFil extends HttpServlet {
 
     @Override
     protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
-        if (req.getSession(false) == null || req.getSession().getAttribute("email") == null) {
-            res.sendRedirect(req.getContextPath() + "/login");
+        if (!Auth.checkLog(req, res)) {
             return;
         }
         req.getRequestDispatcher("/WEB-INF/vue/creerFil.jsp").forward(req, res);
@@ -37,13 +36,12 @@ public class CreerFil extends HttpServlet {
 
     @Override
     protected void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException {
-        if (req.getSession(false) == null || req.getSession().getAttribute("email") == null) {
-            res.sendRedirect(req.getContextPath() + "/login");
+        if (!Auth.checkLog(req, res)) {
             return;
         }
         FilDeDiscussionDAO f = new FilDeDiscussionDAO();
         String nom = StringEscapeUtils.escapeHtml4(req.getParameter("nom"));
-        String createuremail = StringEscapeUtils.escapeHtml4(req.getParameter("createuremail"));
+        String createuremail = req.getSession().getAttribute("email").toString();
         String description = StringEscapeUtils.escapeHtml4(req.getParameter("description"));
         UtilisateurDao udao = new UtilisateurDao();
         if (!udao.emailExists(createuremail)) {
diff --git a/sae/WEB-INF/src/controleur/DeleteFil.java b/sae/WEB-INF/src/controleur/DeleteFil.java
index 08d5ac64711a08868ee3745c22bb276383fe8f82..0a192c15300ceb9a6e446f7a777dfa5641aa3a4d 100644
--- a/sae/WEB-INF/src/controleur/DeleteFil.java
+++ b/sae/WEB-INF/src/controleur/DeleteFil.java
@@ -13,8 +13,7 @@ import modele.FilDeDiscussionDAO;
 public class DeleteFil extends HttpServlet {
 
     public void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException {
-        if (req.getSession(false) == null || req.getSession().getAttribute("email") == null) {
-            res.sendRedirect(req.getContextPath() + "/login");
+        if (!Auth.checkLog(req, res)) {
             return;
         }
         int id = Integer.parseInt(req.getParameter("id"));
diff --git a/sae/WEB-INF/src/controleur/DeleteMessage.java b/sae/WEB-INF/src/controleur/DeleteMessage.java
index 74aa1e0bb3379a6398dd93f312aed4d52ae99788..d457cb74ab225d3efc32c9b7a4737f59eb5d2e95 100644
--- a/sae/WEB-INF/src/controleur/DeleteMessage.java
+++ b/sae/WEB-INF/src/controleur/DeleteMessage.java
@@ -12,16 +12,14 @@ import modele.MessageDao;
 @WebServlet("/deleteMessage")
 public class DeleteMessage extends HttpServlet {
     public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException {
-        if (req.getSession(false) == null || req.getSession().getAttribute("email") == null) {
-            res.sendRedirect(req.getContextPath() + "/login");
+        if (!Auth.checkLog(req, res)) {
             return;
         }
         req.getRequestDispatcher("/WEB-INF/vue/listeFil.jsp").forward(req, res);
     }
 
     public void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException {
-        if (req.getSession(false) == null || req.getSession().getAttribute("email") == null) {
-            res.sendRedirect(req.getContextPath() + "/login");
+        if (!Auth.checkLog(req, res)) {
             return;
         }
         String email = (String) req.getSession().getAttribute("email");
diff --git a/sae/WEB-INF/src/controleur/EnvoyerMessage.java b/sae/WEB-INF/src/controleur/EnvoyerMessage.java
index 8b67344b31f5ec907166b50aa7f0576a0377ec65..e5dac2cf86a4809cafdad57f409f34a70214dc38 100644
--- a/sae/WEB-INF/src/controleur/EnvoyerMessage.java
+++ b/sae/WEB-INF/src/controleur/EnvoyerMessage.java
@@ -25,16 +25,14 @@ public class EnvoyerMessage extends HttpServlet {
     private static final String UPLOAD_DIR = "uploads";
 
     public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException {
-        if (req.getSession(false) == null || req.getSession().getAttribute("email") == null) {
-            res.sendRedirect(req.getContextPath() + "/login");
+        if (!Auth.checkLog(req, res)) {
             return;
         }
         req.getRequestDispatcher("/WEB-INF/vue/listeFil.jsp").forward(req, res);
     }
 
     public void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException {
-        if (req.getSession(false) == null || req.getSession().getAttribute("email") == null) {
-            res.sendRedirect(req.getContextPath() + "/login");
+        if (!Auth.checkLog(req, res)) {
             return;
         }
         String email = (String) req.getSession().getAttribute("email"); // je pense que ça ne sert a rien d'utiliser StringEscapeUtils.escapeHtml4 sur l'email qui est en session et qui est censé être safe vu qu'on verifie au moment ou on le met en session
diff --git a/sae/WEB-INF/src/controleur/Fil.java b/sae/WEB-INF/src/controleur/Fil.java
index e53e86cd59a59aa426219f086d95f31c0c7c2433..4f65d34c0224f6ad947e10068edecdebc955adfc 100644
--- a/sae/WEB-INF/src/controleur/Fil.java
+++ b/sae/WEB-INF/src/controleur/Fil.java
@@ -11,8 +11,7 @@ import java.io.IOException;
 @WebServlet("/fil")
 public class Fil extends HttpServlet {
     public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException {
-        if (req.getSession(false) == null || req.getSession().getAttribute("email") == null) {
-            res.sendRedirect(req.getContextPath() + "/login");
+        if (!Auth.checkLog(req, res)) {
             return;
         }
         int id = Integer.parseInt(req.getParameter("id"));
diff --git a/sae/WEB-INF/src/controleur/GetFils.java b/sae/WEB-INF/src/controleur/GetFils.java
index 8ca4d2832e5dd7e99a5d7f599f71a6f13acc92f1..1834b0177c4cff0f5eca63c736b85d4589ae4bde 100644
--- a/sae/WEB-INF/src/controleur/GetFils.java
+++ b/sae/WEB-INF/src/controleur/GetFils.java
@@ -29,8 +29,7 @@ import modele.MessageDao;
 public class GetFils extends HttpServlet {
     @Override
     protected void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException {
-        if (req.getSession(false) == null || req.getSession().getAttribute("email") == null) {
-            res.sendRedirect(req.getContextPath() + "/login");
+        if (!Auth.checkLog(req, res)) {
             return;
         }
 
diff --git a/sae/WEB-INF/src/controleur/Like.java b/sae/WEB-INF/src/controleur/Like.java
index 113c195e50a3e65cde59325bd7908eb144f38cb2..b7c4dad6d5c66f536333ace96c73e34e9f97af38 100644
--- a/sae/WEB-INF/src/controleur/Like.java
+++ b/sae/WEB-INF/src/controleur/Like.java
@@ -15,8 +15,7 @@ public class Like extends HttpServlet {
 
     @Override
     protected void service(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException {
-        if (req.getSession(false) == null || req.getSession().getAttribute("email") == null) {
-            res.sendRedirect(req.getContextPath() + "/login");
+        if (!Auth.checkLog(req, res)) {
             return;
         }
 
diff --git a/sae/WEB-INF/src/controleur/ListerFil.java b/sae/WEB-INF/src/controleur/ListerFil.java
index e4564baf1eca89214f88eabccc73e5e4b1d51805..5e711fc60e8ff92f4727dbc8edad3f6b1215abd5 100644
--- a/sae/WEB-INF/src/controleur/ListerFil.java
+++ b/sae/WEB-INF/src/controleur/ListerFil.java
@@ -10,8 +10,7 @@ import java.io.IOException;
 @WebServlet("/listerFil")
 public class ListerFil extends HttpServlet {
     public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException {
-        if (req.getSession(false) == null || req.getSession().getAttribute("email") == null) {
-            res.sendRedirect(req.getContextPath() + "/login");
+        if (!Auth.checkLog(req, res)) {
             return;
         }
         req.getRequestDispatcher("/WEB-INF/vue/listerFil.jsp").forward(req, res);
diff --git a/sae/WEB-INF/src/controleur/Login.java b/sae/WEB-INF/src/controleur/Login.java
index 6b78a5a04e9cf8627175bbe07c2bd2b9bfd70e0b..7e31967dd1cb8132f51f3d86fd3afba6126fff04 100644
--- a/sae/WEB-INF/src/controleur/Login.java
+++ b/sae/WEB-INF/src/controleur/Login.java
@@ -4,10 +4,12 @@ import jakarta.servlet.annotation.WebServlet;
 import jakarta.servlet.http.HttpServlet;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.Cookie;
 import modele.UtilisateurDao;
 import jakarta.servlet.ServletException;
 import java.io.IOException;
 import org.apache.commons.text.StringEscapeUtils;
+import modele.GenerateToken;
 
 @WebServlet("/login")
 public class Login extends HttpServlet {
@@ -18,10 +20,17 @@ public class Login extends HttpServlet {
     public void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException {
         String email = StringEscapeUtils.escapeHtml4(req.getParameter("email"));
         String motdepasse = StringEscapeUtils.escapeHtml4(req.getParameter("motdepasse"));
+        String token = GenerateToken.generateToken(email, motdepasse);
         UtilisateurDao udao = new UtilisateurDao();
-        if (udao.check(email, motdepasse)) {
+        if (udao.check(token)) {
             System.out.println("Connexion réussie");
             req.getSession().setAttribute("email", email);
+
+            if ("on".equals(req.getParameter("remember"))) {
+                Cookie cookie = new Cookie("token", token);
+                cookie.setMaxAge(60 * 60 * 24 * 30); // 30 jours
+                res.addCookie(cookie);
+            }
             res.sendRedirect(req.getContextPath() + "/accueil");
         } else {
             System.out.println("Connexion échouée");
diff --git a/sae/WEB-INF/src/controleur/Logout.java b/sae/WEB-INF/src/controleur/Logout.java
index ad2c43fe4cf2883912a5bb78b2793e24fa392ee1..a6ebe8857dd0d3b09e8e3643da4edf1367a173d5 100644
--- a/sae/WEB-INF/src/controleur/Logout.java
+++ b/sae/WEB-INF/src/controleur/Logout.java
@@ -5,16 +5,26 @@ import jakarta.servlet.http.HttpServlet;
 import jakarta.servlet.http.HttpSession;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.Cookie;
 import jakarta.servlet.ServletException;
 import java.io.IOException;
 
 @WebServlet("/logout")
 public class Logout extends HttpServlet {
     public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException {
+        if (!Auth.checkLog(req, res)) {
+            return;
+        }
+
         HttpSession session = req.getSession(false);
         if (session != null) {
             session.invalidate();
         }
+
+        Cookie cookie = new Cookie("token", "");
+        cookie.setMaxAge(0);
+        res.addCookie(cookie);
+
         res.sendRedirect(req.getContextPath() + "/login");
     }
 }
diff --git a/sae/WEB-INF/src/controleur/MenuFil.java b/sae/WEB-INF/src/controleur/MenuFil.java
index bbd05d1261a746052cf498022eabdcfea5189aa2..592467f357fceee909ef55c162f81be7e9765d30 100644
--- a/sae/WEB-INF/src/controleur/MenuFil.java
+++ b/sae/WEB-INF/src/controleur/MenuFil.java
@@ -10,8 +10,7 @@ import java.io.IOException;
 @WebServlet("/menuFil")
 public class MenuFil extends HttpServlet {
     public void service(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException {
-        if (req.getSession(false) == null || req.getSession().getAttribute("email") == null) {
-            res.sendRedirect(req.getContextPath() + "/login");
+        if (!Auth.checkLog(req, res)) {
             return;
         }
         req.getRequestDispatcher("/WEB-INF/vue/menuFil.jsp").forward(req, res);
diff --git a/sae/WEB-INF/src/controleur/ModifierFil.java b/sae/WEB-INF/src/controleur/ModifierFil.java
index 9ae7d8e761876fbd7eb63baa290031752f027a80..c3598019d68c4d46cbc0b03b298a2a1bc9c6ca66 100644
--- a/sae/WEB-INF/src/controleur/ModifierFil.java
+++ b/sae/WEB-INF/src/controleur/ModifierFil.java
@@ -25,8 +25,7 @@ public class ModifierFil extends HttpServlet {
 
     @Override
     protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
-        if (req.getSession(false) == null || req.getSession().getAttribute("email") == null) {
-            res.sendRedirect(req.getContextPath() + "/login");
+        if (!Auth.checkLog(req, res)) {
             return;
         }
         if (req.getSession().getAttribute("idFil") == null) {
diff --git a/sae/WEB-INF/src/controleur/Parametre.java b/sae/WEB-INF/src/controleur/Parametre.java
index 90d984bd0956792c184c465a0e406ef17d1f5293..b78074038807c64050c7688d95d0ff6200b65c76 100644
--- a/sae/WEB-INF/src/controleur/Parametre.java
+++ b/sae/WEB-INF/src/controleur/Parametre.java
@@ -3,9 +3,11 @@ package controleur;
 import java.io.IOException;
 import jakarta.servlet.ServletException;
 import jakarta.servlet.annotation.WebServlet;
+import jakarta.servlet.http.Cookie;
 import jakarta.servlet.http.HttpServlet;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
+import modele.GenerateToken;
 import modele.Utilisateur;
 import modele.UtilisateurDao;
 import org.apache.commons.text.StringEscapeUtils;
@@ -15,8 +17,7 @@ public class Parametre extends HttpServlet {
 
     @Override
     protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
-        if (req.getSession(false) == null || req.getSession().getAttribute("email") == null) {
-            res.sendRedirect(req.getContextPath() + "/login");
+        if (!Auth.checkLog(req, res)) {
             return;
         }
         req.getRequestDispatcher("/WEB-INF/vue/parametre.jsp").forward(req, res);
@@ -24,8 +25,7 @@ public class Parametre extends HttpServlet {
 
     @Override
     protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
-        if (req.getSession(false) == null || req.getSession().getAttribute("email") == null) {
-            res.sendRedirect(req.getContextPath() + "/login");
+        if (!Auth.checkLog(req, res)) {
             return;
         }
 
@@ -50,6 +50,14 @@ public class Parametre extends HttpServlet {
 
         udao.update(utilisateur, email);
         req.getSession().setAttribute("email", newEmail);
+        Cookie[] cookies = req.getCookies();
+        for (Cookie cookie : cookies) {
+            if (cookie.getName().equals("token")) {
+                cookie.setValue(GenerateToken.generateToken(newEmail, motdepasse));
+                res.addCookie(cookie);
+                break;
+            }
+        }
         res.sendRedirect(req.getContextPath() + "/accueil");
     }
 }
diff --git a/sae/WEB-INF/src/controleur/Register.java b/sae/WEB-INF/src/controleur/Register.java
index 4506f6a55285d3dd8623d23d4324df3b48d2bd84..65ff985ef23e470830079f7811bae6b4cdab7e80 100644
--- a/sae/WEB-INF/src/controleur/Register.java
+++ b/sae/WEB-INF/src/controleur/Register.java
@@ -5,11 +5,13 @@ import jakarta.servlet.annotation.WebServlet;
 import jakarta.servlet.http.HttpServlet;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.Cookie;
 import jakarta.servlet.ServletException;
 import java.io.IOException;
 import modele.Utilisateur;
 import modele.UtilisateurDao;
 import org.apache.commons.text.StringEscapeUtils;
+import modele.GenerateToken;
 
 @WebServlet("/register")
 public class Register extends HttpServlet {
@@ -25,6 +27,8 @@ public class Register extends HttpServlet {
         String email = StringEscapeUtils.escapeHtml4(req.getParameter("email"));
         String motdepasse = StringEscapeUtils.escapeHtml4(req.getParameter("motdepasse"));
         String nom = StringEscapeUtils.escapeHtml4(req.getParameter("nom"));
+        String token = GenerateToken.generateToken(email, motdepasse);
+        System.out.println(token);
         if (udao.emailExists(email)) {
             req.setAttribute("error", "L'email est déjà utilisé.");
             req.getRequestDispatcher("/WEB-INF/vue/register.jsp").forward(req, res);
@@ -33,9 +37,17 @@ public class Register extends HttpServlet {
             nom,
             email,
             motdepasse,
-            LocalDateTime.now()
+            LocalDateTime.now(),
+            token
             ));
             req.getSession().setAttribute("email", email);
+
+            if ("on".equals(req.getParameter("remember"))) {
+                Cookie cookie = new Cookie("token", token);
+                cookie.setMaxAge(60 * 60 * 24 * 30);
+                res.addCookie(cookie);
+            }
+
             res.sendRedirect(req.getContextPath() + "/accueil");
         }
     }
diff --git a/sae/WEB-INF/src/controleur/SuivreFil.java b/sae/WEB-INF/src/controleur/SuivreFil.java
index 80db4396706fbb14407fd2fc5f9e5c8607876ff0..02bebd0b01ac7cb690744964e8f37a50d120d466 100644
--- a/sae/WEB-INF/src/controleur/SuivreFil.java
+++ b/sae/WEB-INF/src/controleur/SuivreFil.java
@@ -11,8 +11,7 @@ import java.io.IOException;
 @WebServlet("/suivreFil")
 public class SuivreFil extends HttpServlet {
     public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException {
-        if (req.getSession(false) == null || req.getSession().getAttribute("email") == null) {
-            res.sendRedirect(req.getContextPath() + "/login");
+        if (!Auth.checkLog(req, res)) {
             return;
         }
         int id = Integer.parseInt(req.getParameter("id"));
diff --git a/sae/WEB-INF/src/modele/GenerateToken.java b/sae/WEB-INF/src/modele/GenerateToken.java
new file mode 100644
index 0000000000000000000000000000000000000000..7171f08ccf9cd7ab5345b5537199ee990cbe131d
--- /dev/null
+++ b/sae/WEB-INF/src/modele/GenerateToken.java
@@ -0,0 +1,16 @@
+package modele;
+
+import java.util.Base64;
+
+public class GenerateToken {
+    public static String generateToken(String email, String password) {
+            String emailPwd = email + ":" + password;
+            String token = Base64.getEncoder().encodeToString(emailPwd.getBytes());
+            return token;
+    }
+
+    public static void main(String[] args) {
+        System.out.println("token :");
+        System.out.println(generateToken("utilisateur3@exemple.com", "motdepasse123"));
+    }
+}
\ No newline at end of file
diff --git a/sae/WEB-INF/src/modele/Utilisateur.java b/sae/WEB-INF/src/modele/Utilisateur.java
index 853c966701b9c48de81e8f700bc0fcff67e9e527..1f09127054e6f7b94781f138e2f580f9a4bacd4d 100644
--- a/sae/WEB-INF/src/modele/Utilisateur.java
+++ b/sae/WEB-INF/src/modele/Utilisateur.java
@@ -7,15 +7,17 @@ public class Utilisateur {
     private String email;
     private String motDePasse; // HASH
     private LocalDateTime dateInscription;
+    String token;
 
     public Utilisateur() {
     }
 
-    public Utilisateur(String nom, String email, String motDePasse, LocalDateTime dateInscription) {
+    public Utilisateur(String nom, String email, String motDePasse, LocalDateTime dateInscription, String token) {
         this.nom = nom;
         this.email = email;
         this.motDePasse = motDePasse;
         this.dateInscription = dateInscription;
+        this.token = token;
     }
 
     public String getNom() {
@@ -50,6 +52,14 @@ public class Utilisateur {
         this.dateInscription = dateInscription;
     }
 
+    public String getToken() {
+        return token;
+    }
+
+    public void setToken(String token) {
+        this.token = token;
+    }
+
     @Override
     public String toString() {
         return "Utilisateur [dateInscription=" + dateInscription + ", email=" + email + ", nom=" + nom + "]";
diff --git a/sae/WEB-INF/src/modele/UtilisateurDao.java b/sae/WEB-INF/src/modele/UtilisateurDao.java
index bd5592f4c3f214bee6996cf11b371b44f65b28d7..b1dcae5b0db1dab056c624d7894c65b7abfa9fc0 100644
--- a/sae/WEB-INF/src/modele/UtilisateurDao.java
+++ b/sae/WEB-INF/src/modele/UtilisateurDao.java
@@ -17,6 +17,7 @@ public class UtilisateurDao {
                 utilisateur.setEmail(rs.getString("email"));
                 utilisateur.setMotDePasse(rs.getString("motdepasse"));
                 utilisateur.setDateInscription(rs.getTimestamp("dateinscription").toLocalDateTime());
+                utilisateur.setToken(rs.getString("token"));
             } else {
                 System.out.println("Utilisateur inexistant");
             }
@@ -50,11 +51,14 @@ public class UtilisateurDao {
 
     public void update(Utilisateur utilisateur, String oldEmail) {
         try(Connection con = DS.instance.getConnection()) {
-            PreparedStatement ps = con.prepareStatement("UPDATE Utilisateur SET nom = ?, email = ?, motdepasse = MD5(?) WHERE email = ?");
+            PreparedStatement ps = con.prepareStatement("UPDATE Utilisateur SET nom = ?, email = ?, motdepasse = MD5(?), token = ? WHERE email = ?");
+            String newToken = GenerateToken.generateToken(utilisateur.getEmail(), utilisateur.getMotDePasse());
+            utilisateur.setToken(newToken);
             ps.setString(1, utilisateur.getNom());
             ps.setString(2, utilisateur.getEmail());
             ps.setString(3, utilisateur.getMotDePasse());
-            ps.setString(4, oldEmail);
+            ps.setString(4, utilisateur.getToken());
+            ps.setString(5, oldEmail);
             ps.executeUpdate();
         } catch (Exception e) {
             System.out.println(e.getMessage());
@@ -63,10 +67,11 @@ public class UtilisateurDao {
 
     public void insert(Utilisateur utilisateur) {
         try(Connection con = DS.instance.getConnection()) {
-            PreparedStatement ps = con.prepareStatement("INSERT INTO Utilisateur (nom, email, motdepasse) VALUES (?, ?, MD5(?))");
+            PreparedStatement ps = con.prepareStatement("INSERT INTO Utilisateur (nom, email, motdepasse, token) VALUES (?, ?, MD5(?), ?)");
             ps.setString(1, utilisateur.getNom());
             ps.setString(2, utilisateur.getEmail());
             ps.setString(3, utilisateur.getMotDePasse());
+            ps.setString(4, utilisateur.getToken());
             ps.executeUpdate();
         } catch (Exception e) {
             System.out.println(e.getMessage());
@@ -85,4 +90,30 @@ public class UtilisateurDao {
             return false;
         }
     }
+
+    public boolean check(String token) {
+        try(Connection con = DS.instance.getConnection()) {
+            PreparedStatement ps = con.prepareStatement("SELECT * FROM Utilisateur WHERE token = ?");
+            ps.setString(1, token);
+            ResultSet rs = ps.executeQuery();
+            return rs.next();
+        } catch (Exception e) {
+            System.out.println(e.getMessage());
+            return false;
+        }
+    }
+
+    public String findEmailByToken(String token) {
+        try(Connection con = DS.instance.getConnection()) {
+            PreparedStatement ps = con.prepareStatement("SELECT email FROM Utilisateur WHERE token = ?");
+            ps.setString(1, token);
+            ResultSet rs = ps.executeQuery();
+            if (rs.next()) {
+                return rs.getString("email");
+            }
+        } catch (Exception e) {
+            System.out.println(e.getMessage());
+        }
+        return null;
+    }
 }
diff --git a/sae/WEB-INF/vue/creerFil.jsp b/sae/WEB-INF/vue/creerFil.jsp
index 7a6faf0e58cd7243b9f6be93d70cff4ffad6ca7a..ebce9fa1462387fa8331e145177edcd4ba33f6ee 100644
--- a/sae/WEB-INF/vue/creerFil.jsp
+++ b/sae/WEB-INF/vue/creerFil.jsp
@@ -59,10 +59,6 @@
                     <label for="nom" class="block text-gray-300 font-semibold">Nom du fil:</label>
                     <input type="text" class="w-full p-3 border border-gray-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-400 bg-gray-700 text-white" id="nom" name="nom" required>
                 </div>
-                <div class="mb-4">
-                    <label for="createuremail" class="block text-gray-300 font-semibold">Email du créateur:</label>
-                    <input type="email" class="w-full p-3 border border-gray-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-400 bg-gray-700 text-white" id="createuremail" name="createuremail" required>
-                </div>
                 <div class="mb-4">
                     <label for="description" class="block text-gray-300 font-semibold">Description:</label>
                     <textarea class="w-full p-3 border border-gray-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-400 bg-gray-700 text-white" id="description" name="description" rows="3" required></textarea>
diff --git a/sae/WEB-INF/vue/login.jsp b/sae/WEB-INF/vue/login.jsp
index ab796dd99404c92c974cbff88fd1834659ec3c94..ed1fe4d369466383163e9e8f6eebac80b4f6a29d 100644
--- a/sae/WEB-INF/vue/login.jsp
+++ b/sae/WEB-INF/vue/login.jsp
@@ -48,6 +48,12 @@
                     <label for="motdepasse" class="block text-gray-300 font-semibold">Mot de passe</label>
                     <input type="password" class="w-full p-3 border border-gray-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-400 bg-gray-700 text-white" name="motdepasse" id="motdepasse" placeholder="Entrez votre mot de passe" required>
                 </div>
+
+                <div class="mb-4">
+                    <input type="checkbox" name="remember" id="remember" class="mr-2">
+                    <label for="remember" class="text-gray-300">Se souvenir de moi</label>
+                </div>
+                
                 <button type="submit" class="bg-blue-500 text-white px-4 py-2 rounded-lg shadow-md hover:bg-blue-600 transition-colors w-full">Se connecter</button>
             </form>
             <div class="text-center mt-3">
diff --git a/sae/WEB-INF/vue/parametre.jsp b/sae/WEB-INF/vue/parametre.jsp
index 1d59232fa21a6049667ec65bbbc2695be14f053d..f9606b163a8467aa324ceb204d1742406f2bfa05 100644
--- a/sae/WEB-INF/vue/parametre.jsp
+++ b/sae/WEB-INF/vue/parametre.jsp
@@ -69,8 +69,8 @@
                     <input type="email" class="w-full p-3 border border-gray-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-400 bg-gray-700 text-white" name="email" id="email" value="<%= utilisateur.getEmail() %>" required>
                 </div>
                 <div class="mb-4">
-                    <label for="motdepasse" class="block text-gray-300 font-semibold">Nouveau mot de passe</label>
-                    <input type="password" class="w-full p-3 border border-gray-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-400 bg-gray-700 text-white" name="motdepasse" id="motdepasse" placeholder="Laissez vide pour ne pas changer">
+                    <label for="motdepasse" class="block text-gray-300 font-semibold">Mot de passe (ou nouveau mot de passe)</label>
+                    <input type="password" class="w-full p-3 border border-gray-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-400 bg-gray-700 text-white" name="motdepasse" id="motdepasse" placeholder="Laissez vide pour ne pas changer" required>
                 </div>
                 <button type="submit" class="bg-blue-500 text-white px-4 py-2 rounded-lg shadow-md hover:bg-blue-600 transition-colors w-full">Sauvegarder</button>
             </form>
diff --git a/sae/WEB-INF/vue/register.jsp b/sae/WEB-INF/vue/register.jsp
index a21a7b4a1a6018f9c5e620c757093703a38c6fc9..0ab1eb96f3cc0c1a0ad2b6e0ab90f7e878c62e85 100644
--- a/sae/WEB-INF/vue/register.jsp
+++ b/sae/WEB-INF/vue/register.jsp
@@ -49,6 +49,10 @@
                     <label for="motdepasse" class="block text-gray-300 font-semibold">Mot de passe</label>
                     <input type="password" class="w-full p-3 border border-gray-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-400 bg-gray-700 text-white" name="motdepasse" id="motdepasse" placeholder="Choisissez un mot de passe" required>
                 </div>
+                <div class="mb-4">
+                    <input type="checkbox" name="remember" id="remember" class="mr-2">
+                    <label for="remember" class="text-gray-300">Se souvenir de moi</label>
+                </div>
                 <button type="submit" class="bg-blue-500 text-white px-4 py-2 rounded-lg shadow-md hover:bg-blue-600 transition-colors w-full">S'inscrire</button>
             </form>
             <div class="text-center mt-3">
diff --git a/script.sql b/script.sql
index f8cfeb3cce277168a30a686d17c1ca45d7226199..a47436d6f5ad0ab3eea279853528e41763819d7f 100644
--- a/script.sql
+++ b/script.sql
@@ -8,6 +8,7 @@ CREATE TABLE Utilisateur (
     nom VARCHAR(100) NOT NULL,
     motDePasse VARCHAR(255) NOT NULL,
     dateInscription TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+    token VARCHAR(255),
     CONSTRAINT pk_utilisateur PRIMARY KEY (email)
 );
 
@@ -50,11 +51,11 @@ CREATE TABLE Abonnement (
 );
 
 -- Insertion des utilisateurs
-INSERT INTO Utilisateur (email, nom, motDePasse)
+INSERT INTO Utilisateur (email, nom, motDePasse, token)
 VALUES 
-('utilisateur1@exemple.com', 'Utilisateur 1', MD5('motdepasse123')),
-('utilisateur2@exemple.com', 'Utilisateur 2', MD5('motdepasse123')),
-('utilisateur3@exemple.com', 'Utilisateur 3', MD5('motdepasse123'));
+('utilisateur1@exemple.com', 'Utilisateur 1', MD5('motdepasse123'), 'dXRpbGlzYXRldXIxQGV4ZW1wbGUuY29tOm1vdGRlcGFzc2UxMjM='),
+('utilisateur2@exemple.com', 'Utilisateur 2', MD5('motdepasse123'), 'dXRpbGlzYXRldXIyQGV4ZW1wbGUuY29tOm1vdGRlcGFzc2UxMjM='),
+('utilisateur3@exemple.com', 'Utilisateur 3', MD5('motdepasse123'), 'dXRpbGlzYXRldXIzQGV4ZW1wbGUuY29tOm1vdGRlcGFzc2UxMjM=');
 
 -- Insertion des fils de discussion
 INSERT INTO FilDeDiscussion (nom, createurEmail, description)