I am creating a login and user registration with Node.js.
the problem is that passport always takes me to failureRedirect and i dont know why
'use strict';
const express = require('express');
const User = require('../../models/User');
const { Router } = require('express');
const router = express.Router();
const passport = require('passport')
router.get('/', (req, res, next) => {
res.render('index');
});
// GET /signup
router.get('/signup', (req, res, next) => {
res.render('signup');
})
// POST /signup
router.post('/signup', passport.authenticate('local-signup', {
successRedirect: '/',
failureRedirect: '/signup',
passReqToCallback: true
}))
// GET /login
router.get('/login', (req, res, next) => {
res.render('login');
});
// POST /login
router.post('/login', passport.authenticate('local-login', {
successRedirect: '/',
failureRedirect: '/login',
passReqToCallback: true
}));
module.exports = router;
This my app.js file
var createError = require('http-errors');
var express = require('express');
var cors = require('cors');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
const passport = require('passport')
const session = require('express-session')
const flash = require('connect-flash')
// connection to the DB
require('./lib/connectMongoose');
// require passport
require('./passport/local-auth')
// connection to API
const usersApi = require('./routes/api/users')
const postsRouter = require('./routes/api/posts')
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.use(cors());
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use(session({
secret: 'mysecretsession',
resave: false,
saveUninitialized: false
}))
app.use(flash())
app.use(passport.initialize())
app.use(passport.session())
app.use((req, res, next)=> {
app.locals.registerMessage = req.flash('signupMessage')
app.locals.loginMessage = req.flash('loginMessage')
next();
});
// API routes
app.use('/api/posts', postsRouter);
app.use('/api/users', usersApi);
app.use('/', require ('./routes/api/login'));
app.use('/', indexRouter);
app.use('/users', usersRouter);
// catch 404 and forward to error handler
app.use(function(req, res, next) {
next(createError(404));
});
// error handler
app.use(function(err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
// render the error page
res.status(err.status || 500);
res.render('error');
});
module.exports = app;
This is my passport file:
const passport = require('passport');
const localStrategy = require('passport-local').Strategy;
const User = require('../models/User')
//serialize user to save signup
passport.serializeUser((user, done) => {
done(null, user.id)
});
//authenticate the id in the browser
passport.deserializeUser( async(id, done) => {
const user = await User.findById(id)
done(null, user)
});
// receive registration and validate it
passport.use('local-signup', new localStrategy({
usernameField: 'username',
emailField: 'email',
passwordField: 'password',
passReqToCallback: true
} , async (req, email, username, password, done) => {
const user = await User.findOne({ email: email }, { username: username})
if (user) {
return done(null, false, req.flash('signupMessage', 'The email or username is already taken'))
} else {
const newUser = newUser();
newUser.username = username;
newUser.email = email;
newUser.password = newUser.encryptPassword(password);
console.log(newUser)
await newUser.save();
done(null, newUser);
}
}))
passport.use('local-login', new localStrategy({
usernameField: 'email',
passwordField: 'password',
passReqToCallback: true
}, async (req, email, password, done) => {
const user = await User.findOne({email: email});
if(!user) {
return done(null, false, req.flash('loginMessage', 'No User Found'));
}
if(!user.comparePassword(password)) {
return done(null, false, req.flash('loginMessage', 'Incorrect Password'));
}
return done(null, user);
}));
What I need is that when doing the login it takes me to the home page of the application. Apparently I have some error and that’s why it takes me to the login page again but I don’t get the error….