Bruno Camarneiro
Bruno Camarneiro

Reputation: 555

How to change resource's headers in angularjs

I'm trying to set the headers of a resource (code bellow). It happens that, when I instantiate my resource ($scope.user = new rsrUser;) angularjs fetches the cookies that aren't yet defined (an "undefined" error is fired from inside "getHMAC()"). The cookies will only be defined when "$scope.login()" is fired (it happens when the user clicks a button in the interface).

Is there a better way of doing this?

controllers.js

angularjsWebInterfaceControllers.controller('loginCtrl', ['$scope', 'rsrUser',
function($scope, rsrUser){
    $cookieStore.put("username","therebedragons");
    $cookieStore.put("password","therebedragons");

    $scope.user = new rsrUser;
    $scope.user.username = ""; //bound to input field in interface
    $scope.user.password = ""; //bound to input field in interface


    $scope.login = function() {
      $cookieStore.put("username", $scope.user.username);
      $cookieStore.put("password", $scope.user.password);
      $cookieStore.put("state", "loggedOUT");

      $scope.user.$logIn(
        function(){
           $cookieStore.put("state", "loggedIN");
        }, function() {
          $cookieStore.put("username","therebedragons");
          $cookieStore.put("password","therebedragons");
          $cookieStore.put("state", "loggedOUT");
        }
      )
     };
}]);

services.js

angularjsWebInterfaceServices.service('rsrUser', [ '$resource', '$cookieStore',
  function($resource, $cookieStore){
    var req = "/login"
    var timestamp = getMicrotime(true).toString();
    var username = $cookieStore.get("username");
    var key = $cookieStore.get("password");
    return $resource(baseURL + req, {}, {
      logIn: {method:'POST',
              isArray:false,
              headers:{
                  'X-MICROTIME': timestamp,
                  'X-USERNAME': username,
                  'X-HASH': getHMAC(username,timestamp,req,key)
                }
            }
    });
  }]);

EDIT: Actually, the cookies are defiend as soon as the controller is instantiated;

Upvotes: 0

Views: 230

Answers (1)

c0bra
c0bra

Reputation: 3012

The value for a header can be a function that returns a string (see arguments here: http://docs.angularjs.org/api/ng/service/$http#usage). That way the cookie isn't accessed in your resource until the logIn method is called.

return $resource(baseURL + req, {}, {
  logIn: {method:'POST',
          isArray:false,
          headers: {
              'X-MICROTIME': timestamp,
              'X-USERNAME': function() {
                return $cookieStore.get("username");
              },
              'X-HASH': function() {
                var username = $cookieStore.get("username");
                return getHMAC(username,timestamp,req,key)
              }
            }
        }
});

Upvotes: 2

Related Questions