2017-09-18 2 views
1

Ich möchte nicht authentifizierte Benutzer auf die Login von einem einzelnen Post Seite umleiten zu können und dann auf den Posten zurück, nachdem der Benutzer angemeldet hat.Nehmen Benutzer zurück zur vorherigen Seite nach in (Node) Anmeldung

Meine Login Route ist wie folgt:

router.get('/login', function(req, res, next){ 
    if (req.user){ 
     res.redirect('/wall'); 
    } else { 
     res.render('login'); 
    } 
}); 

Meine Wand-Router wie folgt aussieht:

router.get('/wall', function(req, res, next){ 
    res.render('wall'); 
}); 

Die Post-URL wird so etwas wie:

http://thisisnotarealdomain.com/wall#/post/ID 

Mein Stack ist: NodeJS und Angular für die SPA

Wie kann ich das tun?

Danke,

+0

verwenden Sie die Sitzung, um den Benutzer zu verfolgen? –

+0

Yeah, Express 'Sitzung –

+0

Hoffe das hilft möglicherweise mit wenig zwicken. https://stackoverflow.com/questions/13335881/redirecting-to-previous-page-after-authentication-in-node-js-ususing-passport-js –

Antwort

1

Zunächst einmal möchte ich eine Middleware-Funktion erstellen, die Umleitung im Fall zu behandeln, wird der Benutzer nicht angemeldet, so etwas wie dieses:

const checkLogin = (req, res, next) => { 

    // Checks if the user is logged in 
    if(!userIsLoggedIn) { 

    // If user is not logged in 

    // Get relative path of current url 
    const url = req.originalUrl; 

    // And redirect to login page, passing 
    // the url as a query string that Angular 
    // can access later 
    res.redirect(`/login/?redirect=${url}`); 

    } else { 

    // If user is logged in 
    // go on and render the page 
    next(); 

    } 
} 

router.get('/wall', checkLogin, function(req, res, next){ 
    res.render('wall'); 
}); 

diese Weise, wenn Wenn der Benutzer nicht angemeldet ist, erhalten Sie eine Weiterleitung an eine URL wie /login /? redirect =/wall/post/14.

Dann in Ihrem Angular-Code, würden Sie auf das Login-Versprechen von Node warten und tun Sie einfach eine Umleitung zu diesem Query-String, den wir haben: Redirect. Etwas wie folgt aus:

// Assuming you're logging from a service 
angular 
    .service('LoginService', function($location, $window) { 

    // Generic login (could be $http, $resource, restangular) 
    LOGIN_PROMISE 
     .then(function(res) { 

     // If login was successful 
     if(res.success) { 

      // $location.search() allows you 
      // to access query strings 
      var redirectTo = $location.search().redirect; 

      // And then redirect to the page the 
      // user were before being redirected 
      // to the login page 
      $window.location.href = redirectTo; 

     } 

     }) 
    }) 

Oder Sie eine Umleitung tun könnte direkt von Ihrem Backend-Code:

// On your Angular code 
$http({ 
    method: 'GET', 
    params: { 
    redirect: $location.search().redirect 
    } 
}); 

// On Node 
router.get('/api/login', (req, res, next) => { 

    if(passwordIsCorrect) { 
    // And do the redirect 
    res.redirect(req.body.redirect); 
    } 

}); 

Dies ist nur eine von vielen Möglichkeiten, wie Sie dies erreichen können (das ist der Schönheit der Webentwicklung).

Hoffe, das kann Ihnen helfen!

+0

Danke für diesen Kumpel. Ich werde es ausprobieren und zu dir zurückkommen. Prost –

+0

Die "req.originalUrl;" hat nichts über die #. Denken Sie daran, dass ich den vollständigen Pfad für eine SPA-App brauche, also etwas wie: http://thisisnotarealdomain.com/wall#/post/ID –

+0

Ist es absolut wichtig, dass Sie den Hashbang (#) auf der URL verwenden? Wenn nicht, würde ich Ihnen empfehlen, etwas wie in Ihrem Haupt-HTML in Verbindung mit $ locationProvider.html5Mode (true) zu verwenden; auf Ihrer Routenkonfigurationsdatei. Auf diese Weise können Sie den vollständigen Pfad abrufen. –

Verwandte Themen