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 :
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>