'Protect Expressjs routes using Session
I don't want to login to /dashboard without logging in, I assigned the user ID to the session by saying req.session.userID. Then I checked this "userid" info via middleware but I can access /dashboard even though I'm not logged in
server.js
const express=require('express')
const session = require('express-session')
const flash = require('express-flash')
const cookieParser = require('cookie-parser')
const cors=require('cors')
const MongoDBStore = require('connect-mongodb-session')(session);
const authRoutes=require('./routes/authRoutes')
const authMiddleware=require('./middlewares/authMiddleware')
const app=express()
const adminController=require('./controllers/adminController')
require('./db')
require('dotenv').config()
app.set('view engine', 'ejs');
app.use(cors());
app.use(express.urlencoded({extended: true}))
app.use(express.json())
app.use(cookieParser())
app.use(require('express-session')({
secret: 'secret',
resave: false,
saveUninitialized: true,
httpOnly: true,
store:new MongoDBStore({
uri:process.env.MONGO_URI,
collection:'sessions'
})
}))
app.use('/admin',express.static('public/admin'))
app.use('/',express.static('public'))
app.use('/admin',authRoutes)
route
router.route('/dashboard',authMiddleware.isAuthentication,(req,res)=>{
res.render('admin/pages/dashboard')
})
router.route('/login')
.post(async (req,res)=>{
try {
const { email, password } = req.body;
const user=await AdminModel.findOne({ email });
if (user) {
bcrypt.compare(password, user.password, (err, same) => {
if (same) {
// USER SESSION
req.session.userID=user._id
return res.status(200).redirect('/admin');
}else{
res.redirect('/admin/login')
}
});
}
} catch (error) {
return res.status(400).json({
status: 'fail',
error,
});
}
})
auth Middleware
const isAuthentication = (req, res, next) => {
if (!req.session.userID) {
return res.redirect("/admin/login");
} else {
return next();
}
};
module.exports = {
isAuthentication,
};
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|
