formations/cesi/architecture_n_tiers/ressources/exercices/ex_microbloggr_solution/services/login_page/src/server.js

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
})
;
}