Посылать header во всех методах $resource (ngResource)

Я использую ngResource в Угловом, чтобы соглашаться на API RESTful. Я создал одну factory очень простой, чтобы этого добиваться.

.factory('Bookmark', function($resource){
    return $resource('http://bookmarks-angular.herokuapp.com/api/bookmarks/:id');
})

В драйвере я использовал Bookmark.query:

.controller('MainController', function($scope, Category, Bookmark){
    $scope.name = 'Carl';
    Category.getAll(function(data){
        $scope.categories = data.categories;
        $scope.currentCategory = data.categories[0];
        $scope.bookmarks = Bookmark.query();
    });
})

Я нуждаюсь в том, чтобы использовать кроме того Bookmark.save и Bookmark.remove, также как и один token в заголовке Authorization. Ища я нашел решение:

$resource('url/to/json', {}, {
    get: {
        method: 'GET',
        headers: { 'something': 'anything' }
    }
}); 

Однако это функционирует только для метода get и я хотел бы использовать это, чтобы посылать token в каждом методе $resource. Я не хочу sobreescribir каждый одинокий метод, чтобы распределять header. Какая-то альтернатива существует?

Обновление

Видя комментарии я думаю, что я должен добавлять, чем, чтобы производить token я использую JWT (Веб JSON Token), который это произвел в backend и переместил это frontend, когда осуществляется login, распределяя это в поле в $sessionStorage. Пока этот token не умирает, но по причинам безопасности в предстоящем будущем он будет должен делать это. Кроме того url, который послан, чтобы производить token и возможно какие-то другие в будущем не требуют этой проверки.

1
задан 15.03.2016, 17:31
2 ответа

Угловой введи концепцию interceptors для всего того, что имеет общее с просьбами http. С этими ты можешь изменять как просьбу, так и ответ. В твоем случае то, в чем ты нуждаешься, является request истребителем - перехватчиком, так как token он будет послан в каждой просьбе. $resource это только один слой абстракции, превышающей услугу $http.

Это форма больше простая добивания этого.

function tokenInterceptor() {
    return {
        'request': function (config) {
            // Tienes que usar un factory o $localStorage para saber cual es el token
            // Aquí estoy asumiendo que usas OAuth
            if (token) {
                config.headers['Authorization'] = 'Bearer ' + token;
            }
            return config;
        }
    };
}

function interceptors($httpProvider) {
    $httpProvider.interceptors.push('tokenInterceptor');
}

interceptors.$inject = ['$httpProvider'];

angular.module('myAppModule')
    .factory('tokenInterceptor', tokenInterceptor)
    .config(interceptors);

Ты создаешь истребителя - перехватчика как factory и это добавляешь к твоему приложению используя $httpProvider.

Обновление

Разум, из-за которого ты должен использовать истребителя - перехватчика,, - потому что tokens не продолжаются навсегда, очень вероятно, что они умирают, так что, если ты это помещаешь в один run block или один config block это только будет работать в начале твоего приложения и потом прекратит функционировать, когда он достигнет Вашей даты окончания.

Если ты стараешься осуществлять удостоверение OAuth, или я сходную какую-то думаю, что может стоить тебе бросать вид в satelizer, что является формой, самой легкой для того, чтобы удостоверение быть объединенным из-за tokens в угловой.

1
ответ дан 24.11.2019, 14:44

Ты можешь использовать $http.defaults.headers.common , он будет применяться ко всем запросам ajax твоего SPA.

module.run(function($http) {
  $http.defaults.headers.common.Authorization = 'Bearer <token aquí>';
});
0
ответ дан 24.11.2019, 14:44
  • 1
    Я чувствую, что это решает проблему, но оставляет ужасное отверстие в aplicaci и # 243; n. Лучшее быть и # 237; когда м использует механизм и # 225; s такая страховка как OAuth вместо того, чтобы посылать верительные грамоты или разрешения посредством headers. –  14.03.2016, 22:54
  • 2
    @LuiggiMendoza OAuth, использует tokens, который ты должен получать от сервера autenticaci и # 243; n и посылать в запросах. Он не решает проблему секрета. – rnrneverdies 14.03.2016, 23:01
  • 3
    Ло " resuelve" потому что каждый token произведен, чтобы санкционировать каждый request. –  14.03.2016, 23:02
  • 4
    Что? ты просишь token для каждого request...? – rnrneverdies 14.03.2016, 23:03
  • 5
    @LuiggiMendoza Действительно OAuth использует headers tambi и # 233; n и эти производят в зависимости от разгрузки , которые ты выбрал бы, и как ты это осуществляешь. Если ты используешь refresh tokens, ты получаешь новый один начиная со старого одного, но это одинокое, если ты помогаешь refresh tokens и согласно времени expiraci и # 243; n каждого token. – devconcept 14.03.2016, 23:04