8

API で動作する AngularJS Web サイトを作成しました。この API は、認証 (Oauth) などのいくつかの機能を提供します。

API が 401 エラーを返した場合は、 のaccess_token有効期限が切れており、 で更新する必要があることを意味しrefresh_tokenます。

AngularJS でインターセプターを作成しました。その目的は、API によって返された結果が 401 エラーであるかどうかを確認することです。その場合は、トークンを更新してから、以前に拒否された要求を処理する必要があります。

問題は、インターセプターが無限ループを作成することです。最初のリクエストが 2 回失敗すると、停止するはずですが、停止しません。

angular.module('myApp')
.factory('authInterceptor', function ($rootScope, $q, $window, $injector) {

  return {

    // If the API returns an error
    'responseError' : function(rejection) {

      // If it's a 401
      if (rejection.status == 401) {

        var deferred = $q.defer();

        $injector.get('$http').post('http://my-api.local/api/oauth/token', {
          grant_type    : 'refresh_token',
          client_id     : 'id',
          client_secret : 'secret',
          refresh_token : $window.sessionStorage.refresh_token
        }, {
          headers : {
            'Content-Type'  : 'application/x-www-form-urlencoded'
          },
          transformRequest  : function(obj) {
            var str = [];
            for(var p in obj)
            str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
            return str.join("&");
          }
        })
        // New token request successfull
        .success(function(refreshResponse) {

          // Processing the failed request again (should fail again because I didn't saved the new tokens)
          $injector.get('$http')(rejection.config).success(function(data) {

            deferred.resolve(data);

          })
          .error(function(error, status) {

            deferred.reject();

          });

          return deferred.promise();

        })
        // New token request failure
        .error(function(error, status) {

          deferred.reject();
          // $location.path('users/login');

          return;

        });

      }
      // If it's another errorenter code here
      else
        return rejection;

    }

  }

});

したがって、このコード:

  • 最初のリクエストが失敗したときに開始
  • トークンをリフレッシュします
  • リクエストを再試行しますが、再び失敗します (<- ここで停止させたいだけです)
  • トークンをリフレッシュします
  • リクエストを再試行しますが、再び失敗します
  • トークンをリフレッシュします
  • リクエストを再試行しますが、再び失敗します
  • 等...
4

1 に答える 1