如何在AngularJS中刷新过期的jwt令牌
我正在开发一个Angular webapp,它使用API来获取一些数据。 要获得数据,我必须发送JWT。 我创建了一个调用PHP文件以获取令牌的服务:如何在AngularJS中刷新过期的jwt令牌,angularjs,jwt,Angularjs,Jwt,我正在开发一个Angular webapp,它使用API来获取一些数据。 要获得数据,我必须发送JWT。 我创建了一个调用PHP文件以获取令牌的服务: (function () { 'use strict'; angular .module('MyApp') .factory('TokenService', Service); function Service( $http, $localStorage ) { var service = {}; service.getT
(function () {
'use strict';
angular
.module('MyApp')
.factory('TokenService', Service);
function Service( $http, $localStorage ) {
var service = {};
service.getToken = getToken;
return service;
function getToken() {
return $http.post('gettoken.php');
}
}})();
我所做的就是运行我调用的块并存储收到的令牌:
function run( $rootScope, $http, $location, $localStorage, TokenService ) {
TokenService.getToken().then(function(response) {
$localStorage.token = response.data.token;
});
console.log('token: ' + $localStorage.token);
$http.defaults.headers.common.Authorization = 'Bearer ' + $localStorage.token;
}})();
每隔几分钟令牌就会过期,因此我必须请求另一个令牌,以便用户可以继续与API交互
为了解决这个问题,我的第一种方法是使用.config块截获401错误(令牌已过期)并请求另一个令牌,但这是不可能的,因为据我所知,无法在.config块中注入服务:
function config2( $httpProvider ) {
$httpProvider.interceptors.push(function ($q, $rootScope) {
return {
'response': function (response) {
//Will only be called for HTTP up to 300
console.log(response);
return response;
},
'responseError': function (rejection) {
if(rejection.status === 401) {
var deferred = $q.defer();
TokenService.getToken(function() {
retryHttpRequest(response.config, deferred);
});
return deferred.promise;
} else {
return response;
}
function retryHttpRequest(config, deferred){
function successCallback(response){
deferred.resolve(response);
}
function errorCallback(response){
deferred.reject(response);
}
var $http = $injector.get('$http');
$http(config).then(successCallback, errorCallback);
}
}
};
});
}
事实上,当我执行webapp时,它说TokenService没有定义,如果我注入TokenService,显然它会创建一个循环依赖性:
angular.js:66 Uncaught Error: [$injector:cdep] Circular dependency found: $http <- TokenService <- $http <- $templateRequest <- $route
http://errors.angularjs.org/1.6.4/$injector/cdep?p0=%24http%20%3C-%20TokenService%20%3C-%20%24http%20%3C-%20%24templateRequest%20%3C-%20%24route
at angular.js:66
at getService (angular.js:4936)
at injectionArgs (angular.js:4969)
at Object.invoke (angular.js:4995)
at Object.enforcedReturnValue [as $get] (angular.js:4836)
at Object.invoke (angular.js:5003)
at angular.js:4795
at getService (angular.js:4944)
at injectionArgs (angular.js:4969)
at Object.invoke (angular.js:4995)
angular.js:66未捕获错误:[$injector:cdep]找到循环依赖项:$http这可能是因为$http
服务依赖于您的拦截器,您的令牌服务
依赖于$http
服务,拦截器依赖于令牌服务
。这会导致循环依赖
您似乎已经在使用$injector
及时注入$http服务,因此为了解决循环依赖关系,使用相同的方法注入令牌服务
可能会解决您的问题
var TokenService = $injector.get('TokenService');
我以前也遇到过同样的问题,如果你能帮上忙的话。这可能是因为$http
服务依赖于你的拦截器,你的TokenService
依赖于$http
服务,你的拦截器依赖于TokenService
。这会导致循环依赖
您似乎已经在使用$injector
及时注入$http服务,因此为了解决循环依赖关系,使用相同的方法注入令牌服务
可能会解决您的问题
var TokenService = $injector.get('TokenService');
我以前也遇到过同样的问题,如果有什么帮助的话。非常感谢您的帮助。我应用了你说的话。现在的问题是当我调用getToken inside ResponseError时:它返回新的令牌,但不将其应用于当前的401请求,因此我收到新令牌,但对API的请求仍然失败。我正在GitHub上阅读您的解决方案,我希望我能用这些代码解决它。非常感谢!我最终以您的工厂为例修改了代码。它工作得很好!!谢谢非常感谢你的帮助。我应用了你说的话。现在的问题是当我调用getToken inside ResponseError时:它返回新的令牌,但不将其应用于当前的401请求,因此我收到新令牌,但对API的请求仍然失败。我正在GitHub上阅读您的解决方案,我希望我能用这些代码解决它。非常感谢!我最终以您的工厂为例修改了代码。它工作得很好!!谢谢