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?
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());
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,
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.
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.
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
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.user
undefined
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.
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
}
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.
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!
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);
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.