diff --git a/menu_extension/background.js b/menu_extension/background.js
index 2c13d9651ffc0f112c557d5aa77f49a451d08740..88538aa4409de3f11f4a7986afb6969a6063fe7a 100644
--- a/menu_extension/background.js
+++ b/menu_extension/background.js
@@ -3,10 +3,19 @@ let areStatsActive = false;
 
 console.log("ff2BaLex est chargé.");
 
+// === 1. Installation de l'extension ===
 browser.runtime.onInstalled.addListener(() => {
   console.log("ff2BaLex est installé.");
+
+  // Création d'un bouton unique de connexion/déconnexion
+  browser.contextMenus.create({
+    id: "toggle_connection",
+    title: "Se connecter à la base lexicale",
+    contexts: ["all"]
+  });
 });
 
+// === 2. Suivi des changements de paramètres ===
 browser.storage.onChanged.addListener((changes) => {
   if (changes.extensionActive) {
     isExtensionActive = changes.extensionActive.newValue;
@@ -18,3 +27,96 @@ browser.storage.onChanged.addListener((changes) => {
     console.log("Statistiques activées :", areStatsActive);
   }
 });
+
+// === 3. Gestion des messages provenant du bouton Connexion/Déconnexion ===
+browser.runtime.onMessage.addListener(async (message) => {
+  if (message.action === "toggleConnection") {
+    const isConnected = await isUserConnected();
+    if (isConnected) {
+      disconnectFromLexicalDB();
+    } else {
+      openLoginPage();
+    }
+  }
+});
+
+// === 4. Ouvrir la page de connexion Prisms ===
+function openLoginPage() {
+  const authUrl = "https://prisms.lezinter.net/fr/login";
+  browser.tabs.create({ url: authUrl });
+}
+
+// === 5. Suivi du parcours de connexion et récupération du token ===
+browser.webNavigation.onCompleted.addListener(async (details) => {
+  const url = new URL(details.url);
+
+  // Si connecté, rediriger vers la page BaLex dans Prisms
+  if (url.hostname === "prisms.lezinter.net" && url.pathname === "/fr/login") {
+    console.log("Connecté à Prisms, veuillez cliquer sur 'Se connecter avec BaLex'...");
+  }
+
+  // Une fois sur la page du tableau de bord BaLex, récupérer le token
+  if (url.hostname === "prisms.lezinter.net" && url.pathname === "/fr/headquarters/balex") {
+    console.log("Tentative de récupération du token depuis Prisms...");
+
+    try {
+      await new Promise(resolve => setTimeout(resolve, 3000));  // Pause pour chargement complet
+      await browser.tabs.executeScript(details.tabId, {
+        code: `
+          (function() {
+            const tokenElement = document.getElementById("accesToken");
+            console.log("Token détecté :", tokenElement ? tokenElement.innerText : "Non trouvé");
+            return tokenElement ? tokenElement.innerText.trim() : null;
+          })();
+        `
+      }).then(async (results) => {
+        const token = results[0];
+        if (token) {
+          await browser.storage.local.set({ accessToken: token });
+          console.log("Token récupéré et stocké :", token);
+          alert("Connexion réussie !");
+          updateContextMenu();
+        } else {
+          console.error("Token non trouvé sur la page Prisms.");
+        }
+      });
+    } catch (error) {
+      console.error("Erreur lors de la récupération du token :", error);
+    }
+  }
+}, { url: [{ hostContains: "prisms.lezinter.net" }] });
+
+// === 6. Déconnexion ===
+async function disconnectFromLexicalDB() {
+  await browser.storage.local.remove("accessToken");
+  console.log("Token supprimé, déconnexion réussie.");
+  alert("Déconnexion réussie.");
+  updateContextMenu();
+}
+
+// === 7. Vérifier si l'utilisateur est connecté ===
+async function isUserConnected() {
+  const result = await browser.storage.local.get("accessToken");
+  return result.accessToken !== undefined;
+}
+
+// === 8. Mise à jour dynamique du menu contextuel ===
+browser.runtime.onStartup.addListener(() => {
+  updateContextMenu();
+});
+
+async function updateContextMenu() {
+  const isConnected = await isUserConnected();
+  browser.contextMenus.update("toggle_connection", {
+    title: isConnected ? "Se déconnecter de la base lexicale" : "Se connecter à la base lexicale"
+  });
+}
+
+// === 9. Rafraîchissement périodique du token (désactivé) ===
+function refreshToken() {
+  console.warn("Aucune API de rafraîchissement disponible. Rafraîchissement désactivé.");
+}
+
+setInterval(() => {
+  refreshToken();
+}, 15 * 60 * 1000); // Désactivé faute d'API de rafraîchissement
diff --git a/menu_extension/login.html b/menu_extension/login.html
new file mode 100644
index 0000000000000000000000000000000000000000..1f537473fb5d30a313f9da4f237993aa9450cdd5
--- /dev/null
+++ b/menu_extension/login.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<html lang="fr">
+<head>
+  <meta charset="UTF-8">
+  <title>Connexion à BaLex</title>
+  <style>
+    body {
+      background-color: #323046;
+      color: white;
+      font-family: Arial, sans-serif;
+      text-align: center;
+      padding-top: 50px;
+    }
+    input {
+      width: 80%;
+      padding: 10px;
+      margin: 10px 0;
+    }
+    button {
+      padding: 10px 20px;
+      background-color: #94608a;
+      color: white;
+      border: none;
+      cursor: pointer;
+    }
+  </style>
+</head>
+<body>
+  <h2>Connexion à BaLex</h2>
+  <input type="text" id="username" placeholder="Nom d'utilisateur"><br>
+  <input type="password" id="password" placeholder="Mot de passe"><br>
+  <button id="loginButton">Se connecter</button>
+
+  <script src="login.js"></script>
+</body>
+</html>
diff --git a/menu_extension/login.js b/menu_extension/login.js
new file mode 100644
index 0000000000000000000000000000000000000000..04a877695d80c75da55a033587f2aac5bfc3cf7c
--- /dev/null
+++ b/menu_extension/login.js
@@ -0,0 +1,36 @@
+document.getElementById('loginButton').addEventListener('click', async () => {
+    const username = document.getElementById('username').value;
+    const password = document.getElementById('password').value;
+  
+    if (username && password) {
+      const apiUrl = "https://babalex.lezinter.net/login";
+  
+      try {
+        const response = await fetch(apiUrl, {
+          method: "POST",
+          headers: {
+            "Content-Type": "application/json"
+          },
+          body: JSON.stringify({ username, password })
+        });
+  
+        const data = await response.json();
+        if (data.accessToken && data.refreshToken) {
+          await browser.storage.local.set({
+            accessToken: data.accessToken,
+            refreshToken: data.refreshToken
+          });
+          alert("Connexion réussie !");
+          window.close();  // Ferme la fenêtre de connexion
+        } else {
+          alert("Identifiants incorrects.");
+        }
+      } catch (error) {
+        console.error("Erreur lors de la connexion :", error);
+        alert("Erreur de connexion.");
+      }
+    } else {
+      alert("Veuillez remplir tous les champs.");
+    }
+  });
+  
\ No newline at end of file
diff --git a/menu_extension/manifest.json b/menu_extension/manifest.json
index 1f8ec330a09670f0b0266e6bcf67e311e7dd2a91..02bfc7d08d08c90b2a5018a2f7b13bff88c747f3 100644
--- a/menu_extension/manifest.json
+++ b/menu_extension/manifest.json
@@ -3,7 +3,15 @@
   "name": "ff2BaLex",
   "version": "1.0",
   "description": "Extension Firefox avec paramètres personnalisés.",
-  "permissions": ["storage", "activeTab"],
+  "permissions": [
+  "storage",
+  "activeTab",
+  "tabs",
+  "contextMenus",
+  "webNavigation",
+  "scripting",
+  "*://babalex.lezinter.net/*",
+  "*://prisms.lezinter.net/*"],
   "background": {
     "scripts": ["background.js"],
     "persistent": true
@@ -20,5 +28,6 @@
       "128": "icon-128.png"
     },
     "default_title": "ff2BaLex"
-  }
+  },
+  "web_accessible_resources": ["login.html"]
 }
diff --git a/menu_extension/options.js b/menu_extension/options.js
index e80617fb5ca83a8a6b9919124fe95147d4dbf3aa..cbfd4cfcb2274d8f74445918a52f9184b23e093a 100644
--- a/menu_extension/options.js
+++ b/menu_extension/options.js
@@ -1,18 +1,23 @@
-document.getElementById("connectBtn").addEventListener("click", () => {
-    alert("Fonctionnalité de connexion non encore implémentée.");
-  });
-  
-  document.getElementById("toggleExtensionBtn").addEventListener("click", async () => {
-    const { extensionActive } = await browser.storage.local.get("extensionActive");
-    const newState = !extensionActive;
-    await browser.storage.local.set({ extensionActive: newState });
-    alert(`Extension ${newState ? "activée" : "désactivée"}.`);
-  });
-  
-  document.getElementById("toggleStatsBtn").addEventListener("click", async () => {
-    const { statsActive } = await browser.storage.local.get("statsActive");
-    const newState = !statsActive;
-    await browser.storage.local.set({ statsActive: newState });
-    alert(`Statistiques ${newState ? "activées" : "désactivées"}.`);
-  });
+document.getElementById('connectBtn').addEventListener('click', () => {
+  browser.runtime.sendMessage({ action: "openLoginPage" });
+});
+
+document.getElementById('disconnectBtn').addEventListener('click', async () => {
+  await browser.storage.local.remove(["accessToken", "refreshToken"]);
+  alert("Déconnexion réussie.");
+});
   
+document.getElementById("toggleExtensionBtn").addEventListener("click", async () => {
+  const { extensionActive } = await browser.storage.local.get("extensionActive");
+  const newState = !extensionActive;
+  await browser.storage.local.set({ extensionActive: newState });
+  alert(`Extension ${newState ? "activée" : "désactivée"}.`);
+});
+
+document.getElementById("toggleStatsBtn").addEventListener("click", async () => {
+  const { statsActive } = await browser.storage.local.get("statsActive");
+  const newState = !statsActive;
+  await browser.storage.local.set({ statsActive: newState });
+  alert(`Statistiques ${newState ? "activées" : "désactivées"}.`);
+});
+
diff --git a/menu_extension/popup.js b/menu_extension/popup.js
index e80617fb5ca83a8a6b9919124fe95147d4dbf3aa..458e207b3e38b0c452426cdee2e3f93100c03ec4 100644
--- a/menu_extension/popup.js
+++ b/menu_extension/popup.js
@@ -1,18 +1,58 @@
+// === 1. Gestion du bouton unique Connexion/Déconnexion ===
+async function updateConnectionButton() {
+  const { accessToken } = await browser.storage.local.get("accessToken");
+  const button = document.getElementById("connectBtn");
+
+  button.textContent = accessToken ? "Se déconnecter" : "Se connecter";
+}
+
+// Action au clic du bouton Connexion/Déconnexion
 document.getElementById("connectBtn").addEventListener("click", () => {
-    alert("Fonctionnalité de connexion non encore implémentée.");
-  });
-  
-  document.getElementById("toggleExtensionBtn").addEventListener("click", async () => {
-    const { extensionActive } = await browser.storage.local.get("extensionActive");
-    const newState = !extensionActive;
-    await browser.storage.local.set({ extensionActive: newState });
-    alert(`Extension ${newState ? "activée" : "désactivée"}.`);
-  });
-  
-  document.getElementById("toggleStatsBtn").addEventListener("click", async () => {
-    const { statsActive } = await browser.storage.local.get("statsActive");
-    const newState = !statsActive;
-    await browser.storage.local.set({ statsActive: newState });
-    alert(`Statistiques ${newState ? "activées" : "désactivées"}.`);
-  });
-  
+  console.log("Redirection vers la page de connexion...");
+  browser.runtime.sendMessage({ action: "connectToBaLex" });
+});
+
+browser.runtime.onMessage.addListener((message) => {
+  if (message.action === "tokenSaved") {
+    alert("Connexion réussie !");
+  }
+});
+
+// === 2. Activer/Désactiver l'extension ===
+document.getElementById("toggleExtensionBtn").addEventListener("click", async () => {
+  const { extensionActive } = await browser.storage.local.get("extensionActive");
+  const newState = !extensionActive;
+  await browser.storage.local.set({ extensionActive: newState });
+  alert(`Extension ${newState ? "activée" : "désactivée"}.`);
+});
+
+// === 3. Activer/Désactiver les statistiques ===
+document.getElementById("toggleStatsBtn").addEventListener("click", async () => {
+  const { statsActive } = await browser.storage.local.get("statsActive");
+  const newState = !statsActive;
+  await browser.storage.local.set({ statsActive: newState });
+  alert(`Statistiques ${newState ? "activées" : "désactivées"}.`);
+});
+
+// === 4. Mise à jour initiale du bouton Connexion/Déconnexion ===
+updateConnectionButton();
+
+// Vérification pour le bouton de connexion
+document.addEventListener("DOMContentLoaded", () => {
+  const connectBtn = document.getElementById("connectBtn");
+
+  if (connectBtn) {
+    connectBtn.addEventListener("click", async () => {
+      console.log("Clic détecté sur le bouton Connexion");
+      try {
+        await browser.runtime.sendMessage({ action: "toggleConnection" });
+        console.log("Message envoyé au background.");
+      } catch (error) {
+        console.error("Erreur lors de l'envoi du message :", error);
+      }
+    });
+  } else {
+    console.error("Le bouton de connexion n'a pas été trouvé.");
+  }
+});
+