AngularJS Ответ перехватчики и обещания

0

У меня возникли проблемы с кодированием этого и заставить его работать. Я не уверен, что выполнил обещания правильно или передал данные.

Он должен добавить access_token к каждому запросу и проверить каждую ошибку ответа на 401, а затем попытаться обновить токен, а затем, если это не получится, получите новый токен.

Вот файл маршрутов, проверьте нижнюю часть для соответствующего кода:

(function () {
  'use strict';

  angular
    .module('sawebpanel.routes')
    .config(config);

  config.$inject = ['$routeProvider', '$httpProvider'];

  /**
   * @name config
   * @desc Define valid application routes
   */
  function config($routeProvider, $httpProvider) {
    $routeProvider.when('/home', {
      controller: 'IndexController', 
      controllerAs: 'vm',
      templateUrl: '/static/templates/layout/index.html'
    }).when('/accounts/register', {
      controller: 'RegisterController', 
      controllerAs: 'vm',
      templateUrl: '/static/templates/authentication/register.html'
    }).when('/accounts/login', {
      controller: 'LoginController',
      controllerAs: 'vm',
      templateUrl: '/static/templates/authentication/login.html'
    }).when('/accounts/+:username', {
      controller: 'AccountController',
      controllerAs: 'vm',
      templateUrl: '/static/templates/accounts/account.html'
    }).when('/accounts/+:username/settings', {
      controller: 'AccountSettingsController',
      controllerAs: 'vm',
      templateUrl: '/static/templates/accounts/settings.html'
    }).when('/accounts/+:username/profile', {
      controller: 'AccountProfileController',
      controllerAs: 'vm',
      templateUrl: '/static/templates/accounts/profile.html'
    });

    $httpProvider.interceptors.push(function($rootScope, $q, $injector, $location) {
      return {
       'request': function(config) {

            config.headers['Authorization'] = "Bearer " + $rootScope.oauth.access_token;
            return config;
        },

        'responseError': function(response) {
          if (response.status === 401) {
            var deferred = $q.defer();
            params = JSON.stringify({
              refresh_token: $rootScope.oauth.refresh_token,
              client_id: $rootScope.oauth.client_id,
              client_secret: $rootScope.oauth.client_secret,
              grant_type: "password"
            });
            $injector.get("$http").jsonp('/api/v1/auth/token?' + params).then(function($refreshResponse) { // try to refresh token
              if (refreshResponse.data) {
                $rootScope.oauth = angular.fromJson($refreshResponse.data); // set oauth data

                $injector.get("$http")(response.config).then(function(response) { 
                  deferred.resolve(response);  
                }, function(response) {
                  deferred.reject(); // no data in response
                });
              } else {
                deferred.reject();
              }
            }, function(response) {
              params = JSON.stringify({
                client_id: $rootScope.oauth.client_id,
                client_secret: $rootScope.oauth.client_secret,
                grant_type: "password"
              });
              $injector.get("$http").jsonp('/api/v1/auth/token?' + params).then(function($loginResponse) { // try for a new token
                if ($loginResponse.data) {
                  $rootScope.oauth = angular.fromJson($loginResponse.data); // set oauth data

                  $injector.get("$http")(response.config).then(function(response) { 
                    deferred.resolve(response);  
                  }, function(response) {
                    deferred.reject();
                  });
                }, else {
                  deferred.reject(); // no data in response
                }
              }, function(response) {
                deferred.reject();
                $location.path('/accounts/login'); // give up and redirect to login
                return;
              });
            });
            return deferred.promise;
          }
          return $q.reject(response);
        }
      };
    });
  }
})();

Мне сказали положить эту строку для проверки того, работал ли обработчик и устанавливал токен, но я не уверен, исправлен ли он.

$injector.get("$http")(response.config).then(function(response) {
                  deferred.resolve(response);  
                }, function(response) {
                  deferred.reject();
                });

Мне нужна помощь в том, чтобы убедиться, что структура данных $ rootScope.oauth правильно обработана и что я правильно настраиваю атрибуты. И что обещания настроены правильно в функции responeError. И что вызовы jsonp() имеют правильные аргументы.

Теги:

2 ответа

3
Лучший ответ

Ваша функция конфигурации глобальна и может конфликтовать с параметром конфигурации запроса перехватчика. Поэтому сделайте свою конфигурационную функцию следующим: -

   angular
   .module('sawebpanel.routes').config(function(){
      //Your code...
   });

Для перехватчика сделайте услугу отдельно для перехватчика и подтолкните его к массиву перехватчиков. Недавно я реализовал то же самое. Я написал весь сценарий в своем блоге, это определенно поможет вам: -

http://www.codemosquitoes.com/2016/06/using-angularjs-interceptors-with-http.html

Дайте мне знать, если у вас есть вопрос.

Вот реализация tokenService: -

   angular.module("app").service('tokenService', ["$cookies", "$injector", "$q", function ($cookies, $injector, $q) {
var services = {};

services.tokenValue = function () {
    return $cookies.get('token');
};

services.setTokenCookie = function (key, value) {
    var expireDate = new Date();
    expireDate.setDate(expireDate.getDate() + 1);
    $cookies.put(key, value, { 'expires': expireDate, path: '/' });
}

services.refreshToken = function (isAuth) {
    var deferred = $q.defer();
    $http = $injector.get('$http');
    $http.get('urlForGettingTokenApi').success(function (data, status, headers, config) {
        deferred.resolve(data);
    }).error(function (data, status, headers, config) {
        deferred.resolve("Error");
    });
    return deferred.promise;
};

return services;
}]);

ура

  • 1
    Ну, у меня уже есть одна функция конфигурации. Могу ли я просто настроить мои перехватчики в этом? Также, где вы определяете tokenService?
  • 0
    Я читал твой пост, и он мне очень помог. Но у меня есть несколько вопросов. Нужны ли отдельные перехватчики для ответа и запроса, или я не могу просто поместить responseError и request в одну и ту же функцию? Мой другой вопрос касается хранения данных oauth. Я использую $ rootScope.oauth.data, но я не уверен, правильно ли я его использую. Не могли бы вы дать мне пример того, как определить / настроить ваш tokenService или как мне установить $ rootScope.oauth?
Показать ещё 2 комментария
1

Проблема в том, что вы пытаетесь использовать provider without injecting it. Change your 'config' function definition to inject the provider without injecting it. Change your 'config' function definition to inject the поставщика:

angular
  .module('sawebpanel.routes')
  .config(config);

  config.$inject = ['$routeProvider', '$httpProvider'];

  /**
   * @name config
   * @desc Define valid application routes
   */
  function config($routeProvider, $httpProvider) {

  }
  • 0
    Итак, у меня есть две функции конфигурации, могу ли я просто переместить мои перехватчики в одну? Или как я могу вызвать 2 функции конфигурации на модуле?
  • 0
    Смотрите мой обновленный пример кода, это то, что вы имели в виду? Также я правильно использую $ rootScope? Я запутался с настройкой структуры данных для хранения данных oauth.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню