From a597148e33f2cb6190d17c392910e5827cb32fc8 Mon Sep 17 00:00:00 2001
From: ManifoldFR <wilson.jallet@gmail.com>
Date: Wed, 2 May 2018 00:50:43 +0200
Subject: [PATCH] added conditional behavior to /login route depending on
 Accept header

---
 README.md                   |  9 +++++++++
 src/auth.js                 |  1 +
 src/routing/admin_router.js | 30 +++++++++++++++++++++++-------
 src/server.js               |  4 +---
 4 files changed, 34 insertions(+), 10 deletions(-)

diff --git a/README.md b/README.md
index 09e491f..dfc04de 100644
--- a/README.md
+++ b/README.md
@@ -156,3 +156,12 @@ qui fait appel au script `eslint src/` défini dans le [`package.json`](../packa
 Sinon, si vous utilisez Atom ou Visual Studio Code pour éditer votre code, il existe des plugins qui font tourner ESLint en _live_ sur le code et vérifient que tout est en ordre.
 
 Pour mieux comprendre ESLint, référez-vous à la [doc](https://eslint.org/docs/user-guide/getting-started).
+
+### API/panneau d'administration
+
+#### Authentification
+
+L'authentification se fait contre le LDAP en envoyant un requête HTTP POST à '/login'. En fonction de la valeur du header `Accept` inclus dans la requête, on a deux comportements possibles
+| `application/json`                   | autre                  |
+| ------------------------------------ | ---------------------- |
+| Renvoie un message de succès/d'échec | Redirige vers `/admin` |
diff --git a/src/auth.js b/src/auth.js
index 1198261..2c228d4 100644
--- a/src/auth.js
+++ b/src/auth.js
@@ -61,6 +61,7 @@ passport.use(new LdapStrategy({
 //toujours bon a savoir pour faire des tests:
 //The result of the serializeUser method is attached to the session as req.session.passport.user
 passport.serializeUser(function (user, done) {
+    console.log(`serializing user ${user.uid}`); // DEBUG
     done(null, user.uid);
 });
 
diff --git a/src/routing/admin_router.js b/src/routing/admin_router.js
index e9364b1..6eac02b 100644
--- a/src/routing/admin_router.js
+++ b/src/routing/admin_router.js
@@ -102,13 +102,29 @@ router.get('/db/:table_name?', function (req, res) {
     );
 });
 
-router.post('/login',
-    passport.authenticate('ldapauth', {
-        successRedirect: '/admin',
-        failureRedirect: '/login',
-        failureFlash: true
-    })
-);
+router.post('/login', (req, res, next) => {
+    passport.authenticate('ldapauth', (err, user, info) => {
+        if (err) return next(err); // handle error
+        else if (!user) {
+            return res.json(403, {message: "Not authenticated."});
+        }
+
+        console.log(req.headers); // return 'Origin' header, useful later
+        
+        req.login(user, (err) => {
+            if (err) {
+                console.log(err);
+                return err;
+            }
+            // if request asks for a json, reply with a token
+            // else redirect to admin panel
+            (req.header('accept') == 'application/json')
+                ? res.json({ message: 'Authentication succeeded.' })
+                : res.redirect('/admin');
+            
+        });
+    })(req,res,next);
+});
 
 /**
  * @function Error 404 catcher
diff --git a/src/server.js b/src/server.js
index 0b9b33c..b56ce60 100644
--- a/src/server.js
+++ b/src/server.js
@@ -81,9 +81,7 @@ server.use('/graphql',
         // vary the options *on a per-request basis*
         let uid;
         let password;
-
-        console.log(`User authenticated: ${req.isAuthenticated()}`);
-
+        
         if(req.isAuthenticated()) {
             try {
                 uid = req.user.uid;
-- 
GitLab