web-dev-qa-db-de.com

Fehler mit passportjs: Unbekannte Authentifizierungsstrategie "local"

Ich entwickle eine nodejs-Anwendung und verwende passportjs zur Authentifizierung. Ich benutze die lokale Passstrategie. Beim Versuch, mich anzumelden, wird jedoch folgender Fehler angezeigt:

Error: Unknown authentication strategy "local"
    at attempt (/home/project/node_modules/passport/lib/middleware/authenticate.js:166:37)
    at authenticate (/home/project/node_modules/passport/lib/middleware/authenticate.js:338:7)
    at exports.authenticate (/home/project/controllers/RegistrationsController.js:87:4)
    at callbacks (/home/project/node_modules/express/lib/router/index.js:164:37)
    at param (/home/project/node_modules/express/lib/router/index.js:138:11)
    at pass (/home/project/node_modules/express/lib/router/index.js:145:5)
    at Router._dispatch (/home/project/node_modules/express/lib/router/index.js:173:5)
    at Object.router (/home/project/node_modules/express/lib/router/index.js:33:10)
    at next (/home/project/node_modules/express/node_modules/connect/lib/proto.js:193:15)
    at /home/project/node_modules/express-flash/lib/express-flash.js:31:7

Hier ist meine passport-config.js-Datei:

var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
var User = require('../models/user');

passport.serializeUser(function(user, done) {
  done(null, user.id);
});

passport.deserializeUser(function(id, done) {
  User.findById(id, function (err, user) {
    done(err, user);
  });
});

passport.use({usernameField: 'emailAddress'}, new LocalStrategy(function(username, password, done) {
  User.findOne({ emailAddress: username }, function(err, user) {
    if(err){
        return done(err);
    }
    if (!user) {
        return done(null, false, { message: 'Email ' + username + ' not found'});
    }
    else{
        //check if password matches and pass parameters in done accordingly
         }
     });
}));

Und das Folgende ist meine RegistrationsController.js-Datei, in der sich meine Authentifizierungs-API befindet.

var passport = require('passport');

exports.authenticate = function(req, res, next){
    console.log('Login request!');
    passport.authenticate('local', function(err, user, info) {
        console.log('In authenticate callback!');
    if (err) return next(err);

    if (!user) {
      req.flash('errors', { msg: info.message });
      res.status(500).json({message: info.message});
    }
      res.json(user);
    })(req, res, next);
}

Habe mir den Code seit 2 Tagen angesehen, konnte den Fehler aber noch nicht herausfinden. Ich habe sowohl passport- als auch passport-local-Module installiert. Jede Hilfe wäre sehr dankbar.

11
User97

Dieser Code enthält einen Syntaxfehler. usernameField: 'emailAddress' Muss wie folgt im LocalStrategy-Konstruktor übergeben werden ...

passport.use(new LocalStrategy({
   usernameField: 'email'
}, yourAuthenticateFunction));
9
nabeel

gib npm install --save passport-local ein und füge dann in app.js diese Zeile ein. var LocalStrategy = require("passport-local"); und verwende dann diese Middleware:

app.use(passport.initialize());
app.use(passport.session());
passport.use(new LocalStrategy(User.authenticate()));
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());
0
samanthi22

Das passierte mir, weil meine app.ts-Datei zwar die Passport-Konfiguration importierte, sie aber keiner Route zugewiesen war, sodass die Datei nie analysiert wurde. Ich habe es in einem Controller verwendet, um einen POST /login zu authentifizieren.

Haftungsausschluss - Ich bin nicht sicher, ob "geparst" das richtige Wort ist, aber es schien der Fall zu sein, weil eine console.log('xfngr') in dieser Datei erst ausgegeben wurde, nachdem ich die Route eingegeben habe.

app.ts

...
import * as passportConfig from "./config/passport";
...
...

Ich habe eine Route hinzugefügt, die eine Eigenschaft aus der passportConfig verwendet, und sie hat wieder funktioniert.

app.ts

...
import * as passportConfig from "./config/passport";
...
...
...
app.get("/account", passportConfig.isAuthenticated, userController.getAccount);
0
nick.graziano