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

92 lines
2.7 KiB
JavaScript

const express = require('express');
const app = express();
const session = require('express-session');
const bodyParser = require('body-parser');
const request = require('request-promise-native');
app.set('view engine', 'ejs');
app.use(session({
secret: 'AbsolutlyNotSecret', // Ce secret doit être partagé par tous les microservices *_page
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
findUserByName(form.username)
.then(user => {
// Si l'utilisateur n'existe pas, on affiche un message d'erreur
if(!user) {
return res.render('index', { error: 'Identifiant invalide !'});
}
// Si le mot de passe de l'utilisateur correspond à celui enregistré sur le
// microservice "users", on attache l'identifiant de l'utilisateur à la session
// HTTP puis on le redirige sur la page d'accueil
if(user.password === form.password) {
req.session.user = user;
return res.redirect(302, '/');
} else {
// Sinon, on affiche un message d'erreur
return res.render('index', { error: 'Mot de passe invalide !'});
}
})
.catch(err => {
// Une erreur s'est produite en essayant de contacter le microservices "users"
// On affiche un message d'erreur à l'utilisateur
return res.render('index', {
error: 'Une erreur s\'est produite pendant le processus d\'authentification.'
});
})
;
});
app.listen(8080, () => console.log('listening on port 8080'));
// Récupère un utilisateur via son identifiant
// sur le microservice "users"
function findUserByName(username) {
return request({
uri: `http://users:8080/users/${username}`,
json: true
})
.catch(err => {
// Si le microservice "users" répond avec un code HTTP 404
// c'est que l'utilisateur n'existe pas
if (err.response.statusCode === 404) {
return null;
}
throw err;
})
;
}