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