NodeJS Authentication with Passport - Express session & Passport Local Strategy

47 Views Asked by At

I'm newbie in authentication i'm stuck from 3 days I try googling to solve the problem but still stuck at the same point.

use Passport to register a new user and log in, this new user saves in the database but when I want to login I got 404 Not Found.

when my user register and login using passport js he will login and store cookie in browser that receive from database

details

index.js File: This file initializes your Express application, sets up middleware, and starts the server.

mongoose.js File: This file establishes a connection to your MongoDB database.

passport.js File: Passport.js handles user authentication. Ensure that your Local Strategy is correctly configured to authenticate users against your database.

user_controller.js File: This file contains controller methods for user-related actions like signing up, signing in, creating users, and managing sessions. Make sure redirection after user creation and login is configured correctly.

user.js Router File: This file defines routes for user-related actions. Check that routes are correctly mapped to controller methods and that redirection is set up properly.

this is index.js file

const express = require('express');
const path = require('path');
const expressLayouts = require('express-ejs-layouts');
const db = require('./config/mongoose');
const cookieParser = require('cookie-parser');
const session = require('express-session');
const passport = require('passport');
const passportLocal = require('./config/passport-local-strategy');

const app = express();
const port = 8000;

app.use(expressLayouts);
app.use(express.urlencoded({ extended: true }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'assets')));
app.set('view engine', 'ejs');
app.set('views', path.join(__dirname, 'views'));

app.use(session({
    name: 'codeial',
    secret: "Adnan",
    saveUninitialized: false,
    resave: false,
    cookie: {
        maxAge: (1000 * 60 * 100)
    }
}));

app. use(passport. initialize());
app. use(passport. Session());

app. use('/', require('./routes/index'));

app.listen(port, (err) => {
    if (err) {
        console.log(`Error in running the server: ${err}`);
        return;
    }
    console.log(`Server is running on port: ${port}`);
});

this is mongoose.js file

const mongoose = require('mongoose');

mongoose.connect('mongodb://localhost/codeial_development')


const db = mongoose.connection;

db.on('error', console.error.bind(console , 'error connecting to db'));


db.once('open', function(){
    console.log('successfullly connect to the databbase');
})

this is passport.js file

//plemented Passport's Local Strategy for user authentication

//import passport
const passport = require('passport');

//import LocalStrategy
const LocalStrategy = require('passport-local').Strategy;

const User = require('../models/user')



    passport.use(new LocalStrategy({
        usernameField: 'email'
    },
    function(email, password, done){
        User.findOne({email: email}, function(err, user){
            if(err){
                console.log('Error in finding user --> Passport');
                return done(err);
            }
            if(!user || user.password != password){
                console.log('Invalid username/password');
                return done(null, false);
            }
            return done(null, user);
        });
    }));
    
    passport.serializeUser(function(user , done){
        done(null , user.id);
    })

    passport.deserializeUser(function(id , done){
        User.findById(id , function(err , user){
            if(err){
                console.log('Error in finding user --> Passport');
            }
            return done(null , user)
        })
    })

passport.checkAuthentication =  function(req, res , next) {
    //if the user is signed in , then pass on the request to the next function ( controller action )
    if(req.isAuthenticated()){
        return next();
    }

    //if the user is not sign in
    return res.redirect('/users/sign-in')
}

passport.setAuthenticationUser = function( req, res , next){
    if(req.isAuthenticated()){
        //container the current signed in user from the session cookie and we are just sending this to the local views
        res.locals.user = req.user;
    }
    next()
}

module.exports=passport;

this is user_controller.js

Implemented controller methods for sign-up, sign-in, user creation, and session handling.

const User = require('../models/user');

module.exports.profile = function (req, res) {
    if (req.isAuthenticated()) {
        return res.render('user_profile', {
            title: 'User profile',
            user: req.user
        });
    } else {
        return res.redirect('/users/sign-in');
    }
};

module.exports.signUp = function (req, res) {
    return res.render('user_sign_up', {
        title: "Codeial | Sign Up "
    });
};

module.exports.signIn = function (req, res) {
    return res.render("user_sign_in", {
        title: "Codeial | Sign In"
    });
};

module.exports.create = function (req, res) {
    if (req.body.password !== req.body.confirm_password) {
        return res.redirect('back');
    }

    User.findOne({ email: req.body.email }).then(user => {
        if (!user) {
            return User.create(req.body)
                .then(newUser => res.redirect('/users/sign-in'))
                .catch(err => {
                    console.log('Error in creating user:', err);
                    return res.redirect('back');
                });
        } else {
            return res.redirect('/users/sign-in');
        }
    }).catch(err => {
        console.log('Error in finding user in signing up:', err);
        return res.redirect('back');
    });
};

module.exports.createSession = function (req, res) {
    return res.redirect('/');
};

this is user.js router file

const express = require('express');
const router = express.Router();
const passport = require('passport');
const userController = require('../controllers/users_controller');

// Define routes
router.get('/profile', userController.profile);
router.get('/sign-up', userController.signUp);
router.get('/sign-in', userController.signIn);
router.post('/create', userController.create);
router.post('/create-session', passport.authenticate(
    'local',
     { failureRedirect: '/users/sign-in' }
     ), userController.createSession);

module.exports = router;

};

0

There are 0 best solutions below