Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Passport: Unknown authentication strategy "local"

Tags:

I'm new to NodeJS and I try to build a login/registration system. Registration works fine but I'm currently unable to login.

I find a example app using passport and nodejs, so based on this example I build the registration form and the login form. http://blog.robertonodi.me/node-authentication-series-email-and-password/

When I try to login I get an 'Unknown authentication strategy "local" error'. Can anybody explain what I'm doing wrong?

My code

(edit: added some changes from answers/comments and filenames)

Express config (config/express.config.js)

app.use(session({     store: new MongoStore({         url: 'mongodb://' + config.url + ':' + config.port + '/' + config.name     }),     secret: 'secretkey',     key: 'skey.sid',     resave: false,     saveUninitialized: false,     cookie : {         maxAge: 604800000 //7 days in miliseconds     } }));  app.use(passport.initialize()); app.use(passport.session()); require(path.join(__dirname, 'auth.config'))(passport); //Load passport config  app.use(function(req, res, next) {     req.resources = req.resources || {};    // res.locals.app = config.app;     res.locals.currentUser = req.user;     res.locals._t = function (value) { return value; };     res.locals._s = function (obj) { return JSON.stringify(obj); };     next(); }) 

Passport config (config/auth.config.js)

var path = require('path');  var passport=require('passport'); var User = require(path.join(__dirname, '..', 'models', 'user.model'));  module.exports = function(passport) {      passport.serializeUser(function(user, done){         done(null, false);     });     passport.deserializeUser(function(id, done){         console.log("deserializeUser called", id);         User.findById(id, function (err, user) {             done(err, user);         });     });      //load strategy files     require(path.join(__dirname, 'strategies', 'local-strategy'));     //TODO: Facebook     //TODO: Twitter     //TODO: Google } 

Local strategy (/config/strategies/local-strategy.js)

var passport = require('passport'); var LocalStrategy = require('passport-local').Strategy; var mongoose = require('mongoose'); var User = mongoose.model('User');  module.exports = function () {     console.log("LocalStrategy called");     passport.use(new LocalStrategy({         usernameField : 'username',         passwordField : 'password'     },     function(username, password, done) {         User.authenticate(username, password, function(err, user) {             if (err) {                 return done(err);             }              if(!user) {                 return done(null, false, {message: 'Invalid username or password'});             }              return done(null, user);         })     })) } 

Auth Controller (login only) (/controllers/auth.controller.js)

module.exports.loginUser = function(req,res, next) {     console.log("Auth.config", path.join(__dirname, 'strategies', 'local-strategy'))    passport.authenticate('local', function (err, user, info) {        if (err || !user) {            console.log("Error", info);            return res.status(400).send(info);        }         req.logIn(user, function(err) {            if (err) {               return next(err);               // return res.status(404).send("Username or password incorrect");            }        })         res.status(200).json(user);    })(req, res, next); } 
like image 264
NVO Avatar asked Jan 11 '17 08:01

NVO


People also ask

What is local in passport authenticate?

The local authentication strategy authenticates users using a username and password. The strategy requires a verify callback, which accepts these credentials and calls done providing a user.

Is passport good for authentication?

Passport is a popular, modular authentication middleware for Node. js applications. With it, authentication can be easily integrated into any Node- and Express-based app. The Passport library provides more than 500 authentication mechanisms, including OAuth, JWT, and simple username and password based authentication.

Can passport use multiple strategies?

Passport's middleware is built in a way that allows you to use multiple strategies in one passport.


2 Answers

You forgot to import passport config file in your app.js.

import passport config after initializing passport.

app.use(passport.initialize()); app.use(passport.session()); // Add the line below, which you're missing: require('./path/to/passport/config/file')(passport); 
like image 85
Ravi Shankar Bharti Avatar answered Sep 20 '22 12:09

Ravi Shankar Bharti


i have done like this and it worked

$npm install passport-local

var passport = require('passport'); var LocalStrategy = require('passport-local').Strategy; /* this should be after passport*/     passport.use(new LocalStrategy(   function(username, password, done) {     User.findOne({ username: username }, function(err, user) {       if (err) { return done(err); }       if (!user) {         return done(null, false, { message: 'Incorrect username.' });       }       if (!user.validPassword(password)) {         return done(null, false, { message: 'Incorrect password.' });       }       return done(null, user);     });   } )); 
like image 28
Eassa Nassar Avatar answered Sep 20 '22 12:09

Eassa Nassar