├── .gitignore ├── app.js ├── config ├── auth.js └── passport.js ├── models └── user.js ├── package.json ├── routes ├── index.js └── users.js └── views ├── dashboard.ejs ├── layout.ejs ├── login.ejs ├── partials └── messages.ejs ├── register.ejs └── welcome.ejs /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const mongoose = require('mongoose'); 3 | const router = express.Router(); 4 | const app = express(); 5 | const expressEjsLayout = require('express-ejs-layouts') 6 | const flash = require('connect-flash'); 7 | const session = require('express-session'); 8 | const passport = require("passport"); 9 | 10 | //passport config: 11 | require('./config/passport')(passport) 12 | //mongoose 13 | mongoose.connect('mongodb://localhost/test',{useNewUrlParser: true, useUnifiedTopology : true}) 14 | .then(() => console.log('connected,,')) 15 | .catch((err)=> console.log(err)); 16 | 17 | //EJS 18 | app.set('view engine','ejs'); 19 | app.use(expressEjsLayout); 20 | //BodyParser 21 | app.use(express.urlencoded({extended : false})); 22 | //express session 23 | app.use(session({ 24 | secret : 'secret', 25 | resave : true, 26 | saveUninitialized : true 27 | })); 28 | app.use(passport.initialize()); 29 | app.use(passport.session()); 30 | app.use(flash()); 31 | app.use((req,res,next)=> { 32 | res.locals.success_msg = req.flash('success_msg'); 33 | res.locals.error_msg = req.flash('error_msg'); 34 | res.locals.error = req.flash('error'); 35 | next(); 36 | }) 37 | 38 | //Routes 39 | app.use('/',require('./routes/index')); 40 | app.use('/users',require('./routes/users')); 41 | 42 | app.listen(3000); -------------------------------------------------------------------------------- /config/auth.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | ensureAuthenticated : function(req,res,next) { 3 | if(req.isAuthenticated()) { 4 | return next(); 5 | } 6 | req.flash('error_msg' , 'please login to view this resource'); 7 | res.redirect('/users/login'); 8 | } 9 | } -------------------------------------------------------------------------------- /config/passport.js: -------------------------------------------------------------------------------- 1 | const User = require('../models/user'); 2 | const LocalStrategy = require('passport-local').Strategy; 3 | const bcrypt = require('bcrypt'); 4 | 5 | module.exports = function(passport){ 6 | passport.use( 7 | new LocalStrategy({usernameField: 'email'},(email,password,done)=>{ 8 | //match user 9 | User.findOne({email:email}) 10 | .then((user)=>{ 11 | if(!user){ 12 | return done(null,false,{message:'email not registered'}); 13 | } 14 | //math passwords 15 | bcrypt.compare(password,user.password,(err,isMatch)=>{ 16 | if(err) throw err; 17 | if(isMatch){ 18 | return done(null,user); 19 | } else{ 20 | return done(null,false,{message: 'password incorrect'}); 21 | } 22 | }) 23 | }) 24 | .catch((err)=>{console.log(err)}) 25 | }) 26 | ) 27 | passport.serializeUser(function(user,done) { 28 | done(null,user.id); 29 | }) 30 | passport.deserializeUser(function(id,done){ 31 | User.findById(id,function(err,user){ 32 | done(err,user); 33 | }) 34 | }) 35 | } -------------------------------------------------------------------------------- /models/user.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose'); 2 | const UserSchema = new mongoose.Schema({ 3 | name :{ 4 | type : String, 5 | required : true 6 | } , 7 | email :{ 8 | type : String, 9 | required : true 10 | } , 11 | password :{ 12 | type : String, 13 | required : true 14 | } , 15 | date :{ 16 | type : Date, 17 | default : Date.now 18 | } 19 | }); 20 | const User= mongoose.model('User',UserSchema); 21 | 22 | module.exports = User; -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "passport-learning", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "devDependencies": { 13 | "nodemon": "^2.0.4" 14 | }, 15 | "dependencies": { 16 | "bcrypt": "^5.0.0", 17 | "connect-flash": "^0.1.1", 18 | "ejs": "^3.1.3", 19 | "express": "^4.17.1", 20 | "express-ejs-layouts": "^2.5.0", 21 | "express-session": "^1.17.1", 22 | "mongoose": "^5.9.21", 23 | "passport": "^0.4.1", 24 | "passport-local": "^1.0.0" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /routes/index.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const router = express.Router(); 3 | const {ensureAuthenticated} = require('../config/auth') 4 | //login page 5 | router.get('/', (req,res)=>{ 6 | res.render('welcome'); 7 | }) 8 | //register page 9 | router.get('/register', (req,res)=>{ 10 | res.render('register'); 11 | }) 12 | router.get('/dashboard',ensureAuthenticated,(req,res)=>{ 13 | res.render('dashboard',{ 14 | user: req.user 15 | }); 16 | }) 17 | module.exports = router; -------------------------------------------------------------------------------- /routes/users.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const router = express.Router(); 3 | const User = require("../models/user"); 4 | const bcrypt = require('bcrypt'); 5 | const passport = require('passport'); 6 | //login handle 7 | router.get('/login',(req,res)=>{ 8 | res.render('login'); 9 | }) 10 | router.get('/register',(req,res)=>{ 11 | res.render('register') 12 | }) 13 | //Register handle 14 | router.post('/login',(req,res,next)=>{ 15 | passport.authenticate('local',{ 16 | successRedirect : '/dashboard', 17 | failureRedirect: '/users/login', 18 | failureFlash : true 19 | })(req,res,next) 20 | }) 21 | //register post handle 22 | router.post('/register',(req,res)=>{ 23 | const {name,email, password, password2} = req.body; 24 | let errors = []; 25 | console.log(' Name ' + name+ ' email :' + email+ ' pass:' + password); 26 | if(!name || !email || !password || !password2) { 27 | errors.push({msg : "Please fill in all fields"}) 28 | } 29 | //check if match 30 | if(password !== password2) { 31 | errors.push({msg : "passwords dont match"}); 32 | } 33 | 34 | //check if password is more than 6 characters 35 | if(password.length < 6 ) { 36 | errors.push({msg : 'password atleast 6 characters'}) 37 | } 38 | if(errors.length > 0 ) { 39 | res.render('register', { 40 | errors : errors, 41 | name : name, 42 | email : email, 43 | password : password, 44 | password2 : password2}) 45 | } else { 46 | //validation passed 47 | User.findOne({email : email}).exec((err,user)=>{ 48 | console.log(user); 49 | if(user) { 50 | errors.push({msg: 'email already registered'}); 51 | res.render('register',{errors,name,email,password,password2}) 52 | } else { 53 | const newUser = new User({ 54 | name : name, 55 | email : email, 56 | password : password 57 | }); 58 | 59 | //hash password 60 | bcrypt.genSalt(10,(err,salt)=> 61 | bcrypt.hash(newUser.password,salt, 62 | (err,hash)=> { 63 | if(err) throw err; 64 | //save pass to hash 65 | newUser.password = hash; 66 | //save user 67 | newUser.save() 68 | .then((value)=>{ 69 | console.log(value) 70 | req.flash('success_msg','You have now registered!'); 71 | res.redirect('/users/login'); 72 | }) 73 | .catch(value=> console.log(value)); 74 | 75 | })); 76 | } 77 | }) 78 | } 79 | }) 80 | //logout 81 | router.get('/logout',(req,res)=>{ 82 | req.logout(); 83 | req.flash('success_msg','Now logged out'); 84 | res.redirect('/users/login'); 85 | }) 86 | module.exports = router; -------------------------------------------------------------------------------- /views/dashboard.ejs: -------------------------------------------------------------------------------- 1 |
Welcome <%= user.name %>
3 | Logout -------------------------------------------------------------------------------- /views/layout.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 |<%= error.msg %>
4 | <% }) %> 5 | <% } %> 6 | 7 | <% if(success_msg!= '') { %> 8 |<%=success_msg %>
9 | <% } %> 10 | 11 | <% if(error_msg != '') { %> 12 |<%= error_msg %>
13 | <% } %> 14 | <% if(error != '') { %> 15 |<%= error %>
16 | <% } %> -------------------------------------------------------------------------------- /views/register.ejs: -------------------------------------------------------------------------------- 1 |Have An Account? Login
-------------------------------------------------------------------------------- /views/welcome.ejs: -------------------------------------------------------------------------------- 1 | 2 |Create an account or login
4 | Register 6 | Login 7 | --------------------------------------------------------------------------------