0

처음에는 컨트롤러마다 JWT 토큰을 포함하여 configAuth 개의 헤더가 있습니다.다른 요청 (URL)에 대한 인터셉터를 분할하는 방법은 무엇입니까?

var configAuth = { 
    headers: { 
     'Content-Type': 'application/json', 
     'Authorization': localStorage.getItem('token') 
    } 
}; 

하지만 지금은 컨트롤러가 아주 많을 때 나는 그것에 대해 뭔가를해야한다는 것을 깨달았습니다. 나는 interceptors에 대해 들었고 그들을 얻으려고 노력했다.

/login과 같은 일부 페이지 및 요청은 토큰이 전혀 없기 때문에 모든 요청에 ​​토큰을 넣을 수 없다는 것을 알고 있습니다. Authorization header으로 html 파일을 가져 오는 것은 어떻게 든 예외를 제공합니다.

angular.module('App') 

.factory('sessionInjector',['$injector', function ($injector) { 
    var sessionInjector = { 
     request: function (config) { 
      if (config.url == "/one" || config.url == "/two"){ 
       config.headers['Content-Type'] = 'application/json;charset=utf-8;'; 
       config.headers['Authorization'] = localStorage.getItem('token'); 
      } else { 
       config.headers['Content-Type'] = 'application/json;charset=utf-8;'; 
      } 
      return config; 
     }, 
     response: function(response) { 
      if (response.status === 401) { 
       var stateService = $injector.get('$state'); 
       stateService.go('login'); 
      } 
      return response || $q.when(response); 
     } 
    }; 
    return sessionInjector; 
}]); 

을하지만 /one/{one_id} 같은 요청을 작동하지 않습니다와 나는 모든 가능성을 하드 코딩 할 수 없습니다 그래서 그런 요청을 분할 시도했습니다. 그래서 이것에 대한 가장 좋은 방법은 무엇입니까?

+0

여기에 모범 사례로가는 아니,하지만 당신은 쉽게 '보다 더 유연한 매처 (matcher)를 사용할 수 있습니다 config.url == "/ one"'. 예를 들어, url *이'/ config.url.indexOf ('/ one') === 0' 또는 regex를 사용하여 "/ one"으로 시작하는지 확인할 수 있습니다. 또한 권한이 필요한 것보다 많은 라우트가있는 경우에는'if (config.url! == '/ login')'와 같이 다른 방법으로 체크를 돌릴 수 있습니다. – noppa

답변

1

지금부터 시작하는 것이 좋은 출발점입니다. 대부분의 API에 인증 토큰이 필요하다고 가정하므로 인증을 필요로하지 않는 엔드 포인트를 설정하는 것이 더 빠른 경로 일 수 있습니다. 나는 이것을 시험하지는 않았지만, 그것은 당신을 올바른 길로 인도 할 것입니다. 인젝터를 제공 업체로 설정하여 익명의 라우트 규칙을 구성 할 수 있습니다. 이와

angular.module('App') 
    .provider('sessionInjector',[function() { 
     var _anonymousRouteRules; 

     this.$get = ['$injector', getSessionInjector]; 
     this.setupAnonymousRouteRules = setupAnonymousRouteRules; 

     function getSessionInjector($injector) { 
      var service = { 
       request: requestTransform, 
       response: responseTransform 
      }; 

      function requestTransform(config) {   
       if (!isAnonymousRoute(config.url)){ 
        config.headers['Authorization'] = localStorage.getItem('token'); 
       } 

       config.headers['Content-Type'] = 'application/json;charset=utf-8;'; 

       return config; 
      } 

      function responseTransform(response) { 
       if (response.status === 401) { 
        var stateService = $injector.get('$state'); 
        stateService.go('login'); 
       } 
       return response || $q.when(response); 
      } 

      return service; 
     } 

     function isAnonymousRoute(url) { 
      var isAnonymous = false; 
      angular.forEach(_anonymousRouteRules, function(rule) { 
       if(rule.test(url)) { 
        isAnonymous = true; 
       } 
      }); 
      return isAnonymous; 
     } 

     function setupAnonymousRouteRules(anonymousRouteRules) { 
      _anonymousRouteRules = anonymousRouteRules; 
     } 
    }]); 

, 당신은 당신의 URL에 대한 정규 표현식에 배열 전달하여 규칙을 구성 할 수 있습니다

angular.module('App').config(['sessionInjectorProvider', config]); 

function config(sessionInjectorProvider) { 
    sessionInjectorProvider.setupAnonymousRouteRules([ 
     /.*\.html$/, 
     /^\/login$/ 
    ]); 
} 
1

이렇게하는 더 좋은 방법이 있습니다. 로그인 후 auth 토큰을 $ http 서비스의 헤더에 설정하십시오. 따라서 각 호출에서 config 객체를 전달할 필요가 없습니다.

로그인이 후

function Login(credentials){ 
    $http.post(apiPath, credentials).then(function (data) { 
     $http.defaults.headers.common['Authorization'] = data['token']; 
    }); 
} 

모든 HTTP 호출 인증 헤더가 설정되어 있습니다.

그러나 헤더에 Authorization없이 전달 된 자체 구성 객체가있는 함수를 작성할 수있는 경우 권한 부여가 필요하지 않은 호출이 있습니다. 허가없이

기능 :

function Without_Auth(url, data) { 
    var deferred = $q.defer(); 
    var responsePromise = $http({ 
     method: 'post', 
     url: url, 
     data: data, 
     headers: { 
      'Content-Type': 'application/json;charset=utf-8;' 
     } 
    }) 
    responsePromise.success(function (data) { 
     deferred.resolve(data); 
    }); 
    responsePromise.error(function (err) { 
     deferred.reject(); 
    }); 
    return deferred.promise; 
} 

희망이 당신의 문제를 해결!