webentwicklung-frage-antwort-db.com.de

Die lokale Passstrategie wird nicht aufgerufen

Ich bin mir sicher, dass mir hier etwas wirklich Offensichtliches fehlt, aber ich kann das nicht herausfinden. Die Funktion, die ich an den LocalStrategy-Konstruktor übergeben habe, wird beim Senden des Anmeldeformulars nicht aufgerufen.

Code:

var express = require('express');
var http = require('http');
var path = require('path');
var swig = require('swig');
var passport = require('passport');

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

passport.serializeUser(function(user, done) {
  console.log('Serialize user called.');
  done(null, user.name);
});

passport.deserializeUser(function(id, done) {
  console.log('Deserialize user called.');
  return done(null, {name: 'Oliver'});
});

passport.use(new LocalStrategy(
  function(username, password, done) {
    console.log('local strategy called with: %s', username);
    return done(null, {name: username});
  }));

var app = express();

app.set('port', process.env.PORT || 3000);
app.set('view engine', 'swig');
app.set('views', __dirname + '/views');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.cookieParser('asljASDR2084^^!'));
app.use(express.session());
app.use(passport.initialize());
app.use(passport.session());
app.use(app.router);
app.use(require('less-middleware')({ src: __dirname + '/public' }));
app.use(express.static(path.join(__dirname, 'public')));
app.use(express.errorHandler({ dumpExceptions:true, showStack:true }));

app.engine('swig', swig.renderFile);

app.post('/auth', passport.authenticate('local'));
app.get('/login', function(req, res) {
  // login is a simple form that posts username and password /auth
  res.render('login', {});
});

http.createServer(app).listen(app.get('port'), function(){
  console.log('Express server listening on port ' + app.get('port'));
});

Das Formular auf meiner/login-Seite wird ausgeschnitten und aus den Passdokumenten eingefügt, mit der Ausnahme, dass ich es geändert habe, um es an/auth anstelle von/login zu senden:

<form action="/auth" method="post">
    <div>
        <label>Username:</label>
        <input type="text" name="username"/>
    </div>
    <div>
        <label>Password:</label>
        <input type="password" name="password"/>
    </div>
    <div>
        <input type="submit" value="Log In"/>
    </div>
</form>

Wenn ich das Anmeldeformular zusammenstelle, wird Folgendes protokolliert

GET /login 200 5ms - 432b
POST /auth 401 6ms

Beachten Sie, dass "lokale Strategie aufgerufen" nie protokolliert wird.

Warum wird die an LocalStrategy übergebene Funktion nicht aufgerufen?

39
Oliver Dain

Ich bin vor kurzem auf dieses Problem gestoßen und es kann durch eine Reihe von Dingen verursacht werden. Als Erstes muss sichergestellt werden, dass der bodyParser für Express eingerichtet ist, was Sie meines Erachtens getan haben.

app.use(express.bodyParser());

Als Nächstes müssen Sie sicherstellen, dass das Formular, das Sie an die Route senden, sowohl ein username als auch ein password enthält. Außerdem muss der Benutzer in beide Felder etwas eingeben . Ich war ratlos, als ich es getestet habe und habe beim Testen eigentlich nichts in das Passwortfeld eingegeben :) Passport erfordert BEIDE, um die LocalStrategy-Überprüfungsfunktion auszuführen, die an passport.authenticate('local') übergeben wurde.

Ihr Beispiel scheint auch so eingerichtet zu sein, dass sowohl Benutzername als auch Passwort korrekt erfasst werden. In jedem Fall sollten Sie jedoch testen, ob der Text auch ohne Reisepass korrekt analysiert wird:

app.post('/auth', function(req, res){
  console.log("body parsing", req.body);
  //should be something like: {username: YOURUSERNAME, password: YOURPASSWORD}
});

Andernfalls

Haben Sie versucht, Ihrer /auth - Route einen Anforderungshandler hinzuzufügen?

app.post('/auth', passport.authenticate('local'), function(req, res){
  console.log("passport user", req.user);
});

oder

app.post('/auth', passport.authenticate('local', { successRedirect: '/', failureRedirect: '/auth' }));
72
Arjun Mehta

Ich habe das gleiche Problem festgestellt, als ich meinen eigenen Routen-Handler eingerichtet habe, von dem aus ich passport.authenticate () aufgerufen habe. Ich habe vergessen, dass passport.authenticate Middleware zurückgibt, die aufgerufen werden muss. Daher reicht es nicht aus, nur passport.authenticate aufzurufen. Dann habe ich ersetzt

router.post("/",
 function(req,res,next){
   passport.authenticate("local", function(err, user, info){

    // handle succes or failure

  }); 
})

mit

router.post("/",
 function(req,res,next){
   passport.authenticate("local", function(err, user, info){

    // handle succes or failure

  })(req,res,next); 
})
25
Jakub Kutrzeba

Sie erhalten 401, wenn Sie andere Eingabefelder für Benutzernamen und Kennwörter als die Standardfelder verwenden. Das müssen Sie in Ihrer LocalStrategy folgendermaßen angeben:

passport.use(new LocalStrategy({
    usernameField: 'login',
    passwordField: 'password'
  },

  function(username, password, done) {
  ...
  }
));

Die Standardeinstellung ist username und password, denke ich. Siehe die Dokumentation hier .

16
user568109

Ich denke, Sie senden das Formular mit Benutzername oder Passwort Feld leer.

Wenn Sie beide Eingaben ausfüllen und dann übermitteln, wird LocalStrategy aufgerufen.

8
Fancyoung

Für Express 4.x:

// Body parser
var bodyParser = require('body-parser');

app.use(bodyParser.urlencoded({ extended: false })) // parse application/x-www-form-urlencoded
app.use(bodyParser.json()) // parse application/json

vgl. https://github.com/expressjs/body-parser

4
Flaudre

Ich habe auch meinen Kopf für ein paar Stunden für das gleiche Problem geschlagen. Ich hatte alles an Ort und Stelle, wie andere Antworten wie 1 sagten. Formular gab alle Felder zurück. 2. Body Parser wurde korrekt eingerichtet mit erweitert: true 3. Passport mit jeder Einstellung und Konfiguration.

Aber ich habe das Feld für den Benutzernamen mit der Telefonnummer und dem Passwort geändert. Durch das Ändern des Codes wie unten habe ich mein Problem gelöst

  passport.use('login', new LocalStrategy(
    {usernameField:'phoneNumber',
    passwordField:'password'},
    function (username, password, done) {

    // your login goes here
    })

);

Wenn jemand möchte, kann ich das gesamte Authentifizierungsverfahren für die Telefonnummer mit mongodb und passport-local schreiben.

Vielen Dank @ user568109

3
kamal pandey

Mein Problem war, dass ich den enctype = 'multipart/form-data' hatte. Ändern Sie dies einfach in multipart = 'urlencoded'. Und ich denke, das wird es lösen.

3
Ognjen

Um sowohl username als auch passport zu erfassen, müssen Sie Folgendes hinzufügen:

app.use(express.urlencoded());

In meinem Fall habe ich app.use(express.json()); verwendet und den Benutzernamen und das Passwort von <form> Gesendet.

0
A-Sharabiani
  1. npm installiere passport-local

  2. var passport = require ('passport'), LocalStrategy = require ('passport-local'). Strategy;

Laut passportjs.org und es hat bei mir funktioniert!

0
Mujtaba Zaidi

Möglicherweise wurde Ihre Anfrage nicht richtig formatiert (insbesondere der gesamte Inhalt) und Ihr Benutzername und Ihr Passwort wurden nicht gesendet, als Sie dachten, dass dies der Fall war.

Hier ist ein Beispiel für einen API-Aufruf-Wrapper, der Ihren Anforderungshauptteil erzwingt und als json analysiert wird:

Api = {};
Api.request = (route, options) => {
  options = options || {};

  options.method = options.method || 'GET';
  options.credentials = 'include';

  if (options.method === 'POST') {
    options.headers = {
      'Accept': 'application/json',
      'Content-Type': 'application/json',
    };
    options.body = JSON.stringify(options.data) || '{}';
  }

  fetch(absoluteUrl + '/api/' + route, options)
    .then((response) => response.json())
    .then(options.cb || (() => {}))
    .catch(function(error) {
      console.log(error);
    });
};

Es kann folgendermaßen verwendet werden:

Api.request('login', {
  data: {
    username: this.state.username,
    password: this.state.password
  },
  method: 'POST',
  cb: proxy((user) => {
    console.log(user);
  }, this)
});
0
maxhud

Noch eine andere Möglichkeit: Für mich hatte ich versehentlich meine Routen vor meiner Body-Parser-Middleware definiert, sodass Body-Parser für die Login-Route nie aktiv war.

0
Nenotlep

Für mich war alles richtig eingerichtet. Das Problem war, dass ich Formulardaten sammelte und dann einen Json aus Formulardaten erstellte und ihn wie JSON.stringify (formdatajson) an den Server sendete. (Für mich war das Anmeldeformular ein Popup auf dem Bildschirm)

Ich habe meinen Fehler beim Debuggen von Passpässen gefunden ...

Wenn Sie das gleiche Problem haben und keine der oben genannten Lösungen für Sie funktioniert, dann debuggen Sie passportjs.

öffnen

strategy.js

setzen Sie den Debugger in die folgende Methode ein.

Strategy.prototype.authenticate 

Prüfen Sie, welche Formulardaten für Sie kommen. Ich hoffe das hilft ...

0
ifti