Authenticate data with passport middleware after submit logging how to implement while multiple routes

Viewed 54

I'm trying to create a user register for my website.

I came accross a problem that I have hard time to solve.

I want to authenticate data from the users while login with the database.

My problem is that I'm getting confused because I do no know where to put all the code of the passport configuration.

At the end I would like to display the error message on the login route.

Hope I am clear enough.

Please let me know if you need further information.

Here is a picture of my file organization :

File organization

Here is my code

server.js

const express = require('express')
const router = express.Router()

const Users = require('./models/register')

const dotenv = require('dotenv')
dotenv.config();
const app = express()
const passport = require('passport')
const flash = require('express-flash')
const session = require('express-session')
const expressLayouts = require('express-ejs-layouts')

const indexRouter = require('./routes/index')
const registerRouter = require('./routes/register')
const loginRouter = require('./routes/login')

const initializePassport = require('./passport.config')
initializePassport(
  passport,
  email => users.find(user => user.email === email),
  id => users.find(user => user.id === id)
)

app.set('view engine','ejs')
app.set('views', __dirname + '/views')
app.set('layout', 'layouts/layout')

app.use(expressLayouts)
app.use(express.static('public'))

app.use(express.urlencoded({ extended : false }))
app.use(flash())
app.use(session({
  secret: process.env.SESSION_SECRET,
  resave: false,
  saveUninitialized: false
}))
app.use(passport.initialize())
app.use(passport.session())

const mongoose = require('mongoose');

mongoose.connect(process.env.DATABASE_URL, {
useNewUrlParser: true, useUnifiedTopology: true}).then(()=>{
    console.log('Successfully connected to the mongoDB Atlas!')
}).catch((error)=>{
    console.log('impossible to connect to the mondoDB Atlas !')
    console.error(error);
});

app.use('/', indexRouter)
app.use('/register', registerRouter)
app.use('/login', loginRouter)

app.listen(process.env.PORT || 3000)

login.js

if( process.env.NODE_END !== 'production') {
    require('dotenv').config()
}

const express = require('express')
const router = express.Router()
const Users = require('../models/register')

router.get('/', (req, res) =>{
    res.render('login/login')
})

// router.post('/', async (req, res) =>{
//     // await Users.find().then((users) =>{
//     //     console.log(users[0])
//     // }) 
//     console.log(req.body)
//     res.redirect('/')
// })

module.exports = router

passport.config.js

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

function initialize(passport, getUserByEmail, getUserById) {
const authenticateUser = async (email, password, status, done) => {
    const user = getUserByEmail(email)
    if (user == null) {
    return done(null, false, { message: 'No user with that email' })
    }
    if(status == null) {
        return done(null, false, { message: 'wrong page' })
    }
    try {
    if (await bcrypt.compare(password, user.password)) {
        return done(null, user)
    } else {
        return done(null, false, { message: 'Password incorrect' })
    }
    } catch (e) {
    return done(e)
    }
}

passport.use(new LocalStrategy({ usernameField: 'email' }, authenticateUser))
passport.serializeUser((user, done) => done(null, user.id))
passport.deserializeUser((id, done) => {
    return done(null, getUserById(id))
})
}

module.exports = initialize

login.ejs

<h1>Login</h1>
<% if (messages.error) { %>
    <%= messages.error %>
<% } %>
<form action="/login" method="POST">
    <%- include('../partials/register_form.ejs') %>
    <button type="submit">Login</button>
</form>

<a href="Register">Register</a>
0 Answers
Related