Advanced Node and Express - How to Use Passport Strategies

Unknown authentication strategy “local” error.
I even compared with the solution provided on gitHub here .
Still not getting it where is the actual problem. Help me out.
My code so far,

'use strict';

const express     = require('express');
const bodyParser  = require('body-parser');
const fccTesting  = require('./freeCodeCamp/fcctesting.js');
const pug         = require('pug');
const session     = require('express-session');
const passport    = require('passport');
const cors        = require('cors');
const ObjectID    = require('mongodb').ObjectID;
const mongo       = require('mongodb').MongoClient;
const LocalStrategy = require('passport-local').Strategy;

const app = express();

fccTesting(app); //For FCC testing purpose
app.use(cors());
app.use('/public', express.static(process.cwd() + '/public'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

app.use(session({
  secret: process.env.SESSION_SECRET,
  resave: true,
  saveUninitialized: true
}));

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


app.set('view engine', 'pug');

mongo.connect(process.env.DATABASE, (err, db) => {
  if(err) console.log('Database error', err);
  else {
    passport.serializeUser((user, done) => {
      done(null, user._id);
    });
    
    app.listen(process.env.PORT || 3000, () => {
      console.log("Listening on port " + process.env.PORT);
    });
    
    passport.deserializeUser((id, done) => {
      db.collection('users').fineOne({_id: new ObjectID(id)}, (err, doc) => {
    });
      
    passport.use(new LocalStrategy(function(username, password, done) {
      db.collection('users').findOne({username: username}, (err, user) =>{
        console.log(username, 'tried to log in');
        
        if(err) return done(err);
        if(!user) return done(null, false);
        if(!password) return done(null, false);
        return done(null, user)
      });
    }));
  });
    
  app.route('/')
    .get((req, res) => {
      res.render(process.cwd() + '/views/pug/index.pug', {title: 'Hello', message: 'Please login', showLogin: true});
    });

  app.route('/login').post(passport.authenticate('local', {failureRedirect: '/'}), (req, res) => {
    res.redirect('/profile');
  });
    
    app.route('/profile').get((req, res) => {
      res.render(process.cwd() + '/views/pug/profile.pug')
    });
  }
});

Problem link

Glith url of my solution.

Thanks in advance!!!

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

Try just

const LocalStrategy = require('passport-local');

I tried that first. This one I used after seeing in stackoverflow. Both does not work.

Have you finished your .env file ?
You need to add SESSION_SECRET=9 or any other number , according " Advanced Node and Express - Set up Passport":

To set up your express app to use use the session we'll define just a few basic options. Be sure to add 'SESSION_SECRET' to your .env file and give it a random value. This is used to compute the hash used to encrypt your cookie!
1 Like

here is my solution:

'use strict';

const express     = require('express');
const bodyParser  = require('body-parser');
const fccTesting  = require('./freeCodeCamp/fcctesting.js');
const pug         = require('pug');
const session     = require('express-session');
const passport    = require('passport');
const LocalStrategy = require('passport-local');
const ObjectID    = require('mongodb').ObjectID;
const mongo       = require('mongodb').MongoClient;
const app = express();
const cors = require('cors');
app.use(cors());


fccTesting(app); //For FCC testing purposes
app.use('/public', express.static(process.cwd() + '/public'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));


app.use(session({
  secret: process.env.SESSION_SECRET,
  resave: true,
  saveUninitialized: true
}));

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

app.set('view engine', 'pug');

app.route('/')
  .get((req, res) => {
    // res.sendFile(process.cwd() + '/views/index.html');
    res.render(process.cwd() + '/views/pug/index.pug', {title: 'Hello', message: 'Please login'});
  
  });

passport.serializeUser((user, done) => {
   done(null, user._id);
 });
    

app.listen(process.env.PORT || 3000, () => {
  console.log("Listening on port " + process.env.PORT);
});


passport.deserializeUser((id, done) => {
        db.collection('users').findOne(
            {_id: new ObjectID(id)},
            (err, doc) => {
                done(null, null);
            }
        );
    });



Hey Guys;
I am getting the same error:
Error: Unknown authentication strategy “local”

It is occuring on my /login where I try to authenticate the user.

I have set up a new mongo database and included the DB_URI in the env file, but fails when I try to login. The test fails being redirected from /login, but my app shows the error. I believe it’s not authenticating AND failureRedirect isn’t working…
Any ideas what’s up?

my code

"use strict";

const express = require("express");
const fccTesting = require("./freeCodeCamp/fcctesting.js");
const pug       = require('pug');
const app = express();
const bodyParser = require('body-parser');
const session = require("express-session");
const passport= require("passport");

const ObjectID = require('mongodb').ObjectID;
const mongo = require('mongodb').MongoClient;
const LocalStrategy = require('passport-local');
const cors = require('cors');

fccTesting(app); //For FCC testing purposes
app.use(cors());
app.use("/public", express.static(process.cwd() + "/public"));
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.set('view engine', 'pug');

app.use(session({
  secret: process.env.SESSION_SECRET,
  resave: true,
  saveUninitialized: true,
}));
app.use(passport.initialize());
app.use(passport.session());

mongo.connect(process.env.DATABASE, (err, db) => {
  if(err) {
    console.log(db+'Database error: ' + err);
  } else {
    console.log('Successful database connection');

    passport.serializeUser((user,done)=>{
      done(null, user._id);
    });
    
    passport.deserializeUser((id, done) => {
      db.collection('users').findOne(
      {_id: new ObjectID(id)},
      (err, doc) => {
        done(null, doc);
      }
  );
});
passport.use(new LocalStrategy(
  function(username, password, done) {
    db.collection('users').findOne({ username: username }, function (err, user) {
      console.log('User '+ username +' attempted to log in.');
      if (err) { return done(err); }
      if (!user) { return done(null, false); }
      if (password !== user.password) { return done(null, false); }
      return done(null, user);
    });
  }
));
    
 
  }

app.route("/").get((req, res) => {
  //Change the response to render the Pug template
  res.render("./pug/index", {title: 'Hello', message: 'Please login', showLogin: true});
});

app.route("/login")
  .post(passport.authenticate('local', { failureRedirect: '/' }), (req,res)=> {
    console.log("hit /login with "+req.body);
    res.redirect('/profile');
  //  res.send("hi");
});

app.route("/profile").get((req,res)=>{
  res.render("./pug/profile", {title: 'Hello', message: 'Please login', showLogin: true});
});


app.listen(process.env.PORT || 3000, () => {
  console.log("Listening on port " + process.env.PORT);
});
 
});

to this package
const LocalStrategy = require(‘passport-local’).Strategy;