Skip to content

Commit

Permalink
modularize
Browse files Browse the repository at this point in the history
  • Loading branch information
Karan0127 committed Mar 16, 2023
1 parent cc31d58 commit cd3af23
Show file tree
Hide file tree
Showing 9 changed files with 167 additions and 209 deletions.
191 changes: 9 additions & 182 deletions app.js
Original file line number Diff line number Diff line change
@@ -1,31 +1,13 @@
const express = require('express');
const app = express();
const mongoose = require('mongoose');

const db_link = 'mongodb+srv:https://admin:[email protected]/?retryWrites=true&w=majority';
//mongoose.set('strictQuery', true);
mongoose.connect(db_link)
.then(function(db){ //since connect is a promise based function
console.log('Connected to MongoDB successfully');
})
.catch(function(err){
console.log(err);
})

const bodyParser = require('body-parser');
var passport = require('passport');
const ejs = require('ejs');

const app = express();
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

//const usersRoute = require('./routes/userRoutes.js');
//app.use('/users' , usersRoute);

//const router = express.Router();
const User = require('./model/User.js');
const bcrypt = require('bcrypt');
const path = require('path');

const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;

const session = require('express-session');
const FileStore = require('session-file-store')(session);
Expand All @@ -41,172 +23,17 @@ app.use(session({
saveUninitialized: true
}));

//passport.use(User.createStrategy());

// Serializing and deserializing
// passport.serializeUser(User.serializeUser());
// passport.deserializeUser(User.deserializeUser());

const customFields = {
usernameField: 'userName',
passwordField: 'password'
};
//done represents function that you will the results of authentication to
const verifyCallback = (username, password, done) => {
User.findOne({username: username})
.then((user) => {
if(!user) {return done(null, false)};

let passwordCheck = bcrypt.compareSync(password, user.password);

if(username === user.username && passwordCheck) {
return done(null, user)
}
else{
return done(null, false);
}
})
.catch(err => {done(err)});
}
const strategy = new LocalStrategy(customFields, verifyCallback);
passport.use(strategy);

//for user to go into the session
passport.serializeUser((user, done) => {done(null, user.id);});

//for user to come out of the session
passport.deserializeUser(async (id, done) => {
User.findById(id)
.then(user => {
done(null, user);
})
.catch(err => done(err));
});
// Need to require the entire Passport config module so app.js knows about it
require('./authentication/passport');

app.use(passport.initialize());
app.use(passport.session());

app.get('/',async function(req,res){
if(req.isAuthenticated()) {
res.send('You have already logged in. No need to signup again');
}
else{
const pathToSignup = path.join(__dirname, '/views/welcome.html');
res.sendFile(pathToSignup);
}
});

app.get('/register',async function(req,res){
if(req.isAuthenticated()) {
res.send('You have already logged in. No need to signup again');
}
else{
const pathToSignup = path.join(__dirname, '/views/signup.html');
res.sendFile(pathToSignup);
}
});

app.get('/login',function(req,res){
// if(req.isAuthenticated()) {
// res.send('You have already logged in. No need to login again');
// }
// else{
const pathToSignup = path.join(__dirname, '/views/login.html');
res.sendFile(pathToSignup);
//}
});


app.post('/register', (req, res, next) => {
const user = new User({
firstName: req.body.firstName,
lastName: req.body.lastName,
username: req.body.userName,
password: req.body.password,
email: req.body.email
});

bcrypt.hash(user.password, 10, function(err, hash){
if(err){
console.log(err);
return res.status(500).send('Internal Server Error');
}
user.password = hash;
user.save()
.then(data => {
console.log('Successfully created a new User');
passport.authenticate('local')(req, res, function() {
//res.status(201).send('Successfully created a new User');
res.redirect('/login');
});

})
.catch(error => {
console.log(error);
res.status(500).send('Internal Server Error');
});

});
});

const ejs = require('ejs');
app.set('view engine', 'ejs');
app.get('/users', async (req, res) => {
if (req.isAuthenticated()) {
let result = await User.find();
if (result) {
res.render('availableUsers', {'users' : result});
} else {
res.status(404);
}
} else {
res.send('<h1>You are not authenticated</h1><p><a href="/login">Login</a></p>');
}
})

app.post('/login', passport.authenticate('local', {failureRedirect: '/login-failure', successRedirect: '/login-success'}));
//(req, res, next) => {

//passport.authenticate('local', (err, user, info) => {
// if (err) {
// // handle error
// console.error(err);
// return next(err);
// }
// if (!user) {
// // handle authentication failure
// //console.log('The user is - ');
// //console.log(user);
// return res.status(401).send('Invalid username or password');
// }
// req.login(user, (err) => {
// if (err) {
// // handle error
// console.error(err);
// return next(err);
// }
// // authentication succeeded
// console.log('Authentication succeeded');
// return res.send('Login successful');
// });
// })(req, res, next);
// }
//);

app.get('/login-success', (req, res, next) => {
res.send('<p>You successfully logged in. --> <a href="/users">See all users</a></p>');
});


app.get('/logout', (req, res, next) => {
req.logout(err => {console.log(err)});
res.redirect('/login');
});

app.get('/login-failure', (req, res, next) => {
res.send('You entered the wrong password.');
});
var routes = require('./routers/userRouter.js');
app.use(routes);

app.listen(3000, () => {
console.log('Server listening on 3000');
console.log('Server listening on port 3000');
})
47 changes: 47 additions & 0 deletions authentication/passport.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
const LocalStrategy = require('passport-local').Strategy;
const User = require('../models/userModel.js');
const bcrypt = require('bcrypt');
const passport = require('passport');

//passport.use(User.createStrategy());
// passport.serializeUser(User.serializeUser());
// passport.deserializeUser(User.deserializeUser());

const customFields = {
usernameField: 'userName',
passwordField: 'password'
};

//done represents function that you will the results of authentication to
const verifyCallback = (username, password, done) => {
User.findOne({username: username})
.then((user) => {
if(!user) {return done(null, false)};

let passwordCheck = bcrypt.compareSync(password, user.password);

if(username === user.username && passwordCheck) {
return done(null, user)
}
else{
return done(null, false);
}
})
.catch(err => {done(err)});
}

const strategy = new LocalStrategy(customFields, verifyCallback);
passport.use(strategy);

//for user to go into the session
passport.serializeUser((user, done) => {done(null, user.id);});

//for user to come out of the session
passport.deserializeUser((id, done) => {
User.findById(id)
.then(user => {
done(null, user);
})
.catch(err => done(err));
});

15 changes: 12 additions & 3 deletions model/User.js → models/userModel.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,16 @@
const mongoose = require('mongoose');
const passportLocalMongoose = require("passport-local-mongoose");

const db_link = 'mongodb+srv:https://admin:[email protected]/?retryWrites=true&w=majority';
//mongoose.set('strictQuery', true);
mongoose.connect(db_link)
.then(function(db){
console.log('Connected to MongoDB successfully');
})
.catch(function(err){
console.log(err);
})

const userSchema = mongoose.Schema({
email: { type: String, unique: true, required: true },
username: { type: String, unique: true,required: true },
Expand All @@ -9,6 +19,5 @@ const userSchema = mongoose.Schema({
lastName: { type: String, required: true }
})

userSchema.plugin(passportLocalMongoose);
module.exports = mongoose.model('User', userSchema);

//userSchema.plugin(passportLocalMongoose);
module.exports = mongoose.model('User', userSchema);
95 changes: 95 additions & 0 deletions routers/userRouter.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
const router = require('express').Router();
const passport = require('passport');
const User = require('../models/userModel.js');
const bcrypt = require('bcrypt');
const path = require('path');

router.get('/', function(req,res){
if(req.isAuthenticated()) {
res.send('You have already logged in. No need to signup again');
}
else{
const pathToSignup = path.join(__dirname, '../views/welcome.html');
res.sendFile(pathToSignup);
}
});

router.get('/register', function(req,res){
if(req.isAuthenticated()) {
res.send('You have already logged in. No need to signup again');
}
else{
const pathToSignup = path.join(__dirname, '../views/signup.html');
res.sendFile(pathToSignup);
}
});

router.get('/login',function(req,res){
const pathToSignup = path.join(__dirname, '../views/login.html');
res.sendFile(pathToSignup);
});


router.post('/register', (req, res, next) => {
const user = new User({
firstName: req.body.firstName,
lastName: req.body.lastName,
username: req.body.userName,
password: req.body.password,
email: req.body.email
});

bcrypt.hash(user.password, 10, function(err, hash){
if(err){
console.log(err);
return res.status(500).send('Internal Server Error');
}
user.password = hash;
user.save()
.then(data => {
console.log('Successfully created a new User');
// passport.authenticate('local')(req, res, function() {
// res.status(201).send('Successfully created a new User');
// });
res.redirect('/login');

})
.catch(error => {
console.log(error);
res.status(500).send('Internal Server Error');
});

});
});

router.get('/users', async (req, res) => {
if (req.isAuthenticated()) {
let result = await User.find();
if (result) {
res.render('availableUsers', {'users' : result});
} else {
res.status(404);
}
} else {
res.send('<h1>You are not authenticated</h1><p><a href="/login">Login</a></p>');
}
})

router.post('/login', passport.authenticate('local', {failureRedirect: '/login-failure', successRedirect: '/login-success'}));

router.get('/login-success', (req, res, next) => {
res.send('<p>You successfully logged in. --> <a href="/users">See all users</a></p>');
});

router.get('/logout', (req, res, next) => {
req.logout(err => {
console.log(err);
});
res.redirect('/users');
});

router.get('/login-failure', (req, res, next) => {
res.send('You entered the wrong password.');
});

module.exports = router;
Loading

0 comments on commit cd3af23

Please sign in to comment.