У меня возникли проблемы с кодированием этого и заставить его работать. Я не уверен, что выполнил обещания правильно или передал данные.
Он должен добавить 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() имеют правильные аргументы.
Ваша функция конфигурации глобальна и может конфликтовать с параметром конфигурации запроса перехватчика. Поэтому сделайте свою конфигурационную функцию следующим: -
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;
}]);
ура
Проблема в том, что вы пытаетесь использовать 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) {
}