Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Set RestAngular default request parameters after login

I'm hitting an API which requires all authenticated actions to include an auth token in the request, however, I do not have the auth token until I login.

I've only seen examples of setting default request parameters in Restangular in app.config. Is it possible to set this until after the user has logged in and User.auth_token is set?

So basically instead of:

app.config(function(RestangularProvider) {
    RestangularProvider.setDefaultRequestParams({
        auth_token: 'thisistheauthenticationtoken'
    });
});

I need:

app.config(function(RestangularProvider) {
    RestangularProvider.setDefaultRequestParams({
        auth_token: User.auth_token
    });
});
like image 279
theintellects Avatar asked Jul 21 '14 19:07

theintellects


2 Answers

Why would you set token as part of the response versus in the header? Like so.

Restangular.setDefaultHeaders({ authentication: 'bearer ' + token.authentication });
like image 128
Long Huynh Avatar answered Sep 18 '22 02:09

Long Huynh


I know this is an old thread but this SO question kept appearing when I was Googling (yes, I just used Google as a verb... deal with it :P) for a resolution, so I thought I should provide my solution. Hopefully it will help the OP or anyone else that may come across this page.

angular.module("app").factory("UserService", [
    "$rootScope",
    "$state",
    "$q",
    "Restangular",
    function ($rootScope, $state, $q, Restangular) {
        var UserSvc = {};
        var Identity;

        /*
            This creates a scoped copy of Restangular
            Normally this is where you would use setDefaultRequestParams,
            but it would only affect this scope and not ALL API requests in your app
         */
        var UsersAPI = Restangular.withConfig(function (RestangularConfigurer) {
            RestangularConfigurer.setBaseUrl("api/1.0/users");
        });

        UserSvc.login = function (credentials) {
            var $defer = $q.defer();

            UsersAPI.all("start-session").post(credentials).then(function(respData){
                if (respData.apikey) {
                    Identity = respData.plain();

                    /*
                        User is authenticated and API key is obtained from server response

                        Note how I do NOT use the setDefaultRequestParams function:
                        If we do the withConfig/setDefaultRequestParams, it only affects local scope, not global
                        This method modifies the ROOT Restangular object and
                        will then propegate through all future use of Restangular in your app
                     */
                    Restangular.configuration.defaultRequestParams.common.apikey = Identity.apikey;


                    if ($rootScope.toState && $rootScope.toState.name != "login") {
                        $state.go($rootScope.toState.name, $rootScope.toStateParams || {});
                    } else {
                        $state.go("app.dashboard");
                    }

                    $defer.resolve(Identity);
                }
                else {
                    Identity = undefined;

                    $defer.reject(Identity);
                }
            },function (respData) {
                $defer.reject(respData);
            });

            return $defer.promise;

        };

        return UserSvc;
    }
]);
like image 42
Walter Mazza Avatar answered Sep 20 '22 02:09

Walter Mazza