Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在AngularJS中刷新过期的jwt令牌_Angularjs_Jwt - Fatal编程技术网

如何在AngularJS中刷新过期的jwt令牌

如何在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

我正在开发一个Angular webapp,它使用API来获取一些数据。 要获得数据,我必须发送JWT。 我创建了一个调用PHP文件以获取令牌的服务:

(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上阅读您的解决方案,我希望我能用这些代码解决它。非常感谢!我最终以您的工厂为例修改了代码。它工作得很好!!谢谢