2014-09-22 9 views
8

मैं सरल एपीआई और एक प्राधिकरण बिंदुहैंडल कोणीय 401 प्रतिक्रियाएं

जब मैं एपीआई को मैं एक 401 मिलता है टोकन अमान्य है (टोकन पांच मिनट अतीत वैधता खो देता है) का अनुरोध किया है।

मैं मैं

app.factory("HttpErrorInterceptorModule", ["$q", "$rootScope", "$location", 
    function($q, $rootScope, $location) { 
     var success = function(response) { 
      // pass through 
      return response; 
     }, 
      error = function(response) { 
       if(response.status === 401) { 
        // dostuff 
       } 

       return $q.reject(response); 
      }; 

     return function(httpPromise) { 
      return httpPromise.then(success, error); 
     }; 
    } 
]).config(["$httpProvider", 
    function($httpProvider) { 
     $httpProvider.responseInterceptors.push("HttpErrorInterceptorModule"); 
    } 
]); 

साथ उदाहरण के लिए 401 को रोक सकता है, लेकिन मैं पर कब्जा और अनुरोध कतार और एक लॉगिन रूप को दिखाने अगर है सफलता तो टोकन बदलना (यह एक शीर्ष लेख है) और फिर से अनुरोध पर अमल

चाहते

उत्तर

6

आप $ httpInterceptor को किसी अन्य तरीके से उपयोग कर सकते हैं। यदि आप उस पृष्ठ पर लॉग इन करने के बाद उपयोगकर्ता को रीडायरेक्ट करना चाहते हैं जहां उपयोगकर्ता वास्तव में असफल रहा है तो आपको कुछ सेवा में असफल अनुरोध कैश करने की आवश्यकता है और फिर लॉगिन के बाद कहीं भी उपयोगकर्ता को रीडायरेक्ट करना होगा (मैं आपके लॉगिन से जुड़े तर्क में निष्क्रिय हूं)।

लेकिन आप कुछ परीक्षण endpoint अप्रतिबंधित उपयोग से अपने नियंत्रकों की रक्षा करने के लिए आवश्यकता हो सकती है, आप तो इस मामले आप proctedted समाप्ति बिंदु को लेकिन अपने पृष्ठ के लिए नहीं प्रतिबंधित एक्सेस के साथ जुड़े हुए त्रुटि प्राप्त करेंगे में संकल्प https://thinkster.io/egghead/resolve/ उपयोग करने के लिए चाहते हो सकता है।

इस समस्या को हल करने के लिए मैंने मार्कर परम (या हेडर) का उपयोग यह पता लगाने के लिए किया कि मुझे लॉगिन के बाद उपयोगकर्ता को कहां रीडायरेक्ट करना चाहिए।

यहां आपके httpInterceptor का उदाहरण दिया गया है। ताकि आप सुन सके

angular.factory('httpInterceptor', function ($q, $rootScope, $log, someService) { 
    return { 
     request: function (config) { 
      return config || $q.when(config) 
     }, 
     response: function (response) { 
      return response || $q.when(response); 
     }, 
     responseError: function (response) { 
      if (response.status === 401) { 
       //here I preserve login page 
       someService 
        .setRestrictedPageBeforeLogin(
          extractPreservedInfoAboutPage(response) 
        ) 
       $rootScope.$broadcast('error') 
      } 
      return $q.reject(response); 
     } 
    }; 
}) 
.config(function ($httpProvider) { 
    $httpProvider.interceptors.push('httpInterceptor'); 
}); 
+0

की बस कुछ पंक्तियां हैं आप कृपया एक विवरण जोड़ सकते हैं? और अनुरोधों की कतार के बारे में – rkmax

+0

अनुरोध कतार कैसे मैं उन्हें कैश में डालूंगा, असफल अनुरोध पर कुछ ऑब्जेक्ट रखूंगा और फिर पुनर्निर्देशित करूँगा और फिर सफल लॉगिन के बाद पुनर्प्राप्त करूँगा। मैं 15 मिनट में जवाब ठीक कर दूंगा। – Artemis

+0

अगर मैं 'अनुरोध' फ़ंक्शन 'configs.push (config)' में प्रत्येक कॉन्फ़िगरेशन और 'प्रतिक्रिया' फ़ंक्शन 'configs.pop()' में पॉप करता हूं, तो मैं प्रत्येक प्रतिक्रिया को अनुरोध करने के लिए कैसे पहचान सकता हूं? – rkmax

2

कोणीय http प्रमाणीकरण मॉड्यूल, एक सेवा है जो अनुरोधों को बीच में रोक और उन्हें queques बाद में उन्हें एक बार में एक उपयोगकर्ता के लॉग दुबारा पाने के लिए प्रदान करता है।

इस सेवा की आग भी इन घटनाओं से नीचे उन्हें और यह तय करें कि

  • घटना स्क्रीन पर दिखाने के लिए: Auth-loginRequired
  • घटना: Auth-loginCancelled
  • घटना: aut-loginConfirmed

कोड को देखें। यह कोड

https://github.com/witoldsz/angular-http-auth

संबंधित मुद्दे