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

Angular resend the request after change the token

本文关键字:新发送 请求 令牌 Angular      更新时间:2023-09-26

我有身份验证拦截器和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);
}

你应该首先创建一个要返回的承诺对象,然后使用$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