it-swarm.com.de

req.isAuthenticated des Passes, der immer false zurückgibt, auch wenn ich hardcode getan habe (null, true)

Ich versuche, meine lokale Passport-Strategie zum Laufen zu bringen. 

Ich habe diese Middleware eingerichtet:

passport.use(new LocalStrategy(function(username, password, done) {
    //return done(null, user);
    if (username=='ben' && password=='benny'){
        console.log("Password correct");
        return done(null, true);
    }
    else
        return done(null, false, {message: "Incorrect Login"});
}));

aber dann hier rein

app.use('/admin', adminIsLoggedIn, admin);

function adminIsLoggedIn(req, res, next) {

    // if user is authenticated in the session, carry on 
    if (req.isAuthenticated())
        return next();

    // if they aren't redirect them to the home page
    res.redirect('/');
}

es schlägt immer fehl und leitet auf die Homepage um.

Ich kann nicht herausfinden, warum das passiert. Warum authentifiziert es sich nicht?

In meiner Konsole kann ich sehen, dass Password Correct gerade druckt. Warum funktioniert es nicht?

34
CodyBugstein

Ich hatte ein ähnliches Problem. Möglicherweise liegt die für Passport erforderliche Express-Session-Middleware vor. Behebung des Problems durch Verwendung von Middlewares in der folgenden Reihenfolge: (Express 4)

var session = require('express-session');

// required for passport session
app.use(session({
  secret: 'secrettexthere',
  saveUninitialized: true,
  resave: true,
  // using store session on MongoDB using express-session + connect
  store: new MongoStore({
    url: config.urlMongo,
    collection: 'sessions'
  })
}));

// Init passport authentication 
app.use(passport.initialize());
// persistent login sessions 
app.use(passport.session());
43
Nitin

FÜR NEWBIES

Ich stand vor einem ähnlichen Problem, bei dem meine isAuthenticated () - Funktion false zurückgeben würde. Ich habe viel Zeit verloren, ich hoffe, diese Antwort rettet Ihre.

Einige häufige Probleme, auf die Sie achten sollten,

  1. Middleware-Installationsreihenfolge (express-session> pass.initialize> pass.session) (und dabei CHECK YOUR SYNTAX).
  2. Methoden zur Serialisierung und Deserialisierung müssen den Benutzer an die Anforderung übergeben. (Weitere Informationen Ich habe eine Antwort auf diesen Link gepostet .. Grundlagen der Passport-Sitzung (expressjs) - Warum müssen wir sie serialisieren und deserialisieren? ), wenn Es gibt keinen Benutzer auf Anfrage. isAuthenticated würde false zurückgeben .... und umgeleitet auf den definierten Pfad ...... wenn false .... AND ... EINMAL WIEDER ..... PRÜFEN SIE IHR SYNTAX.
  3. Für die im Modell definierte Funktion getUserById oder findById (user.js) muss die Funktion User.findById (und nicht User.findOne Again CHECK YOUR .. WAIT FOR IT..SYNTAX) definiert sein. (Diese Funktion würde den Benutzer in jeder Sitzung auf die Anforderung laden.)
8
P.V. THOMAS

Dies kann auch ein Problem mit den POST/GET-Aufrufen Ihres Kunden sein. Ich hatte genau das gleiche Problem, aber es stellte sich heraus, dass ich fetch (was ich verwendete) die Option credentials:'include' so geben musste:

fetch('/...', {
  method: 'POST',
  headers: myHeaders,
  credentials: 'include',
  body: ...
  ...})

Der Grund ist, dass fetch keine Cookies weitergibt, was in diesem Fall notwendig ist. 

7
Alex H

Ich hatte das gleiche Problem, indem ich das Hinzufügen vergaß 

request.login()

auf 

app.post('/login', 
    function(request, response, next) {
        console.log(request.session)
        passport.authenticate('login', 
        function(err, user, info) {
            if(!user){ response.send(info.message);}
            else{

                request.login(user, function(error) {
                    if (error) return next(error);
                    console.log("Request Login supossedly successful.");
                    return response.send('Login successful');
                });
                //response.send('Login successful');
            }

        })(request, response, next);
    }
);

Hoffentlich könnte das für andere helfen, die hier den gleichen Grund hatten wie ich.

3
Özgen Eren

Mein Problem war, dass ich cookie.secure auf true gesetzt habe, auch wenn die Daten nicht über https waren.

app.use(require('express-session')({
    secret: process.env.sessionSecret,
    cookie: {
        maxAge: 1000 * 60 * 60 * 24 * 7 // 1 week
    },
    store: store,
    resave: false,
    saveUninitialized: false,
    cookie: { secure: false } // Remember to set this
}));

Denken Sie daran, Cookies auf "false" zu setzen, wenn Sie kein https verwenden

cookie: { secure: false } // Set to false

Wenn Sie glauben, dass Sie über https verfügen, denken Sie daran, dem Proxy zu vertrauen

app.set('trust proxy', 1) // trust first proxy
2
Thomas Lindauer

Es gibt einen Knick in pass.js, den niemand wirklich erwähnt, aber ich habe es herausgefunden. Aus diesem Grund können Sie ein Konto erstellen oder sich anmelden. Die Authentifizierung funktioniert zunächst einwandfrei. Später können Sie jedoch feststellen, dass req.userundefined oder req.isAuthenticated()false ist die App.

Nach der Authentifizierung müssen Sie Passport.js umleiten. So initialisiert Passport die eigentliche Sitzung.

  signIn(req, res, next) {
    passport.authenticate("local")(req, res, function() {
      if (!req.user) {
        console.log("User not found!");
      } else {
        res.redirect("/")
        console.log("signed in")
      }
    })
  }

Wenn Sie nach der Authentifizierung keine Umleitung durchführen, wird Ihre Sitzung nicht einmal als req.user gestartet, und req.isAuthenticated() ist falsch.

Meine App ist eine React und Node= App, dies gilt jedoch sowohl für Node Apps als auch für React/Node Apps.

1
Christian Reyes

Wenn Sie Ihre Routen wie folgt verpacken:

module.exports = function(){

router.get('/',(req,res)=>{
 res.send('stuff');
  }

}

Sie müssen "App und Reisepass" wie folgt an Ihre Routen übergeben:

module.exports = function(app,passport){

//routes n stuff

}
0
metal_jacke1

Ich habe dieses Problem behoben, indem ich meinen passport.deserializeUser korrigiert habe. Ich verwende Mongo-Muttersprachler und da die meisten Beispiele Mongoose verwenden, fiel ich erneut in die _id-Falle.

Denken Sie also daran, die _ID zu einer Mongo-ObjectID zu machen, wenn Sie den Benutzer in deserializeUser lesen

passport.deserializeUser(function(user, done) {
    const collection = db.get().collection('users')
    const userId = new mongo.ObjectID(user);
    collection.findOne({_id : userId}, function(err, user) {
        if (err) done(err, null);
        done(null, user);
    });
});

Bei meiner Abfrage wurde der Benutzer nicht gefunden, da ich die ID nicht zu einer ObjectID gemacht habe und nirgendwo Fehler angegeben wurden.

0
Mikko

Ich hatte auch das gleiche Problem, konnte keine Lösung im Web finden, aber ich fand es heraus.

app.use(require("express-session")({
secret: "This is the secret line",
resave: false,
saveUninitialized: false
}));
app.use(passport.initialize());
app.use(passport.session());
app.use(bodyParser.urlencoded({extended: true}));

express-Sitzung Anforderung und Verwendung sollte vor jeder anderen Verwendung sein. Versuchen Sie dies, ich bin sicher, das würde funktionieren, arbeitete für mich!

0
karan525

Ich hatte auch das gleiche Problem, obwohl das Einloggen stattfand ... Der Fehler, den ich gemacht habe, war, vor dem Initialisieren des Passes die Middleware isLoggedIn aufzurufen .. Die Reihenfolge, in der Sie den Code schreiben, ist also sehr wichtig. Bitte beachten Sie dass die Sequenz in der richtigen Reihenfolge geschrieben ist ... Ich hatte in der folgenden Reihenfolge geschrieben

app.use(require('express-session')({
    secret:'short' ,
    resave:false,
  saveUninitialized:false,
  cookie:{secure:false}
}))
app.use(passport.initialize())
app.use(passport.session())
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); }
      if (user.password!=password) { return done(null, false); }
      return done(null, user);
    });
  }
))
passport.serializeUser(User.serializeUser())
passport.deserializeUser(User.deserializeUser())
app.use(isLoggedIn); 
0

Ich stand auch vor demselben Problem, aber @PVThomas gibt mir eine Lösung, wie hier in den Antworten. Mein Problem war mit der findById()-Methode in deserialize(). Ich habe findOne() in findById() verwendet und dann habe ich es durch find() ersetzt, und jetzt funktioniert req.isAuthenticated() gut. Meine App hat req.session.passport.user nicht gespeichert. Sie gab undefined zurück. Nachdem findOne() durch find() ersetzt wurde, wird die Benutzer-ID in req.session.passport.user gespeichert.

0