I have a project where i am making a login system with passport.
I use nodejs and mysql. What happens is when i enter info and press login, it just failureRedirect: ‘/auth/login’ without any logs.
Route file
const LocalStrategy = require('passport-local').Strategy;
const passport = require('passport');
const bcrypt = require('bcrypt');
const db = require('../models');
const User = require('../models').User; // Import the User model
passport.serializeUser((user, done) => {
done(null, user.email);
});
passport.deserializeUser(async (email, done) => {
try {
const user = await User.findOne({ where: { email: email } });
if (user) {
done(null, user);
} else {
done(null, false);
}
} catch (err) {
done(err, null);
}
});
passport.use(new LocalStrategy(
async (email, password, done) => {
try {
const user = await User.findOne({ where: { email: email } });
console.log('User:', user); // Log retrieved user object
if (!user) {
return done(null, false);
}
const passwordMatch = await bcrypt.compare(password, user.EncryptedPassword);
console.log('Password Match:', passwordMatch); // Log comparison result
if (passwordMatch) {
return done(null, user);
} else {
return done(null, false);
}
} catch (err) {
return done(err, false);
}
}
));
router.get('/login', function (req, res, next) {
res.render('login', { title: 'SY&FK', user: req.user });
});
router.post('/login/password',
passport.authenticate('local', { failureRedirect: '/auth/login', failureMessage: true }),
function(req, res) {
console.log("authenticate");
console.log(err);
console.log(user);
console.log(info);
res.redirect('/');
});
router.get('/signup', function (req, res, next) {
res.render('signup', { title: 'SY&FK', user: req.user });
});
router.post('/signup', async (req, res) => {
try {
const { firstname, lastname, phone, address, zip, city, email, password } = req.body;
// Check for missing fields
const missingFields = ['firstname', 'lastname', 'phone', 'address', 'zip', 'city', 'email', 'password']
.filter(field => !req.body[field]);
if (missingFields.length > 0) {
return res.status(400).json({ message: 'Missing required fields', missingFields });
}
// Generate a random salt
const salt = await bcrypt.genSalt(10); // Use bcrypt.genSalt for secure random salt
// Hash the password using bcrypt with the generated salt
const hashedPassword = await bcrypt.hash(password, salt);
const newUser = await db.User.create({
firstname,
lastname,
phone,
address,
zip,
city,
email,
EncryptedPassword: hashedPassword,
// Do not store plain text salt in the database
Salt: salt,
RoleID: 1,
});
res.redirect('/auth/login'); // Or your desired redirection
} catch (error) {
console.error('Error in signup route:', error);
res.status(500).json({ message: 'Internal server error' });
}
});
App.js relevant
const { Sequelize, Model, DataTypes } = require('sequelize');
var db = require("./models");
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
var session = require('express-session');
const flash = require('express-flash');
const bcrypt = require('bcrypt');
app.use(session({
secret: 'xxxxxxxxxx',
resave: false,
saveUninitialized: false,
}));
app.use(passport.initialize());
app.use(passport.session());
app.use(passport.authenticate('session'));
app.use(flash());
app.use('/auth', authRouter);
Login.ejs relevant text
<form action="/auth/login/password" method="POST">
<div class="row gy-3 gy-md-4 overflow-hidden">
<div class="col-12">
<input type="email" class="form-control" name="email" id="email" placeholder="[email protected]" required>
<label for="email" class="form-label">Epost</label>
</div>
<div class="col-12">
<input type="password" class="form-control" name="password" id="password" value="" placeholder="Passord" required>
<label for="password" class="form-label">Passord</label>
</div>
<div class="col-12">
<div class="form-check">
<input class="form-check-input" type="checkbox" value="" name="remember_me" id="remember_me">
<label class="form-check-label text-secondary" for="remember_me">
Hold meg innlogget
</label>
</div>
</div>
<div class="col-12">
<div class="d-grid">
<button class="btn bsb-btn-xl btn-primary" type="submit">Logg inn</button>
</div>
</div>
</div>
</form>
Thanks in advance
Tried many different versions of the passport implementation.