2014-12-23 2 views
0

У меня есть аутентификатор перехватчика и проверка подлинности 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); 

} 

ответ

0

вы должны сначала создать объект обещания вернуться затем повторите запрос, используя $ 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 очереди запросов и повторить их все когда-то разрешение преуспевает

Edit: вы можете использовать что-то вроде этого https://github.com/witoldsz/angular-http-auth/blob/master/src/http-auth-interceptor.js

Смежные вопросы