Search code examples
angularjsauthenticationyeoman-generator

How to redirect users to original request after authentication, Angular-Fullstack Yeoman?


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:

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

Thanks for any help!


Solution

  • 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('/');
            }
          })