1

I try to use req.session.user in node.js to control the connection on my application. It's working on my local environnement but when I put my app on glitch the req.session.user is undefined.

I try to use req.session.user in node.js to control the connection on my application. It's working on my local environnement but when I put my app on glitch in my auth function the req.session.user is undefined. I initialized it in the "app.post('/api/login'..." and when I call auth function it's disapear.

Here my server.js :

const express = require('express');
const path = require('path');
let bodyParser = require('body-parser');
const mongoose = require('mongoose');
const User = require('./model/user');
const bcrypt = require('bcryptjs');
const session = require("express-session");
const Reservation = require('./model/reservation');
const Resource = require('./model/resource');
const rateLimit = require("express-rate-limit");
/*const routes = require('./routes');
const auth = require('./auth');*/
require('dotenv').config();



mongoose.connect(process.env.MONGODB_URI, {
    useNewUrlParser: true,
    useUnifiedTopology: true
});

const app = express();

//app.use(routes);

app.use(session({
    secret: 'top secret',
    resave: false,
    saveUninitialized: true
}));

app.use(bodyParser.urlencoded({
    extended: true
}));
app.use(express.static(path.join(__dirname, 'views')));
app.set('views', path.join(__dirname , 'views'));
app.engine('html', require('ejs').renderFile);
app.set('view engine', 'html');

app.use(bodyParser.json());

function auth(req, res, next) {
    if (req?.session?.user) {
        return next();
    }
    else {
        return res.sendStatus(401);
    }
}

app.get('/', function(req, res) {
    if(req?.session?.user){
        res.redirect("/home");
    }
    else{
        res.redirect("/login");
    }
});

app.get('/login', function(req, res) {
    res.render(path.join(__dirname, 'views', 'login.html'));
});
app.get('/register', function(req, res) {
    res.render(path.join(__dirname, 'views', 'register.html'));
});
app.get('/home', auth, async (req, res) => {
    const resources = await Resource.find();
    res.render(path.join(__dirname, 'views', 'home.ejs'), {user: req.session.user.username, isAdmin: req.session.user.isAdmin, resources });
});

app.get('/calendar', auth, async function(req, res) {
    const reservations = await Reservation.find();
    res.render(path.join(__dirname, 'views', 'calendar.ejs'), {user: req.session.user.username, isAdmin: req.session.user.isAdmin, reservations});
});

app.get('/reservations', auth, async function(req, res) {
    const reservations = await Reservation.find({user : req.session.user.username});
    return res.render(path.join(__dirname, 'views','reservations.ejs'), {user: req.session.user.username, isAdmin: req.session.user.isAdmin, reservations});
});

app.get('/addReservation', auth, async function(req, res) {
    const resources = await Resource.find();
    res.render(path.join(__dirname, 'views', 'addReservation.ejs'), {user: req.session.user.username, isAdmin: req.session.user.isAdmin, resources});
});

app.get('/admin', auth, async function(req, res) {
    if(req.session.user.isAdmin){
        const resources = await Resource.find();
        res.render(path.join(__dirname, 'views', 'admin.ejs'), {user: req.session.user.username, isAdmin: req.session.user.isAdmin, resources});
    }
});

app.post('/api/login', async (req, res) => {
    const { username, password } = req.body
    const user = await User.findOne({ username }).lean()
    if (!user) {
        return res.render(path.join(__dirname, 'views', 'error.ejs'), {error : "Incorrect username or password", redirect : "/login"});
    } else if (await bcrypt.compare(password, user.password)){
        req.session.user = {username : username, isAdmin : user.isAdmin};
        res.redirect("/home");
    }
    else {
        return res.render(path.join(__dirname, 'views', 'error.ejs'), {error : "Incorrect username or password", redirect : "/login"});
    }
});



app.post('/logout', function(req, res) {

    req.session.destroy();
    res.redirect("/login");
});

const registerLimiter = rateLimit({
    windowMs: 15 * 60 * 1000, // 15 minutes
    max: 10000, // limit each IP to 100 requests per windowMs
    message: "Too many registration attempts. Please try again later."
});

app.use("/api/register", registerLimiter);

app.post('/api/register', async (req, res) => {
    const { username, password: plainTextPassword } = req.body
    if (!username || typeof username !== 'string') {
        return res.json({ status: 'error', error: "Nom d'utilisateur invalide" });
    }

    if (!plainTextPassword || typeof plainTextPassword !== 'string') {
        return res.json({ status: 'error', error: 'Mot de passe invalide' });
    }

    if (plainTextPassword.length < 4) {
        return res.json({
            status: 'error',
            error: 'Le mot de passe doit contenir au moins 4 caractères'
        })
    }
    const duplicate = await User.findOne({username});
    if(duplicate){
        return res.json({ status: 'error', error: "Nom d'utilisateur indisponible" });
    }else{
        const password = await bcrypt.hash(plainTextPassword, 10);
        const user = new User({ username, password, isAdmin : false });
        await user.save();
        req.session.user = {username : username, isAdmin : false};
        res.json({ status: 'ok' });

        console.log('Utilisateur créé : ', req.session.user);
    }
});

app.post('/api/reservations', auth, async (req, res) => {
    try {
        const {resourceId, dateDebut, dateFin, user} = req.body;
        let conflicts = [];
        if (dateDebut > dateFin) {
            return res.render(path.join(__dirname, 'views', 'error.ejs'), {error : "La date de début doit être antérieure à la date de fin", redirect : "/addReservation"});
        }

        // check for conflicts with existing reservations
        for (let i = 0; i < resourceId.length; i++) {
            const existingReservation = await Reservation.findOne({
                resourceId: resourceId[i],
                $or: [
                    {$and: [{dateDebut: {$gte: dateDebut}}, {dateDebut: {$lte: dateFin}}]},
                    {$and: [{dateFin: {$gte: dateDebut}}, {dateFin: {$lte: dateFin}}]},
                    {$and: [{dateDebut: {$lte: dateDebut}}, {dateFin: {$gte: dateFin}}]}
                ]
            });
            if (existingReservation) {
                conflicts.push(resourceId[i]);
            }
        }
        if (conflicts.length > 0) {
            const error = {
                status: 'Conflit de réservation',
                message: `Votre réservation n'a pas pu aboutir car une autre réservation est déjà en cours pour la(les) ressource(s) : "${conflicts}" durant cette plage horaire.`
            };
            return res.render(path.join(__dirname, 'views', 'conflict.ejs'), {error});

        }
    // create new reservation

        for (let i = 0; i < resourceId.length; i++) {
            const reservation = new Reservation({
                resourceId: resourceId[i],
                dateDebut,
                dateFin,
                user
            });
            await reservation.save();
            const resource = await Resource.findOne({ name: resourceId[i] });
            await resource.save();
        }
    } catch (error) {
        console.log(error);
        return res.render(path.join(__dirname, 'views','error.ejs'),
            {error : "La création de la réservation a échoué. Veuillez réessayer ultérieurement.", redirect: "/reservations"});
    }


    return res.redirect("/reservations");
});

app.post('/api/reservations/delete', auth, async (req, res) => {
    try {
        const deletedReservation = await Reservation.findByIdAndDelete(req.body.id);
        if (!deletedReservation) {
            return res.status(404).render(path.join(__dirname, 'views', 'error.ejs'), {error : "Réservation introuvable", redirect: "/reservations"});
        }
        return res.redirect("/reservations");
    } catch (err) {
        return res.status(500).render(path.join(__dirname, 'views', 'error.ejs'),
            {error : "Erreur lors de la suppression de la réservation", redirect: "/reservations"});
    }
});

app.post('/api/resources', auth, async (req, res) => {
    try {
        const duplicate = await Resource.findOne({
            name: req.body.name
        });
        if (duplicate) {
            return res.render(path.join(__dirname, 'views', 'error.ejs'), {error : "Ressource déjà existante", redirect: "/admin"});
        }
        const name = req.body.name;
        const resource = new Resource({name});
        await resource.save();
        console.log('Ressource créée : ', resource);
        return res.redirect("/admin");
    } catch (error) {
        return res.render(path.join(__dirname, 'views', 'error.ejs'),
            {error : "La création de la ressource a échoué. Veuillez réessayer ultérieurement.", redirect: "/admin"});
    }
});


app.listen(process.env.PORT, () => {
    console.log('Server up at ' + process.env.PORT);
})

If anyone could help me... Thanks a lot for your help

willinho
  • 11
  • 1

0 Answers0