J'ai une application Web simple qui a un écran de connexion et une page d'activité qui n'est accessible que lorsque l'utilisateur a fourni des informations d'identification valides. En supposant que l'utilisateur clique sur la connexion avec des informations d'identification valides et soit redirigé vers la page d'activité, l'utilisateur ne clique pas sur la déconnexion, il clique simplement sur le bouton de retour du navigateur et revient à la page de connexion. Ce comportement est évidemment non intuitif, je suppose que l'utilisateur est connecté et qu'il / elle clique sur le bouton de retour pour rester sur la même page et ne pas revenir à la page de connexion.

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

C'est un moyen simple que j'utilise actuellement pour toujours rediriger l'utilisateur vers la page d'activité, mais je trouve que c'est une méthode gaspilleuse de ressources car il y a des redirections indésirables introduites. Ma question est, est-ce la manière standard et la plus propre de mettre en œuvre le comportement ci-dessus ou existe-t-il un meilleur mécanisme? J'utilise un passeport pour l'authentification et le stockage de jetons JWT.

EDIT: Pour réitérer la solution ci-dessus, cela ne fonctionne que si le no-cache du navigateur est activé, contrairement à ce que le contrôleur pour la route de connexion n'est même pas appelé puisque le navigateur a mis en cache la page. Je cherche quelque chose de plus robuste. Je ne pense pas que ce soit une bonne pratique de coder en dur le navigateur pour ne pas mettre en cache la page dans un environnement de production.

11
john smith 7 août 2016 à 05:00

4 réponses

Meilleure réponse

L'une des "fonctionnalités" des navigateurs modernes (la plupart) est que le fait de cliquer sur le bouton de retour vous ramène à l'état dans lequel cette page a été chargée. À moins que vous ne mettiez à jour dynamiquement la page de connexion avant de naviguer vers l'état connecté, c'est l'expérience que vous obtiendrez.

Ce que je suggère à la place est une fois authentifié sur la page de connexion, au lieu de rediriger immédiatement l'utilisateur vers l'état connecté, mettez à jour la page connectée pour indiquer que l'utilisateur est maintenant connecté (par exemple, si vous avez une icône d'avatar / de profil en haut à droite, changez son apparence avec .js pour indiquer que l'utilisateur est connecté).

Une fois que l'état de la vue de connexion a été modifié, accédez à la vue de contenu appropriée (l'utilisation d'une méta-redirection peut être la plus appropriée, mais vous pouvez le faire à votre guise).

Vous pouvez supposer que parce que l'utilisateur a cliqué sur le bouton Précédent, il a probablement voulu le faire. Cette solution garantit que les attentes de l'utilisateur concernant le comportement du bouton de retour sont respectées, au lieu de forcer une redirection en détectant un cookie avec js et en re-naviguant - ce qui conduit à des boucles de redirection avant / arrière (ce qui est tellement frustrant!)

Bien que StackOverflow ne fasse pas vraiment ce que vous essayez de faire, voici un exemple de ce que vous pourriez faire avec .js pour mettre à jour dynamiquement /login avant de vous éloigner:

enter image description here enter image description here

3
brandonscript 17 août 2016 à 17:40

Vous avez ici quelques solutions.

La première serait de dire au navigateur de ne pas mettre en cache / se connecter. Cela a du sens pour de nombreuses raisons. À propos de votre préoccupation de ne pas vouloir désactiver le cache en production, n'oubliez pas que vous désactiverez le cache juste pour la page / login, ce qui n'est pas aussi mauvais.

Une alternative serait d'ajouter du code JS dans la page / login qui verra s'il existe un certain cookie connecté. Dans le cas contraire, actualisez simplement la page. En actualisant la page, le côté back-end sera exécuté et la redirection se produira réellement.

J'irais avec le premier. Pour cet itinéraire particulier, quelque chose dans ce sens ferait l'affaire (non testé).

res.set({
    'Cache-Control': 'no-cache, no-store, must-revalidate',
    'Pragma' : 'no-cache',
    'Expires' : '0',
})
1
Nico Andrade 15 août 2016 à 21:05

Votre solution semble bien. Vous pourrez peut-être améliorer votre idée en utilisant les événements window.onbeforeunload et window.onunload. Quelque chose comme ça:

<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
Sparrow 9 août 2016 à 21:45

Je n'ai pas testé cela, mais je pense que cela devrait fonctionner. Essayer js res.redirect ('/ activité? _ =' + Date.now ()); pour empêcher le navigateur d'utiliser la page en cache.

1
Sy Tran 12 août 2016 à 10:56