diff --git a/package-lock.json b/package-lock.json
index a54d4229fd133b652d2905634d72ddc8ecb6fd35..96e6adcf09b089e9ba17725ae10d01f0fd976ceb 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -8,6 +8,7 @@
       "version": "7.0.0-beta.44",
       "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz",
       "integrity": "sha512-cuAuTTIQ9RqcFRJ/Y8PvTh+paepNcaGxwQwjIDRWPXmzzyAeCO4KqS9ikMvq0MCbRk6GlYKwfzStrcP3/jSL8g==",
+      "dev": true,
       "requires": {
         "@babel/highlight": "7.0.0-beta.44"
       }
@@ -16,6 +17,7 @@
       "version": "7.0.0-beta.44",
       "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.0.0-beta.44.tgz",
       "integrity": "sha512-5xVb7hlhjGcdkKpMXgicAVgx8syK5VJz193k0i/0sLP6DzE6lRrU1K3B/rFefgdo9LPGMAOOOAWW4jycj07ShQ==",
+      "dev": true,
       "requires": {
         "@babel/types": "7.0.0-beta.44",
         "jsesc": "^2.5.1",
@@ -28,6 +30,7 @@
       "version": "7.0.0-beta.44",
       "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.44.tgz",
       "integrity": "sha512-MHRG2qZMKMFaBavX0LWpfZ2e+hLloT++N7rfM3DYOMUOGCD8cVjqZpwiL8a0bOX3IYcQev1ruciT0gdFFRTxzg==",
+      "dev": true,
       "requires": {
         "@babel/helper-get-function-arity": "7.0.0-beta.44",
         "@babel/template": "7.0.0-beta.44",
@@ -38,6 +41,7 @@
       "version": "7.0.0-beta.44",
       "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz",
       "integrity": "sha512-w0YjWVwrM2HwP6/H3sEgrSQdkCaxppqFeJtAnB23pRiJB5E/O9Yp7JAAeWBl+gGEgmBFinnTyOv2RN7rcSmMiw==",
+      "dev": true,
       "requires": {
         "@babel/types": "7.0.0-beta.44"
       }
@@ -46,6 +50,7 @@
       "version": "7.0.0-beta.44",
       "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz",
       "integrity": "sha512-aQ7QowtkgKKzPGf0j6u77kBMdUFVBKNHw2p/3HX/POt5/oz8ec5cs0GwlgM8Hz7ui5EwJnzyfRmkNF1Nx1N7aA==",
+      "dev": true,
       "requires": {
         "@babel/types": "7.0.0-beta.44"
       }
@@ -54,6 +59,7 @@
       "version": "7.0.0-beta.44",
       "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.44.tgz",
       "integrity": "sha512-Il19yJvy7vMFm8AVAh6OZzaFoAd0hbkeMZiX3P5HGD+z7dyI7RzndHB0dg6Urh/VAFfHtpOIzDUSxmY6coyZWQ==",
+      "dev": true,
       "requires": {
         "chalk": "^2.0.0",
         "esutils": "^2.0.2",
@@ -64,6 +70,7 @@
       "version": "7.0.0-beta.44",
       "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.44.tgz",
       "integrity": "sha512-w750Sloq0UNifLx1rUqwfbnC6uSUk0mfwwgGRfdLiaUzfAOiH0tHJE6ILQIUi3KYkjiCDTskoIsnfqZvWLBDng==",
+      "dev": true,
       "requires": {
         "@babel/code-frame": "7.0.0-beta.44",
         "@babel/types": "7.0.0-beta.44",
@@ -75,6 +82,7 @@
       "version": "7.0.0-beta.44",
       "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.44.tgz",
       "integrity": "sha512-UHuDz8ukQkJCDASKHf+oDt3FVUzFd+QYfuBIsiNu/4+/ix6pP/C+uQZJ6K1oEfbCMv/IKWbgDEh7fcsnIE5AtA==",
+      "dev": true,
       "requires": {
         "@babel/code-frame": "7.0.0-beta.44",
         "@babel/generator": "7.0.0-beta.44",
@@ -92,6 +100,7 @@
       "version": "7.0.0-beta.44",
       "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.44.tgz",
       "integrity": "sha512-5eTV4WRmqbaFM3v9gHAIljEQJU4Ssc6fxL61JN+Oe2ga/BwyjzjamwkCVVAQjHGuAX8i0BWo42dshL8eO5KfLQ==",
+      "dev": true,
       "requires": {
         "esutils": "^2.0.2",
         "lodash": "^4.2.0",
@@ -521,8 +530,7 @@
     "async": {
       "version": "1.5.2",
       "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
-      "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
-      "dev": true
+      "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo="
     },
     "async-each": {
       "version": "1.0.1",
@@ -630,6 +638,7 @@
       "version": "8.2.3",
       "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-8.2.3.tgz",
       "integrity": "sha512-0HeSTtaXg/Em7FCUWxwOT+KeFSO1O7LuRuzhk7g+1BjwdlQGlHq4OyMi3GqGxrNfEq8jEi6Hmt5ylEQUhurgiQ==",
+      "dev": true,
       "requires": {
         "@babel/code-frame": "7.0.0-beta.44",
         "@babel/traverse": "7.0.0-beta.44",
@@ -1444,7 +1453,8 @@
     "babylon": {
       "version": "7.0.0-beta.44",
       "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz",
-      "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g=="
+      "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==",
+      "dev": true
     },
     "backoff": {
       "version": "2.5.0",
@@ -1515,6 +1525,11 @@
       "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==",
       "dev": true
     },
+    "base64url": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/base64url/-/base64url-2.0.0.tgz",
+      "integrity": "sha1-6sFuA+oUOO/5Qj1puqNiYu0fcLs="
+    },
     "basic-auth": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.0.tgz",
@@ -1721,6 +1736,11 @@
         "isarray": "^1.0.0"
       }
     },
+    "buffer-equal-constant-time": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
+      "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk="
+    },
     "buffer-writer": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-1.0.1.tgz",
@@ -1879,6 +1899,7 @@
       "version": "2.4.1",
       "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
       "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+      "dev": true,
       "requires": {
         "ansi-styles": "^3.2.1",
         "escape-string-regexp": "^1.0.5",
@@ -2766,6 +2787,15 @@
         "stream-shift": "^1.0.0"
       }
     },
+    "ecdsa-sig-formatter": {
+      "version": "1.0.9",
+      "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.9.tgz",
+      "integrity": "sha1-S8kmJ07Dtau1AW5+HWCSGsJisqE=",
+      "requires": {
+        "base64url": "^2.0.0",
+        "safe-buffer": "^5.0.1"
+      }
+    },
     "editions": {
       "version": "1.3.4",
       "resolved": "https://registry.npmjs.org/editions/-/editions-1.3.4.tgz",
@@ -3129,6 +3159,7 @@
       "version": "3.7.1",
       "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz",
       "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=",
+      "dev": true,
       "requires": {
         "esrecurse": "^4.1.0",
         "estraverse": "^4.1.1"
@@ -3137,7 +3168,8 @@
     "eslint-visitor-keys": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz",
-      "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ=="
+      "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==",
+      "dev": true
     },
     "espree": {
       "version": "3.5.4",
@@ -3168,6 +3200,7 @@
       "version": "4.2.1",
       "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
       "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
+      "dev": true,
       "requires": {
         "estraverse": "^4.1.0"
       }
@@ -3175,7 +3208,8 @@
     "estraverse": {
       "version": "4.2.0",
       "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
-      "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM="
+      "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+      "dev": true
     },
     "esutils": {
       "version": "2.0.2",
@@ -3417,6 +3451,17 @@
         "raw-body": "^2.3.2"
       }
     },
+    "express-jwt": {
+      "version": "5.3.1",
+      "resolved": "https://registry.npmjs.org/express-jwt/-/express-jwt-5.3.1.tgz",
+      "integrity": "sha512-1C9RNq0wMp/JvsH/qZMlg3SIPvKu14YkZ4YYv7gJQ1Vq+Dv8LH9tLKenS5vMNth45gTlEUGx+ycp9IHIlaHP/g==",
+      "requires": {
+        "async": "^1.5.0",
+        "express-unless": "^0.3.0",
+        "jsonwebtoken": "^8.1.0",
+        "lodash.set": "^4.0.0"
+      }
+    },
     "express-session": {
       "version": "1.15.6",
       "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.15.6.tgz",
@@ -3443,6 +3488,11 @@
         }
       }
     },
+    "express-unless": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/express-unless/-/express-unless-0.3.1.tgz",
+      "integrity": "sha1-JVfBRudb65A+LSR/m1ugFFJpbiA="
+    },
     "extend": {
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
@@ -4595,7 +4645,8 @@
     "globals": {
       "version": "11.5.0",
       "resolved": "https://registry.npmjs.org/globals/-/globals-11.5.0.tgz",
-      "integrity": "sha512-hYyf+kI8dm3nORsiiXUQigOU62hDLfJ9G01uyGMxhc6BKsircrUhC4uJPQPUSuq2GrTmiiEt7ewxlMdBewfmKQ=="
+      "integrity": "sha512-hYyf+kI8dm3nORsiiXUQigOU62hDLfJ9G01uyGMxhc6BKsircrUhC4uJPQPUSuq2GrTmiiEt7ewxlMdBewfmKQ==",
+      "dev": true
     },
     "globby": {
       "version": "7.1.1",
@@ -5621,7 +5672,8 @@
     "jsesc": {
       "version": "2.5.1",
       "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.1.tgz",
-      "integrity": "sha1-5CGiqOINawgZ3yiQj3glJrlt0f4="
+      "integrity": "sha1-5CGiqOINawgZ3yiQj3glJrlt0f4=",
+      "dev": true
     },
     "json-buffer": {
       "version": "3.0.0",
@@ -5651,6 +5703,30 @@
       "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
       "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE="
     },
+    "jsonwebtoken": {
+      "version": "8.2.1",
+      "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.2.1.tgz",
+      "integrity": "sha512-l8rUBr0fqYYwPc8/ZGrue7GiW7vWdZtZqelxo4Sd5lMvuEeCK8/wS54sEo6tJhdZ6hqfutsj6COgC0d1XdbHGw==",
+      "requires": {
+        "jws": "^3.1.4",
+        "lodash.includes": "^4.3.0",
+        "lodash.isboolean": "^3.0.3",
+        "lodash.isinteger": "^4.0.4",
+        "lodash.isnumber": "^3.0.3",
+        "lodash.isplainobject": "^4.0.6",
+        "lodash.isstring": "^4.0.1",
+        "lodash.once": "^4.0.0",
+        "ms": "^2.1.1",
+        "xtend": "^4.0.1"
+      },
+      "dependencies": {
+        "ms": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+          "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
+        }
+      }
+    },
     "jstransformer": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz",
@@ -5660,6 +5736,27 @@
         "promise": "^7.0.1"
       }
     },
+    "jwa": {
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.1.5.tgz",
+      "integrity": "sha1-oFUs4CIHQs1S4VN3SjKQXDDnVuU=",
+      "requires": {
+        "base64url": "2.0.0",
+        "buffer-equal-constant-time": "1.0.1",
+        "ecdsa-sig-formatter": "1.0.9",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "jws": {
+      "version": "3.1.4",
+      "resolved": "https://registry.npmjs.org/jws/-/jws-3.1.4.tgz",
+      "integrity": "sha1-+ei5M46KhHJ31kRLFGT2GIDgUKI=",
+      "requires": {
+        "base64url": "^2.0.0",
+        "jwa": "^1.1.4",
+        "safe-buffer": "^5.0.1"
+      }
+    },
     "keyv": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz",
@@ -5807,9 +5904,9 @@
       },
       "dependencies": {
         "@types/node": {
-          "version": "7.0.56",
-          "resolved": "http://registry.npmjs.org/@types/node/-/node-7.0.56.tgz",
-          "integrity": "sha512-NgjN3xPyqbAXSIpznNAR5Cisx5uKqJWxcS9kefzSFEX/9J7O01/FHyfnvPI7SztBf9p6c8mqOn3olZWJx3ja6g=="
+          "version": "7.0.63",
+          "resolved": "https://registry.npmjs.org/@types/node/-/node-7.0.63.tgz",
+          "integrity": "sha512-YPVhjU3cADo7M7M1KWeEki9MUMZd3yz5FLq0BXkPrY2jpr0B9VRd4iQ2vBSiLrjvLkIPPluzxQFYJ5JkGubtIw=="
         }
       }
     },
@@ -6207,6 +6304,46 @@
       "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.7.tgz",
       "integrity": "sha512-jzqTi3vk4J5Dxq43cNjB0ekfCjPLHixoY2Sc0WHTo+0r928taLqe/VCt02vY5uQBvg0rdXgL3xWkK4X0MCmZcw=="
     },
+    "lodash.includes": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
+      "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8="
+    },
+    "lodash.isboolean": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
+      "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY="
+    },
+    "lodash.isinteger": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
+      "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M="
+    },
+    "lodash.isnumber": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
+      "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w="
+    },
+    "lodash.isplainobject": {
+      "version": "4.0.6",
+      "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+      "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs="
+    },
+    "lodash.isstring": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
+      "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE="
+    },
+    "lodash.once": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
+      "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w="
+    },
+    "lodash.set": {
+      "version": "4.3.2",
+      "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz",
+      "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM="
+    },
     "log-symbols": {
       "version": "2.2.0",
       "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
@@ -9252,7 +9389,8 @@
     "to-fast-properties": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
-      "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4="
+      "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+      "dev": true
     },
     "to-object-path": {
       "version": "0.3.0",
@@ -9309,7 +9447,8 @@
     "trim-right": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
-      "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM="
+      "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+      "dev": true
     },
     "tty-browserify": {
       "version": "0.0.0",
diff --git a/package.json b/package.json
index 548d8d81c014e727257fff7ccb1837e9de64c11d..c2b626545e4862818fbaf580c322371eb13a8216 100644
--- a/package.json
+++ b/package.json
@@ -4,7 +4,6 @@
   "description": "Backend of sigma, the new Frankiz",
   "main": "index.js",
   "dependencies": {
-    "babel-eslint": "^8.2.3",
     "body-parser": "^1.18.2",
     "colors": "^1.2.3",
     "connect-ensure-login": "^0.1.1",
@@ -14,6 +13,7 @@
     "cors": "^2.8.4",
     "express": "^4.16.2",
     "express-graphql": "^0.6.12",
+    "express-jwt": "^5.3.1",
     "express-session": "^1.15.6",
     "file-loader": "^1.1.11",
     "fs": "0.0.1-security",
@@ -21,6 +21,7 @@
     "graphql": "^0.13.2",
     "graphql-tools": "^2.24.0",
     "graphql-voyager": "^1.0.0-rc.15",
+    "jsonwebtoken": "^8.2.1",
     "knex": "^0.14.6",
     "ldap-escape": "^1.1.5",
     "ldapjs": "^1.0.2",
@@ -34,6 +35,7 @@
     "url-loader": "^0.6.2"
   },
   "devDependencies": {
+    "babel-eslint": "^8.2.3",
     "eslint": "^4.19.1",
     "eslint-config-standard": "^11.0.0",
     "eslint-loader": "^2.0.0",
diff --git a/src/admin_view/admin_router.js b/src/admin_view/admin.router.js
similarity index 98%
rename from src/admin_view/admin_router.js
rename to src/admin_view/admin.router.js
index 7b0f3d9862345a569c182e92f06e2ef805abc60b..a7b8b2a4056a66bb209c1f155ffe706072b774a7 100644
--- a/src/admin_view/admin_router.js
+++ b/src/admin_view/admin.router.js
@@ -7,12 +7,12 @@
  * Les res.redirect() sont censes supporter les paths relatifs (et donc pas besoin de repreciser /adminview/* a chaque fois)
  * mais ca marche visiblement pas... Donc j'ai mis les paths absolus dans les res.redirect().
  */
-import express from 'express';
+import { Router } from 'express';
 import knex from '../../db/knex_router';
 import passport from 'passport';
 import { ensureLoggedIn } from 'connect-ensure-login';
 
-const router = express.Router();
+const router = Router();
 
 let port = process.env.PORT || 3000;
 
@@ -143,7 +143,7 @@ router.get('/db/:table_name?', function (req, res) {
  */
 router.use((req, res, next) => {
     let err = new Error('Not found');
-    err.status = 404;
+    res.status(404);
     next(err);
 });
 
diff --git a/src/config_passport.js b/src/config_passport.js
index 6ba838ba87292035bb4c237feaf17177cf7583e8..717e0a4eda94157dba92093b8174039deccb3dab 100644
--- a/src/config_passport.js
+++ b/src/config_passport.js
@@ -70,6 +70,6 @@ passport.serializeUser(function (user, done) {
 //The first argument of deserializeUser corresponds to the key of the user object that was given to the done function in serializeUser
 //The fetched object is attached to the request object as req.user (available in all subsequent middleware)
 passport.deserializeUser(function (userUid, done) {
-    console.log(`passport.deserializeUser(): deserializing user ${userUid}`); // DEBUG
+    // console.log(`passport.deserializeUser(): deserializing user ${userUid}`); // DEBUG
     done(null, { uid: userUid });
 });
\ No newline at end of file
diff --git a/src/graphql/authenticator.js b/src/graphql/authenticator.js
new file mode 100644
index 0000000000000000000000000000000000000000..9353a6184b946ddef4dd97b7757352bd27434306
--- /dev/null
+++ b/src/graphql/authenticator.js
@@ -0,0 +1,22 @@
+import passport from 'passport';
+import '../config_passport';
+import jwt from 'jsonwebtoken';
+
+const SECRET_KEY = "boom shakalaka";
+
+function loginResolverFunc({ username, password, req }) {
+
+    return new Promise((resolve, reject) => {
+        passport.authenticate('ldapauth', (err, user, info) => {
+            if (err) { reject(err); }
+            if (!user) { reject('Invalid credentials.'); }
+
+            req.login(user, () =>  {
+                const token = jwt.sign({uid: user.uid}, SECRET_KEY);
+                resolve(token);
+            });
+        })({ body: { username, password } });
+    });
+}
+
+export default loginResolverFunc;
\ No newline at end of file
diff --git a/src/graphql/resolvers.js b/src/graphql/resolvers.js
index fa09f4c69c369a60c1fa8dd928b2f13dc06f126e..f1e1c1d93d767bf8f2e44a38fc46bbe8503ad56c 100644
--- a/src/graphql/resolvers.js
+++ b/src/graphql/resolvers.js
@@ -2,11 +2,15 @@
  * @file Implémentation des requêtes GraphQL.
  * @author akka vodol
 */
-import { request } from 'https';
 import _ from 'lodash';
 import { assertBinaryExpression } from 'babel-types';
 import knex from '../../db/knex_router';
 
+import passport from 'passport';
+import './../config_passport';
+
+import authenticator from '../graphql/authenticator';
+
 import * as connectors from './connectors/connectors';
 import * as list_selectors from './connectors/list_selectors';
 import * as authentifiers from './connectors/authentifiers';
@@ -15,6 +19,7 @@ import * as authentifiers from './connectors/authentifiers';
  * @description Résolveurs des différentes requêtes GraphQL
 */
 
+
 export const resolvers = {
     // @rights user
     Query: {
@@ -22,26 +27,26 @@ export const resolvers = {
         // group queries
 
         allGroups: async function(obj, args, context){
-            let user = await authentifiers.anonymous(context.user);
+            let user = await authentifiers.anonymous(context.bindUser);
             return user && connectors.getAllVisibleGroups(user);
         },
 
         allSimpleGroups: async function (obj, args, context){
-            let user = await authentifiers.anonymous(context.user);
+            let user = await authentifiers.anonymous(context.bindUser);
             return user && connectors.getAllVisibleSimpleGroups(user);
         },
 
         group: async function(obj, args, context){
-            let user = await authentifiers.anonymous(context.user);
+            let user = await authentifiers.anonymous(context.bindUser);
             return user && connectors.getGroupIfVisible(user, args.uid);
         },
 
         simpleGroup: async function(obj, args, context){
-            let user = await authentifiers.anonymous(context.user);
+            let user = await authentifiers.anonymous(context.bindUser);
             return user && connectors.getSimpleGroupIfVisible(user, args.uid);
         },
         metaGroup: async function(obj, args, context){
-            let user = await authentifiers.anonymous(context.user);
+            let user = await authentifiers.anonymous(context.bindUser);
             return user && connectors.getMetaGroupIfVisible(user, args.uid);
         },
 
@@ -68,7 +73,7 @@ export const resolvers = {
         // user queries
 
         user: async function(obj, args, context){
-            let user = await authentifiers.anonymous(context.user);
+            let user = await authentifiers.anonymous(context.bindUser);
             return user && connectors.getUser(user,args.uid);
         },
 
@@ -96,15 +101,15 @@ export const resolvers = {
         // member queries
 
         allMembers : async function(obj, args, context){
-            let user = await authentifiers.member(context.user, args.from);
-            return user && connectors.getGroupMemberUsers(context.user, obj.groupUID);
+            let user = await authentifiers.member(context.bindUser, args.from);
+            return user && connectors.getGroupMemberUsers(context.bindUser, obj.groupUID);
         },
 
         // speaker queries
 
         allRequests: async function(obj, args, context){
             let res = [];
-            let user = authentifiers.admin(context.user, args.from);
+            let user = authentifiers.admin(context.bindUser, args.from);
             if(user){
                 res = res.concat(await connectors.getUserJoinGroupRequests(user, args.from));
             }
@@ -128,11 +133,11 @@ export const resolvers = {
     // @rights admin(obj.groupUID)
     UserJoinGroup: {
         user : (obj, args, context) => {
-            return connectors.getUser(context.user, obj.useruid);
-            /*return connectors.getUser(context.user, "quentin.gendre");
+            return connectors.getUser(context.bindUser, obj.useruid);
+            /*return connectors.getUser(context.bindUser, "quentin.gendre");
             if(obj.useruid === "anatole.romon"){
-                return connectors.getUser(context.user, "anatole.romon").then(res => {
-                    return connectors.getUser(context.user, "quentin.gendre");
+                return connectors.getUser(context.bindUser, "anatole.romon").then(res => {
+                    return connectors.getUser(context.bindUser, "quentin.gendre");
                 });
             }else{
                 return new Promise( (resolve, reject) => {
@@ -145,20 +150,20 @@ export const resolvers = {
     // @rights speaker(obj.groupUID)
     GroupJoinEvent : {
         event: (obj, args, context) => {
-            return connectors.getEvent(context.user, obj.eventuid);
+            return connectors.getEvent(context.bindUser, obj.eventuid);
         },
         groupWantingToJoin: (obj, args, context) => {
-            return connectors.getGroup(context.user, obj.senderuid);
+            return connectors.getGroup(context.bindUser, obj.senderuid);
         }
     },
 
     // @rights speaker(obj.groupUID)
     YourGroupHostEvent : {
         event: (obj, args, context) => {
-            return connectors.getEvent(context.user, obj.eventuid);
+            return connectors.getEvent(context.bindUser, obj.eventuid);
         },
         sender: (obj, args, context) => {
-            return connectors.getGroup(context.user, obj.senderuid);
+            return connectors.getGroup(context.bindUser, obj.senderuid);
         }
     },
 
@@ -166,7 +171,7 @@ export const resolvers = {
     User : {
         groups : (obj, args, context) => {
             let result = Promise.all(obj.groups.map((grid) => {
-                return connectors.getSimpleGroup(context.user,grid);
+                return connectors.getSimpleGroup(context.bindUser,grid);
             }));
 
             return result.then(groups => {
@@ -194,10 +199,23 @@ export const resolvers = {
         // Admin mutations
 
         createSubgroup: async function (obj, args, context){
-            let user = authentifiers.admin(context.user, args.from);
+            let user = authentifiers.admin(context.bindUser, args.from);
             return user && connectors.createSubgroup(user, args);
         },
 
+        login: function(obj, args, context) {
+
+            const {username, password} = args;
+            const req = context.request;
+
+            const result = authenticator({ username, password, req });
+            result.then(value => {
+                console.log(`Token: ${value}`);
+            });
+
+            return result;
+        }
+
     },
 
     Message: {
@@ -262,7 +280,7 @@ export const resolvers = {
     SimpleGroup: {
         
         members: (obj, args, context) => {
-            return connectors.utilisateur.listMembers(context.user,obj.uid);
+            return connectors.utilisateur.listMembers(context.bindUser,obj.uid);
         }
     },
 
diff --git a/src/graphql/typeDefs/actions.js b/src/graphql/typeDefs/actions.js
index 6204df4e8e54f50cfb0cda08541bf631a51708ca..73ff5f66eb096403883e62169a89ea6f829b590c 100644
--- a/src/graphql/typeDefs/actions.js
+++ b/src/graphql/typeDefs/actions.js
@@ -92,8 +92,10 @@ const RootTypes = `
         postEvent(from : String!, name: String, date: String): Event
         answerEventRequest(from : String, request: ID, accept : Boolean): Request
 
-        # User mutations
-
+        # Log user into the API
+        login(username: String!, password: String!): String!
+        # Log user out of the API
+        logout(username: String!): Boolean
         leave(from : String!) : Boolean
 
         # Viewer mutations
@@ -172,7 +174,6 @@ const subMutations = `
         requestJoin: Group
     }
 
-
 `;
 
 const subQueries = `
@@ -201,6 +202,10 @@ const subQueries = `
         allAnnouncements: [Announcement]
     }
 
+
+    """
+    Requête pour obtenir un utilisateur.
+    """
     type UserQuery{
 
         user(uid: ID) : User
diff --git a/src/index.js b/src/index.js
index ce145b2c2560740ae3823ea35be9a6d33128f95d..d7929d9739ea580e9c23d5eb61d7231ce4b1e46b 100644
--- a/src/index.js
+++ b/src/index.js
@@ -6,8 +6,8 @@ import app from './server';
 import colors from 'colors';
 import passport from 'passport';
 
-let port = process.env.PORT || 3000;
+const port = process.env.PORT || 3000;
 
 app.listen(port, () => {
-    console.log(colors.blue(`Express server listening on port ${port}`));
+    console.log(colors.blue(`Express server listening on port ${port}.`));
 });
diff --git a/src/server.js b/src/server.js
index 259e6497d400cdc352e74acbade9acee8d818bf4..e557c632707249399ba1171537aacc7f8b726b40 100644
--- a/src/server.js
+++ b/src/server.js
@@ -19,7 +19,7 @@ import schema from './graphql/schema';
 // packages pour adminview
 import { ensureLoggedIn } from 'connect-ensure-login';
 import flash from 'connect-flash';
-import router from './admin_view/admin_router';
+import router from './admin_view/admin.router';
 // packages pour l'authentification
 import passport from 'passport';
 import session from 'express-session';
@@ -32,6 +32,7 @@ import morgan from 'morgan';
 import path from 'path';
 import fs from 'fs';
 
+import './config_passport';
 
 
 const app = express(); // "The app object conventionally denotes the Express application" (https://expressjs.com/en/4x/api.html#app)
@@ -137,7 +138,6 @@ app.use(cors(corsOptions));
 // Config de passport pour l'authentification ldap. Ne fait que *configurer* passport (aucun passport.authenticate() n'est appele, par exemple)
 import './config_passport.js';
 
-
 //with custom callback:
 //http://www.passportjs.org/docs/authenticate/#custom-callback
 // http://toon.io/understanding-passportjs-authentication-flow/
@@ -208,14 +208,12 @@ app.post('/login',
  */
 
 
-
-
-
 /**
  * @desc API GRAPHQL
  */
 
-import { dn, passwd } from "../ldap_connexion_config.json"; // default user
+import { dn, passwd } from "../ldap_connexion_config.json"; // default bind user
+const environment = process.env.NODE_ENV || 'development';
 
 app.use('/graphql', 
     graphqlHTTP(async (req, res, params) => {
@@ -244,8 +242,11 @@ app.use('/graphql',
 
         return {
             schema,
-            graphiql: true, // gives access to graphiql if request is detected to be from browser (je crois)
-            context: { user: { uid: uid, password: password } } // accessible in every single resolver as the third argument
+            graphiql: environment == 'development', // gives access to GraphiQL if req comes from browser (je crois)
+            context: {
+                request: req, 
+                bindUser: { uid: uid, password: password }
+            } // accessible in every single resolver as the third argument
         };
     })
 );
diff --git a/webpack.config.js b/webpack.config.js
index bf2c502c1a02c612ca52f159e07ff691b9a66488..47ae22d5d75574d81dfb3e76453e20a4d120b9af 100644
--- a/webpack.config.js
+++ b/webpack.config.js
@@ -15,15 +15,15 @@ const config = {
         publicPath: '/assets/',
         filename: 'bundle.js'
     },
+
+    devtool: 'source-map',
     
     externals: [nodeExternals()],
     
     module: {
-
         rules: [{
             test: /\.js$/,
-            exclude: /node_modules/,
-            use: [ 'eslint-loader' ]
+            use: ['eslint-loader']
         },{
             test: /\.css$/,
             use: ['style-loader', 'css-loader']