84 lines
2.3 KiB
JavaScript
84 lines
2.3 KiB
JavaScript
const express = require('express');
|
|
const app = express();
|
|
const session = require('express-session');
|
|
var RedisStore = require('connect-redis')(session);
|
|
const bodyParser = require('body-parser');
|
|
const request = require('request-promise-native');
|
|
const morgan = require('morgan');
|
|
|
|
app.set('view engine', 'ejs');
|
|
app.set('views', __dirname + '/views');
|
|
|
|
app.use(morgan('combined'));
|
|
app.use(session({
|
|
store: new RedisStore({host: 'redis'}),
|
|
secret: process.env.SESSION_SECRET, // Ce secret doit être partagé par tous les microservices *_page
|
|
cookie: { maxAge: 60000 },
|
|
resave: false,
|
|
saveUninitialized: true,
|
|
}));
|
|
|
|
// On utilise le module "body-parser"
|
|
// pour faciliter la désérialisation des données
|
|
// du formulaire
|
|
app.use(bodyParser.urlencoded({extended: false}));
|
|
|
|
// GET /
|
|
// Affiche la page de login
|
|
app.get('/', (req, res) => {
|
|
res.render('index', { error: null });
|
|
});
|
|
|
|
// POST /
|
|
// Récupère les données du formulaire de login
|
|
app.post('/', (req, res) => {
|
|
|
|
const form = req.body;
|
|
|
|
// Si le formulaire ne contient pas les données attendues
|
|
// on renvoie un code HTTP 400 pour indiquer une requête invalide.
|
|
if(!form.username || !form.password) {
|
|
return res.render('index', { error: 'Identifiant ou mot de passe manquant.'});
|
|
}
|
|
|
|
// On interroge le microservices "users"
|
|
// pour récupérer l'utilisateur associé à l'identifiant
|
|
// fourni dans le formulaire
|
|
authenticateUser(form.username, form.password)
|
|
.then(result => {
|
|
|
|
// Si l'utilisateur n'existe pas, on affiche un message d'erreur
|
|
if(!result.ok) {
|
|
return res.render('index', { error: result.error });
|
|
}
|
|
|
|
// Si le microservice "users" renvoie "ok", alors cela signifie
|
|
// que le mot de passe est valide
|
|
req.session.user = result.user;
|
|
return res.redirect(303, '/');
|
|
|
|
})
|
|
.catch(err => {
|
|
console.error(err);
|
|
return res.end(500).send(err.message);
|
|
})
|
|
;
|
|
|
|
});
|
|
|
|
app.listen(8080, () => console.log('listening on port 8080'));
|
|
|
|
// Authentifie un utilisateur via son couple identifiant/mot de passe
|
|
// sur le microservice "users"
|
|
function authenticateUser(username, password) {
|
|
return request({
|
|
uri: `http://users:8080/auth`,
|
|
method: 'POST',
|
|
body: {
|
|
username, password
|
|
},
|
|
json: true
|
|
})
|
|
;
|
|
}
|