Angular在更改令牌后重新发送请求

时间:2014-12-23 11:58:21

标签: javascript angularjs jwt

我有auth拦截器和JWT身份验证。 当令牌过期时我得到401并且我需要发送刷新令牌的请求。 令牌刷新后,我想重新发送用户请求,但它无法正常工作。

例如,要转到我的帐户标签,用户需要拥有有效令牌,他点击我的帐户并获取401,然后发送刷新令牌,并将有效令牌保存在本地存储中。

现在我希望在此之后拦截器自动执行用户操作,在这种情况下转到我的帐户但我的方式不起作用,我该怎么办?

拦截器:

'responseError': function(rejection) {
    var $state = $injector.get('$state');
    var deffer = $q.defer();
    if (rejection.status === 401) {
        var $http = $injector.get('$http');
        var AuthService = $injector.get('AuthService');
        var user = store.get('user');
        var cred = AuthService.refreshTokenValue(user.secretId, user.secretClient, user.refreshToken);
        AuthService.getRefreshToken(cred).then(function(res) {
            UserService.oAuth.accessToken = res.data.access_token;

            // here i want to resend the request
            return deffer.resolve(rejection);
        });

    }

    return $q.reject(rejection);

}

1 个答案:

答案 0 :(得分:0)

你应该先创建一个promise对象,然后使用$ http(rejection.config)返回重试请求, 根据您的授权程序解决或拒绝承诺。

示例代码

var $state = $injector.get('$state');

 var retryRequest = function($http, config, deferred) {
        function successCallback(response) {
            deferred.resolve(response);
        }
        function errorCallback(response) {
            deferred.reject(response);
        }
        $http(config).then(successCallback, errorCallback);
    }

if (rejection.status === 401) {
    var deferred = $q.defer(); //moved deferred to here
    var $http = $injector.get('$http');
    var AuthService = $injector.get('AuthService');
    var user = store.get('user');
    var cred = AuthService.refreshTokenValue(user.secretId, user.secretClient, user.refreshToken);
    AuthService.getRefreshToken(cred).then(function(res) {
        UserService.oAuth.accessToken = res.data.access_token;
        retryRequest($http, rejection.config, deferred);
        // here i want to resend the request
        return deffer.resolve(rejection);
    });
    return deferred.promise;
}

return $q.reject(rejection);

但是你应该更好地使用httpBuffer对请求进行排队,并在授权成功后重试所有请求

编辑:您可以使用类似https://github.com/witoldsz/angular-http-auth/blob/master/src/http-auth-interceptor.js

的内容