【问题标题】:Angular resend the request after change the token更改令牌后角度重新发送请求
【发布时间】:2015-02-21 13:40:46
【问题描述】:

我有身份验证拦截器和 JWT 身份验证。 当令牌过期时,我得到 401,我需要发送请求以刷新令牌。 刷新令牌后,我想重新发送用户请求,但它不起作用。

例如,进入我的账户标签,用户需要有有效的token,他点击我的账户得到401,然后发送刷新token并将有效token保存在本地存储中。

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

拦截器:

'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);

}

【问题讨论】:

    标签: javascript angularjs jwt


    【解决方案1】:

    你应该首先创建一个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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-06
      • 2014-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-29
      相关资源
      最近更新 更多