2016-08-07 42 views
11

Ich habe eine einfache Webanwendung mit einem Anmeldebildschirm und einer Aktivitätenseite, auf die nur zugegriffen werden kann, wenn der Benutzer gültige Anmeldeinformationen eingegeben hat. Angenommen, der Benutzer klickt auf die Anmeldung mit gültigen Anmeldeinformationen und wird auf die Aktivitätenseite umgeleitet. Nun klickt der Benutzer nicht auf Abmelden, sondern er klickt einfach auf die Zurück-Schaltfläche des Browsers und kehrt zur Anmeldeseite zurück. Dieses Verhalten ist offensichtlich nicht intuitiv, würde ich annehmen, während der Benutzer eingeloggt ist und er/sie klickt auf die Zurück-Taste, um auf der gleichen Seite zu bleiben und nicht auf die Login-Seite zurückzukehren.Der Benutzer klickt auf die Zurück-Schaltfläche, während die Sitzung noch authentifiziert und auf die Anmeldeseite in node.js umgeleitet wird.

function loginUser(req, res) { 
    if (req.session.auth) // if user is still authenticated 
    { 
     res.redirect('/activity'); 
    } 
    res.render('login'); 
} 

Dies ist eine einfache Weise, die ich zur Zeit verwenden, um den Benutzer immer auf die Aktivität Seite umleiten zurück, jedoch finde ich diese eine Ressource verschwenderische Methode, da es unerwünschte Umleitungen eingeführt. Meine Frage ist, ist dies der Standard und sauberste Weg, um das oben genannte Verhalten zu implementieren, oder gibt es einen besseren Mechanismus? Ich benutze Pass für die Authentifizierung und Speicherung von JWT-Tokens.

EDIT: Die obige Lösung funktioniert nur, wenn der Browser No-Cache aktiviert ist, im Gegensatz dazu wird der Controller für die Login-Route nicht einmal aufgerufen, da der Browser die Seite zwischengespeichert hat. Ich suche etwas robusteres. Ich halte es nicht für eine gute Methode, den Browser so zu programmieren, dass die Seite nicht in einer Produktionsumgebung zwischengespeichert wird.

+1

Sie können den Browser nicht steuern oder seine Geschichte aus offensichtlichen Sicherheitsgründen ändern, so dass Sie ziemlich fertig sind. Die einzige Sache, die möglicherweise fehlt, ist sicherzustellen, dass Ihr Code überprüft, ob der Benutzer jedes Mal angemeldet ist oder nicht, so dass Sie sicherstellen müssen, dass die Anmeldeseite nicht vom Browser zwischengespeichert werden kann. – HiDeo

+0

Sie könnten JWT in Betracht ziehen. Siehe die Satellizer-Bibliothek auf github. –

Antwort

3

Eines der "Features" von (modernsten) Browsern besteht darin, dass Sie durch Klicken auf die Zurück-Schaltfläche zu dem Zustand zurückkehren, in dem diese Seite geladen wurde. Sofern Sie die Anmeldeseite vor nicht dynamisch in den eingeloggten Zustand navigieren, ist dies die Erfahrung, die Sie erhalten.

Was ich stattdessen vorschlagen würde ist einmal auf der Anmeldeseite authentifiziert, anstatt sofort den Benutzer in den eingeloggten Zustand umzuleiten, aktualisieren Sie die eingeloggte Seite, um anzuzeigen, dass der Benutzer jetzt angemeldet ist (zB wenn Sie ein Avatar/Profilsymbol oben rechts, ändern Sie das Aussehen mit .js, um anzuzeigen, dass der Benutzer angemeldet ist).

Sobald sich der Status der Anmeldesicht geändert hat, navigieren Sie zur entsprechenden Inhaltsansicht (am besten ist eine Metaredirektive, aber Sie können es nach Belieben tun).

Sie können davon ausgehen, dass, weil der Benutzer den Zurück-Button geklickt hat, sie wahrscheinlich gemeint haben. Diese Lösung stellt sicher, dass die Erwartungen des Benutzers an das Zurück-Button-Verhalten respektiert werden, anstatt eine Weiterleitung zu erzwingen, indem ein Cookie mit js erkannt und erneut navigiert wird - was zu Vorwärts-/Zurück-Weiterleitungsschleifen führt (die so frustrierend sind!)

Während Stackoverflow eigentlich nicht tun, was Sie versuchen, hier zu tun ist ein Beispiel dafür, was man mit Js tun könnte dynamisch /login zu aktualisieren, bevor Sie navigieren weg:

enter image description here enter image description here

1

Deine Lösung scheint in Ordnung zu sein. Sie können Ihre Idee möglicherweise verbessern, indem Sie die Ereignisse window.onbeforeunload und window.onunload verwenden. Etwas wie folgt aus:

<script type="text/javascript"> 
    window.onbeforeunload = onbeforeunload_handler; 
    window.onunload = onunload_handler; 
    function onbeforeunload_handler() { 
     // Do something here 
    } 

    function onunload_handler() { 
     // Or do something here 
    } 
</script> 
1

ich havn't dies testen, aber ich denke, es sollte funktionieren. Probieren Sie js res.redirect('/activity?_='+ Date.now()); aus, um zu verhindern, dass der Browser die zwischengespeicherte Seite verwendet.

1

Sie haben hier ein paar Lösungen.

Eins, würde dem Browser sagen, nicht zu cachen/login. Dies ist aus vielen Gründen sinnvoll. Wenn Sie Bedenken haben, den Cache bei der Produktion nicht deaktivieren zu wollen, denken Sie daran, dass Sie den Cache nur für die Seite/login deaktivieren, was nicht so schlimm ist.

Eine Alternative wäre, einen JS-Code auf der/login-Seite hinzuzufügen, um zu sehen, ob ein bestimmter eingeloggter Cookie existiert. Sollte dies der Fall sein, aktualisieren Sie einfach die Seite. Durch das Aktualisieren der Seite wird die Backend-Seite ausgeführt und die Umleitung wird tatsächlich stattfinden.

Ich würde mit dem ersten gehen. Für diese spezielle Route würde etwas in dieser Richtung (nicht getestet) ausreichen.

res.set({ 
    'Cache-Control': 'no-cache, no-store, must-revalidate', 
    'Pragma' : 'no-cache', 
    'Expires' : '0', 
})