Umleiten zur vorherigen Seite nach der Authentifizierung in node.js mithilfe von pass.js
Ich bin versucht, einen login-Mechanismus mit node.js -, express-und passport.js. Der Login selbst funktioniert ganz nett, auch sessions gespeichert sind schön mit redis aber ich habe einige Probleme mit der Umleitung der Nutzer zu, wo er begann aus, bevor Sie aufgefordert, sich zu authentifizieren.
z.B. der Benutzer folgt link http://localhost:3000/hidden
wird dann umgeleitet http://localhost:3000/login
aber dann will ich ihn umgeleitet zu werden wieder zurück zu http://localhost:3000/hidden
.
Der Zweck von diesem ist, wenn der Benutzer Zugriff zufällig eine Seite muss er angemeldet sein erste, soll er umgeleitet werden, um den /login-Seite unter Angabe seiner Zugangsdaten und dann umgeleitet wird, zurück zu der Stelle, die er zuvor versucht, Zugriff auf.
Hier ist meine login-post
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 ensureAuthenticated Methode
function ensureAuthenticated (req, res, next) {
if (req.isAuthenticated()) {
return next();
}
res.redirect('/login');
}
denen die Haken in die /hidden
Seite
app.get('/hidden', ensureAuthenticated, function(req, res){
res.render('hidden', { title: 'hidden page' });
});
Die html-Ausgabe für die login-Seite ist ganz 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>
InformationsquelleAutor der Frage Alx | 2012-11-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich weiß nicht, über Pass -, aber hier ist, wie ich es mache:
Ich habe eine middleware ich mit
app.get('/account', auth.restrict, routes.account)
setztredirectTo
in der Sitzung...dann habe ich redirect /AnmeldungDann in
routes.login.post
ich Folgendes tun:InformationsquelleAutor der Antwort chovy
In Ihrem
ensureAuthenticated
Methode speichern der return-url in der session, wie diese:Dann können Sie die Aktualisierung Ihres Reisepasses.authentifizieren route etwas wie:
InformationsquelleAutor der Antwort linuxdan
Werfen Sie einen Blick auf connect-sorgen-logindie arbeiten an der Seite von Pass, genau das zu tun, was Sie wollen!
InformationsquelleAutor der Antwort Jared Hanson
Wenn Sie connect-sorgen-login es ist eine super-einfache, integrierte Möglichkeit, dies zu tun mit Pass über die
successReturnToOrRedirect
parameter. Wenn verwendet, Reisepass senden Sie zurück zu dem ursprünglich angeforderten URL oder fallback auf die URL, die Sie stellen.https://github.com/jaredhanson/connect-ensure-login#log-in-and-return-to
InformationsquelleAutor der Antwort igneosaur
Meine Art, Dinge zu tun:
GET /login controller:
POST /login controller:
POST /logout controller (nicht sicher, ob es 100% ok, Kommentare sind willkommen):
Klar returnTo middleware (löscht returnTo von session-auf jeder route, außer auth Routen - für mich sind Sie das /login und /auth/:Anbieter ):
Dieser Ansatz zwei Funktionen:
InformationsquelleAutor der Antwort deksden
@chovy und @linuxdan Antworten haben bug mit nicht-clearing -
session.returnTo
wenn der Benutzer geht auf eine andere Seite nach dem login umleiten (ja, das ist keine Authentifizierung erforderlich ist) und die Anmeldungen durch. So fügen Sie diesen code in Ihre Implementierungen:Wenn Sie einige ajax-Anfragen, die von der login-Seite können Sie auch ausschließen.
Ein weiterer Ansatz ist die Verwendung flash in
ensureAuthenticated
Und dann in " GET login
In view add hidden-Feld auf login-Formular (Beispiel in jade)
In der POST-login -
Beachten Sie, dass redirectTo wird klar, nach dem ersten login.
InformationsquelleAutor der Antwort Alexander Danilov
Einfachste (und richtig) Weg, dies zu erreichen ist die Einstellung
failureRedirect
undsuccessRedirect
- Optionen.InformationsquelleAutor der Antwort Eray