├── .gitignore ├── src ├── views │ ├── index.ejs │ ├── profile.ejs │ ├── signin.ejs │ ├── signup.ejs │ └── layouts │ │ └── main.ejs ├── keys.js ├── database.js ├── models │ └── user.js ├── routes │ └── index.js ├── server.js └── passport │ └── local-auth.js └── package.json /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /src/views/index.ejs: -------------------------------------------------------------------------------- 1 | <%- layout('layouts/main') %> 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/keys.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | mongodb: { 3 | URI: 'mongodb://localhost:27017/login-node' 4 | } 5 | }; 6 | -------------------------------------------------------------------------------- /src/views/profile.ejs: -------------------------------------------------------------------------------- 1 | <%- layout('layouts/main') %> 2 | 3 | <%= user._id%> 4 | <%= user.email %> 5 | <%= user.password %> 6 | -------------------------------------------------------------------------------- /src/views/signin.ejs: -------------------------------------------------------------------------------- 1 | <%- layout('layouts/main') %> 2 | 3 |
4 | 5 | 6 | 9 |
10 | -------------------------------------------------------------------------------- /src/views/signup.ejs: -------------------------------------------------------------------------------- 1 | <%- layout('layouts/main')%> 2 |
3 | 4 | 5 | 8 |
9 | 10 | -------------------------------------------------------------------------------- /src/database.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose'); 2 | const { mongodb } = require('./keys'); 3 | 4 | mongoose.set('useFindAndModify', false); 5 | mongoose.connect(mongodb.URI, { 6 | useNewUrlParser: true 7 | }) 8 | .then(db => console.log('DB is connected')) 9 | .catch(err => console.log(err)); 10 | -------------------------------------------------------------------------------- /src/models/user.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose'); 2 | const bcrypt = require('bcrypt-nodejs'); 3 | 4 | const { Schema } = mongoose; 5 | 6 | const userSchema = new Schema({ 7 | email: String, 8 | password: String 9 | }); 10 | 11 | userSchema.methods.encryptPassword = (password) => { 12 | return bcrypt.hashSync(password, bcrypt.genSaltSync(10)); 13 | }; 14 | 15 | userSchema.methods.comparePassword= function (password) { 16 | return bcrypt.compareSync(password, this.password); 17 | }; 18 | 19 | module.exports = mongoose.model('user', userSchema); 20 | -------------------------------------------------------------------------------- /src/views/layouts/main.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Nodejs Passport Local 6 | 7 | 8 | 9 | <% if (!user) { %> 10 | Signin 11 | Signup 12 | <% } else { %> 13 | Logout 14 | Profle 15 | <% } %> 16 | 17 | <%if (signinMessage) {%> 18 |

<%= signinMessage %>

19 | <% } %> 20 | <%if (signupMessage) {%> 21 |

<%= signupMessage %>

22 | <% } %> 23 | 24 | <%- body %> 25 | 26 | 27 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nodejs-passport-local", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "dev": "nodemon ./src/server.js" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "devDependencies": { 13 | "nodemon": "^1.18.3" 14 | }, 15 | "dependencies": { 16 | "bcrypt-nodejs": "0.0.3", 17 | "connect-flash": "^0.1.1", 18 | "ejs-mate": "^2.3.0", 19 | "express": "^4.16.3", 20 | "express-session": "^1.15.6", 21 | "mongoose": "^5.2.9", 22 | "morgan": "^1.9.0", 23 | "passport": "^0.4.0", 24 | "passport-local": "^1.0.0" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/routes/index.js: -------------------------------------------------------------------------------- 1 | const router = require('express').Router(); 2 | const passport = require('passport'); 3 | 4 | router.get('/', (req, res, next) => { 5 | res.render('index'); 6 | }); 7 | 8 | router.get('/signup', (req, res, next) => { 9 | res.render('signup'); 10 | }); 11 | 12 | router.post('/signup', passport.authenticate('local-signup', { 13 | successRedirect: '/profile', 14 | failureRedirect: '/signup', 15 | failureFlash: true 16 | })); 17 | 18 | router.get('/signin', (req, res, next) => { 19 | res.render('signin'); 20 | }); 21 | 22 | 23 | router.post('/signin', passport.authenticate('local-signin', { 24 | successRedirect: '/profile', 25 | failureRedirect: '/signin', 26 | failureFlash: true 27 | })); 28 | 29 | router.get('/profile',isAuthenticated, (req, res, next) => { 30 | res.render('profile'); 31 | }); 32 | 33 | router.get('/logout', (req, res, next) => { 34 | req.logout(); 35 | res.redirect('/'); 36 | }); 37 | 38 | 39 | function isAuthenticated(req, res, next) { 40 | if(req.isAuthenticated()) { 41 | return next(); 42 | } 43 | 44 | res.redirect('/') 45 | } 46 | 47 | module.exports = router; 48 | -------------------------------------------------------------------------------- /src/server.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const path = require('path'); 3 | const engine = require('ejs-mate'); 4 | const flash = require('connect-flash'); 5 | const session = require('express-session'); 6 | const passport = require('passport'); 7 | const morgan = require('morgan'); 8 | 9 | // initializations 10 | const app = express(); 11 | require('./database'); 12 | require('./passport/local-auth'); 13 | 14 | // settings 15 | app.set('port', process.env.PORT || 3000); 16 | app.set('views', path.join(__dirname, 'views')) 17 | app.engine('ejs', engine); 18 | app.set('view engine', 'ejs'); 19 | 20 | // middlewares 21 | app.use(morgan('dev')); 22 | app.use(express.urlencoded({extended: false})); 23 | app.use(session({ 24 | secret: 'mysecretsession', 25 | resave: false, 26 | saveUninitialized: false 27 | })); 28 | app.use(flash()); 29 | app.use(passport.initialize()); 30 | app.use(passport.session()); 31 | 32 | app.use((req, res, next) => { 33 | app.locals.signinMessage = req.flash('signinMessage'); 34 | app.locals.signupMessage = req.flash('signupMessage'); 35 | app.locals.user = req.user; 36 | console.log(app.locals) 37 | next(); 38 | }); 39 | 40 | // routes 41 | app.use('/', require('./routes/index')); 42 | 43 | // Starting the server 44 | app.listen(app.get('port'), () => { 45 | console.log('server on port', app.get('port')); 46 | }); 47 | -------------------------------------------------------------------------------- /src/passport/local-auth.js: -------------------------------------------------------------------------------- 1 | const passport = require('passport'); 2 | const LocalStrategy = require('passport-local').Strategy; 3 | 4 | const User = require('../models/user'); 5 | 6 | passport.serializeUser((user, done) => { 7 | done(null, user.id); 8 | }); 9 | 10 | passport.deserializeUser(async (id, done) => { 11 | const user = await User.findById(id); 12 | done(null, user); 13 | }); 14 | 15 | passport.use('local-signup', new LocalStrategy({ 16 | usernameField: 'email', 17 | passwordField: 'password', 18 | passReqToCallback: true 19 | }, async (req, email, password, done) => { 20 | const user = await User.findOne({'email': email}) 21 | console.log(user) 22 | if(user) { 23 | return done(null, false, req.flash('signupMessage', 'The Email is already Taken.')); 24 | } else { 25 | const newUser = new User(); 26 | newUser.email = email; 27 | newUser.password = newUser.encryptPassword(password); 28 | console.log(newUser) 29 | await newUser.save(); 30 | done(null, newUser); 31 | } 32 | })); 33 | 34 | passport.use('local-signin', new LocalStrategy({ 35 | usernameField: 'email', 36 | passwordField: 'password', 37 | passReqToCallback: true 38 | }, async (req, email, password, done) => { 39 | const user = await User.findOne({email: email}); 40 | if(!user) { 41 | return done(null, false, req.flash('signinMessage', 'No User Found')); 42 | } 43 | if(!user.comparePassword(password)) { 44 | return done(null, false, req.flash('signinMessage', 'Incorrect Password')); 45 | } 46 | return done(null, user); 47 | })); 48 | --------------------------------------------------------------------------------