-->

How to redirect users to original request after au

2020-07-27 05:40发布

问题:

I'm using the Angular-Fullstack yeoman generator as the basis for my project: https://github.com/DaftMonk/generator-angular-fullstack

I cannot figure out how to redirect users to the link they originally requested after logging in.

Example of what I want to happen:

  • Unauthenticated user requests http://myapp/videos/video1
  • User is directed to log in
  • User successfully authenticates
  • User is automatically redirected to http://myapp/videos/video1

I am using both the boilerplate local login and boilerplate OAuth.

Thanks for any help!

回答1:

I figured it out, here are the steps I took to solve this problem. For some reason, Stack Overflow isn't formatting my last 2 code blocks below. I made a gist with the code below (note 3 separate files need to be modified) https://gist.github.com/dcoffey3296/d27c141ef79bec3ff6a6

  1. store the url to return to in a cookie within the .run() method of client/app/app.js

    .run(function ($rootScope, $location, Auth, $cookieStore) {
      // Redirect to login if route requires auth and you're not logged in
      $rootScope.$on('$stateChangeStart', function (event, next) {
        Auth.isLoggedInAsync(function(loggedIn) {
          if (next.authenticate && !loggedIn) {
    
            // store the requested url if not logged in
            if ($location.url() != '/login')
            {
                $cookieStore.put('returnUrl', $location.url());
            }
            $location.path('/login');
          }
        });
      });
    });
    
  2. for Oauth, check for this cookie and redirect if it exists in server/auth/auth.service.js

    function setTokenCookie(req, res) {
      if (!req.user) { 
          return res.json(404, { message: 'Something went wrong, please try again.'}); 
      }
    
      var token = signToken(req.user._id, req.user.role);
      res.cookie('token', JSON.stringify(token));
    
      // return the user to the request page (oAuth) or homepage
      if (typeof req.cookies.returnUrl != 'undefined')
      {
          res.redirect(req.cookies.returnUrl.replace(/"/g, "") || '/');
      }
      else
      {
          res.redirect('/');
      }
    }
    
  3. for local login, check for cookie in the .then() part of $scope.login(), file: client/app/account/login/login.controller.js

    .then( function() {
          // Logged in, redirect to home
          if (typeof $cookieStore.get('returnUrl') != 'undefined' && $cookieStore.get('returnUrl') != '')
          {
              $location.path($cookieStore.get('returnUrl'));
              $cookieStore.remove('returnUrl');
          }
          else
          {
              $location.path('/');
          }
        })
    


回答2:

What I did in a similar case, is that when I redirected user to login page, I attached to the url (as a query parameter) the initial path that user was trying to access eg. path_to_login?requested_url=/videos/video1. So when the login was completed successfully I just read requested_url query parameter and if that existed, user was redirected to the specified path.