Ich versuche, einen Anmeldemechanismus mit node.js, express und passport.js einzurichten. Das Login selbst funktioniert ganz gut, auch Sitzungen werden gut mit redis gespeichert, aber ich habe einige Probleme damit, den Benutzer dorthin umzuleiten, wo er angefangen hat, bevor er zur Authentifizierung aufgefordert wird.
zB Benutzer folgt Link http://localhost:3000/hidden
wird dann umgeleitet, http://localhost:3000/login
aber dann möchte ich, dass er wieder zurückgeleitet wird zu http://localhost:3000/hidden
.
Wenn der Benutzer zufällig auf eine Seite zugreift, auf der er zuerst angemeldet sein muss, wird er mit seinen Anmeldeinformationen auf die / login-Site umgeleitet und dann zurück auf die Site umgeleitet, auf die er zuvor versucht hat, zuzugreifen.
Hier ist mein Login-Beitrag
app.post('/login', function (req, res, next) {
passport.authenticate('local', function (err, user, info) {
if (err) {
return next(err)
} else if (!user) {
console.log('message: ' + info.message);
return res.redirect('/login')
} else {
req.logIn(user, function (err) {
if (err) {
return next(err);
}
return next(); // <-? Is this line right?
});
}
})(req, res, next);
});
und hier meine sureAuthenticated Methode
function ensureAuthenticated (req, res, next) {
if (req.isAuthenticated()) {
return next();
}
res.redirect('/login');
}
welches in die /hidden
Seite einhakt
app.get('/hidden', ensureAuthenticated, function(req, res){
res.render('hidden', { title: 'hidden page' });
});
Die HTML-Ausgabe für die Anmeldeseite ist recht einfach
<form method="post" action="/login">
<div id="username">
<label>Username:</label>
<input type="text" value="bob" name="username">
</div>
<div id="password">
<label>Password:</label>
<input type="password" value="secret" name="password">
</div>
<div id="info"></div>
<div id="submit">
<input type="submit" value="submit">
</div>
</form>
Antworten:
Ich weiß nichts über Reisepass, aber so mache ich das:
Ich habe eine Middleware, die ich mit
app.get('/account', auth.restrict, routes.account)
diesen SetsredirectTo
in der Sitzung verwende ... dann leite ich zu / login umDann
routes.login.post
mache ich in:quelle
req.session.redirect_to = req.path
req.session.redirect_to = req.path
Ihrer Auth-Middleware festlegen . Dann lesen Sie es und löschen Sie es in derlogin.post
Route.ensureAuthenticated
Speichern Sie in Ihrer Methode die Rückgabe-URL in der Sitzung wie folgt:Dann können Sie Ihre passport.authenticate-Route auf Folgendes aktualisieren:
quelle
req.session.returnTo = null;
Sie in dieser Frage. Bei Prüfung der Quelle scheint nur die session.user und nicht die gesamte Sitzung zu löschen.req.path
würde ich verwenden,req.originalUrl
da es eine Kombination aus baseUrl und Pfad ist, siehe die DokumentationWerfen Sie einen Blick auf Connect-Sure-Login , das neben Passport genau das tut, was Sie wollen!
quelle
Meine Art Dinge zu tun:
GET / Login- Controller:
POST / Login- Controller:
POST / Logout- Controller (nicht sicher, ob 100% in Ordnung sind, Kommentare sind willkommen):
ReturnTo-Middleware löschen (löscht returnTo von der Sitzung auf einer beliebigen Route außer Authentifizierungsrouten - für mich sind sie / login und / auth /: provider):
Dieser Ansatz weist zwei Merkmale auf :
quelle
Wenn Sie connect-sure-login verwenden gibt es eine supereinfache, integrierte Möglichkeit, dies mit Passport mithilfe des
successReturnToOrRedirect
Parameters zu tun . Bei Verwendung des Passes werden Sie an die ursprünglich angeforderte URL zurückgesendet oder auf die von Ihnen angegebene URL zurückgegriffen.https://github.com/jaredhanson/connect-ensure-login#log-in-and-return-to
quelle
Die Antworten von @chovy und @linuxdan haben den Fehler, dass nicht gelöscht wird,
session.returnTo
wenn der Benutzer nach der Umleitung der Anmeldung (für die keine Authentifizierung erforderlich ist) zu einer anderen Seite wechselt und sich dort anmeldet . Fügen Sie diesen Code zu ihren Implementierungen hinzu:Wenn Sie einige Ajax-Anfragen von der Anmeldeseite ausführen, können Sie diese auch ausschließen.
Ein anderer Ansatz ist die Verwendung von Flash- In
ensureAuthenticated
Und dann in GET Login
In der Ansicht ein verstecktes Feld zum Anmeldeformular hinzufügen (Beispiel in Jade)
In der POST-Anmeldung
Beachten Sie, dass redirectTo nach dem ersten GET-Login damit gelöscht wird.
quelle
Der einfachste (und richtigste) Weg, dies zu erreichen, sind Einstellungen
failureRedirect
undsuccessRedirect
Optionen .quelle
successRedirect
dass es auf dem Rückweg verwendet wird, aber dann würde das beabsichtigte Ziel (dhreturnTo
oben) verloren gehen, oder?