/** * @file Initialise et configure le serveur Express sur lequel tourne le back. * * La configuration inclut tout le _middleware_ définissant les API et les services * nécessaire utilisés, comme `express-session`, GraphiQL, GraphQL Voyager. * @author manifold */ import express from 'express'; import schema from './graphql/schema'; import { express as graphqlVoyager } from 'graphql-voyager/middleware'; import { graphqlExpress, graphiqlExpress } from 'graphql-server-express'; import flash from 'connect-flash'; import { ensureLoggedIn } from 'connect-ensure-login'; import passport from 'passport'; import LdapStrategy from 'passport-ldapauth'; import fs from 'fs'; import session from 'express-session'; import bodyParser from 'body-parser'; import favicon from 'serve-favicon'; import morgan from 'morgan'; import path from 'path'; import cors from 'cors'; const server = express(); // on sait pas a quoi ca sert mais il parait que c'est utile server.use(bodyParser.json()); server.use(bodyParser.urlencoded({ extended: true })); /** * @description Configuration authentification * @author guillaume.wang */ let configPath = path.resolve('./', 'ldap_config.json'); let config = JSON.parse(fs.readFileSync(configPath, 'utf8')); passport.use(new LdapStrategy({ server: { url: config.ldap.server, searchBase: config.ldap.searchBase, searchFilter: config.ldap.searchFilter } } )); // Définit les paramètres de stockage des sessions. server.use(session({ secret: config.sessionSecret, resave: true, saveUninitialized: false })); server.use(passport.initialize()); server.use(passport.session()); passport.serializeUser(function (user, done) { done(null, user); }); passport.deserializeUser(function (user, done) { done(null, user); }); /** * @description Cache le fait que l'application tourne sous Express dans le header HTTP. */ server.disable('x-powered-by'); // setting up view engine for pug let viewpath = path.resolve('./','src','views'); server.set('views', viewpath); server.set('view engine', 'pug'); // favicon: capital sigma symbol server.use(favicon(path.resolve('./','assets','favicon.ico'))); server.use('/assets',express.static(path.resolve('./','assets'))); // Morgan is middleware for logging requests server.use(morgan('dev')); const defaultUser = require('./../ldap_connexion_config.json'); /** * @desc Options de configuration pour le _middleware_ `cors`. */ const corsOptions = { origin: 'http://localhost:8888', credentials: true // <-- REQUIRED backend setting }; server.use(cors(corsOptions)); // Charge le middleware express pour GraphQL server.use('/graphql', bodyParser.json(), graphqlExpress(req => { let uid; let password; try { uid = req.session.passport.user.uid; password = "mythe"; } catch (err) { uid = defaultUser.dn.split("=")[1].split(",")[0]; console.log(uid); password = defaultUser.passwd; } console.log("Accessing GraphQL as:",uid); return { schema : schema, context : {user : {uid : uid, password : password}} }; })); // GraphiQL est une console interactive pour faire des requêtes au schéma GraphQL server.use('/graphiql', ensureLoggedIn('/login'), graphiqlExpress({endpointURL: '/graphql'})); // GraphQL voyager server.use('/voyager', graphqlVoyager({ endpointUrl: '/graphql' })); // connect-flash is middleware for flashing messages server.use(flash()); export default server;