2017-05-12 21 views
7

私はリフレッシュトークンをしばらく稼働させようとしています。私のトークンがリフレッシュされ、401を引き起こした呼び出しに続いて200回の呼び出しが発生しますが、私のページのデータは更新されません。アクセストークンの有効期限が切れるとリフレッシュトークンがリフレッシュされた後にデータをリフレッシュする方法jwt

は、次の処理が行われます

enter image description here

401後、GetListofCompanyNames正しい更新アクセストークンを使用して、名前のリストと200を返します。ただし、私のドロップダウンは更新されません。

マイインターセプター:401拒否の

app.factory('authInterceptorService',['$q', '$location', 'localStorageService', '$injector', function($q, $location, localStorageService, $injector) { 
     return { 
      request: function(config) { 

       config.headers = config.headers || {}; 

       var authData = localStorageService.get('authorizationData'); 
       if (authData) { 
        config.headers.Authorization = 'Bearer ' + authData.token; 
       } 
       return config; 
      }, 
      responseError: function(rejection) { 
       //var promise = $q.reject(rejection); 
       var authService = $injector.get('authService'); 
       if (rejection.status === 401) { 

        // refresh the token 
        authService.refreshToken().then(function() { 
         // retry the request 
         var $http = $injector.get('$http'); 
         return $http(rejection.config); 
        }); 
       } 
       if (rejection.status === 400) { 
        authService.logOut(); 
        $location.path('/login'); 
       } 
       return $q.reject(rejection); 
      } 
     }; 
    } 
]); 

私のreturn文は、ここでは容疑者に見えますが、私はそれを交換するかわからないんだけど。それで私の質問は:私は新しい呼び出しを行うと私のページにデータを更新することができますか?

更新:

200を返す。これは、過去の私を取得し、私はリフレッシュするドロップダウンを得ることができますが、私は以下のページ(例:選択したドロップダウン。)上の任意の状態を失います。

authService.refreshToken().then(function() { 
var $state = $injector.get('$state'); 
$state.reload(); 
}); 

描画ボードに戻る!

+0

anglejsルータシステムを使用していますか? –

+0

うん、ui-router:https://github.com/angular-ui/ui-router – RandomUs1r

+0

$ stateサービスをあなたの 'authInterceptorService'に注入して' $ state.reload() 'を使ってみましたか? –

答えて

0

私の最終的な解決策:

app.factory('authInterceptorService', ['$q', '$location', 'localStorageService', '$injector', function($q, $location, localStorageService, $injector) { 
     var $http; 
     var retryHttpRequest = function(config, deferred) { 
      $http = $http || $injector.get('$http'); 
      $http(config).then(function(response) { 
        deferred.resolve(response); 
       }, 
       function(response) { 
        deferred.reject(response); 
       }); 
     } 

     return { 
      request: function(config) { 

       config.headers = config.headers || {}; 

       var authData = localStorageService.get('authorizationData'); 
       if (authData) { 
        config.headers.Authorization = 'Bearer ' + authData.token; 
       } 
       return config; 
      }, 
      responseError: function(rejection) { 
       var deferred = $q.defer(); 
       if (rejection.status === 401) { 
        var authService = $injector.get('authService'); 
        authService.refreshToken().then(function() { 
          retryHttpRequest(rejection.config, deferred); 
         }, 
         function() { 
          authService.logOut(); 
          $location.path('/login'); 
          deferred.reject(rejection); 
         }); 
       } else { 
        deferred.reject(rejection); 
       } 
       return deferred.promise; 
      } 
     }; 
    } 
]); 

https://github.com/tjoudeh/AngularJSAuthentication/blob/master/AngularJSAuthentication.Web/app/services/authInterceptorService.jsから、ほぼ1:1のためにコピーされます。

このリクエストは透過的にすべてのリクエストを処理し、必要に応じてリフレッシュします。リフレッシュトークンが期限切れになったときにユーザーをログアウトし、適切に拒否してコントローラにエラーを渡します。しかし、複数の飛行要求ではうまく動作しないようですが、私のシステムでそれを使用するケースを見ていきます。

1

私はこのことについてどうやって変えたいのでしょうか?この問題を解決する方法の1つは、authInterceptorServiceに$ rootScopeを注入し、トークンを正常に更新したら、$rootScope.broadcast('tokenRefreshed')のようなものを呼び出します。

ドロップダウンを処理するビューとコントローラーの設定方法はよく分かりませんが、その'tokenRefreshed'イベントのリスナーを設定します。ここからをもう一度呼び出すことができます。このようにすれば、モデルが簡単に制御され、確実に更新されます。

2

再試行の電話を$timeoutに入れてみるとうまくいくはずです。

ここで更新されたコードです:

app.factory('authInterceptorService',['$q', '$location', 'localStorageService', '$injector', function($q, $location, localStorageService, $injector) { 
     return { 
      request: function(config) { 

       config.headers = config.headers || {}; 

       var authData = localStorageService.get('authorizationData'); 
       if (authData) { 
        config.headers.Authorization = 'Bearer ' + authData.token; 
       } 
       return config; 
      }, 
      responseError: function(rejection) { 
       //var promise = $q.reject(rejection); 
       var authService = $injector.get('authService'); 
       if (rejection.status === 401) { 

        // refresh the token 
        authService.refreshToken().then(function() { 
         // retry the request 
        return $timeout(function() { 
         var $http = $injector.get('$http'); 
         return $http(rejection.config); 
        }}); 
       } 
       if (rejection.status === 400) { 
        authService.logOut(); 
        $location.path('/login'); 
       } 
       return $q.reject(rejection); 
      } 
     }; 
    } 
]); 

$タイムアウトは、関数のパラメータから 返されるもので完成された約束を返しますので、我々は便利なだけで$に包まれ $ HTTPコールを返すことができます。タイムアウト。

ありがとうございます。

関連する問題