Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

AngularJS (Restangular): Making a promise block? Need to use it for validating a token

I have stumbled upon Restangular for making calls to a rest service. It works great and returns a promise. I need to be able to have the call block. The reason for this is on a fresh page reload I am technically not loggged in but I may have a token stored in a cookie. i would like to validate this token against a rest service. Problem is that I need it to block.

If a timeout occurs or if its not valid that i can treat teh user as not authenticated.

This is the reason for wanting to block is that i would like to redirect them using $location.path to a new URL it not a valid token.

This doesn't happen on a specific route so i can't use resolve which is blocking. It technically happens on every route - I use the $on.$routeChangeStart and check an internal variable got LoggedIn or not, if not logged in i check for the stored token.

This happens on each Page refresh but not while navigating inside the application.

The affect I am trying to get is how Gmail works.

Look forward to any insight anyone has on this

Thanks

like image 653
Martin Avatar asked Aug 07 '13 13:08

Martin


1 Answers

Basically you need to ensure that some asynchronous action occurs prior to any route change occurring, and in this case the action is authenticating a user.

What you can do is use the $routeChangeStart event that's emitted in order to add a property to the resolve object on the route like so:

function authenticate() {
    if ( user.isAuthenticated ) {
        return;
    }
    // Just fake it, but in a real app this might be an ajax call or something
    return $timeout(function() {
        user.isAuthenticated = true;
    }, 3000);
}

$rootScope.$on( "$routeChangeStart", function( e, next ) {
    console.log( "$routeChangeStart" );
    next.resolve = angular.extend( next.resolve || {}, {
        __authenticating__: authenticate
    });
});

Since angular will wait for any promises in the resolve object to be fulfilled before proceeding, you can just use a pseudo dependency as in the example. Using something like that, you should be able to guarantee that your user is authenticating prior to any routes successfully executing.

Example: http://jsfiddle.net/hLddM/

like image 154
dherman Avatar answered Sep 17 '22 02:09

dherman