2017-05-15 12 views
12

कोणीय 4 में अंतर्निहित प्रवाह कॉलबैक को संभालने का सबसे अच्छा तरीका क्या है? मैं चाहता हूं कि गार्ड तब तक प्रतीक्षा करे जब तक उपयोगकर्ता को टोकन के साथ रीडायरेक्ट नहीं किया जाता है और गार्ड को सही या गलत लौटने से पहले संग्रहीत किया जाता है, मुझे टोकन की जांच करने के लिए रीडायरेक्ट करने से पहले कुछ सेकंड के लिए एक्सेस अस्वीकृत मार्ग मिल रहा है। क्या मैं कर रहा हूं उससे ऑथगार्ड को संभालने का कोई बेहतर तरीका है इसलिए मुझे प्रमाणीकरण पूर्ण होने से पहले प्रवेश अस्वीकार नहीं किया गया है?कोणीय 4 लागू प्रवाह कॉलबैक और राउटर गार्ड

मैं राउटर गार्ड को रीडायरेक्ट के लिए कैसे इंतजार करूं?

AppComponent

ngOnInit() {  

     //if there is a hash then the user is being redirected from the AuthServer with url params 
     if (window.location.hash && !this.authService.isUserLoggedIn()) {  

      //check the url hash 
      this.authService.authorizeCallback(); 

     } 
     else if (!this.authService.isUserLoggedIn()) {   

      //try to authorize user if they aren't login 
      this.authService.tryAuthorize();  

    }  
} 

AuthSerivce

tryAuthorize() { 
     //redirect to open id connect /authorize endpoint 
     window.location.href = this.authConfigService.getSignInEndpoint(); 
    } 

    authorizeCallback() {  

     let hash = window.location.hash.substr(1); 

     let result: any = hash.split('&').reduce(function (result: any, item: string) { 
      let parts = item.split('='); 
      result[parts[0]] = parts[1]; 
      return result; 
     }, {}); 


     if (result.error && result.error == 'access_denied') { 
      this.navigationService.AccessDenied(); 
     } 
     else { 

      this.validateToken(result); 
     } 
    } 


    isUserLoggedIn(): boolean {  
     let token = this.getAccessToken(); 

     //check if there is a token  
     if(token === undefined || token === null || token.trim() === '') 
     { 
      //no token or token is expired; 
      return false; 
     } 

     return true; 
    } 


    getAccessToken(): string {    

     let token = <string>this.storageService.get(this.accessTokenKey); 


     if(token === undefined || token === null || token.trim() === '') 
     { 
      return ''; 
     } 

     return token; 
    } 

    resetAuthToken() { 
     this.storageService.store(this.accessTokenKey, ''); 
    } 

    validateToken(tokenResults: any) {   

     //TODO: add other validations   

     //reset the token 
     this.resetAuthToken(); 

     if (tokenResults && tokenResults.access_token) { 

      //store the token 
      this.storageService.store(this.accessTokenKey, tokenResults.access_token); 

      //navigate to clear the query string parameters 
      this.navigationService.Home(); 

     } 
     else { 
      //navigate to Access Denied 
      this.navigationService.AccessDenied(); 
     } 

    } 
} 

AuthGuard

canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot){ 

    var hasAccess = this.authService.isUserLoggedIn();   

    if(!hasAccess) 
    { 
     this.naviationService.AccessDenied(); 
     return false; 
    } 
    return true;  
    } 

उत्तर

5

यदि आप चाहते हैं कि आपका गार्ड एसिंक्रोनस कार्य की प्रतीक्षा कर रहा है, तो आपको अपने एथस सर्विस को एक अवलोकन और उत्सर्जित मूल्य वापस करने की आवश्यकता है जिसे आपको अतुल्यकालिक कार्य के अंदर की आवश्यकता है, जिसे आप प्रतीक्षा करना चाहते हैं, आपके मामले में इसकी कमी()। इसके बाद गार्ड में सदस्यता लें। इस तरह आप अपने गार्ड को किसी भी असीमित कार्य के लिए इंतजार कर सकते हैं।

AuthGuard AuthService

isUserLoggedIn(): Observable<boolean> { 
    return new Observable((observer) => { 
     let hash = window.location.hash.substr(1); 

     let result: any = hash.split('&').reduce(function (result: any, item: string) { 
     let parts = item.split('='); 
     result[parts[0]] = parts[1]; 

     if (result.error && result.error == 'access_denied') { 
      observer.next(false); 
      observer.complete(); 
     } 
     else { 
      this.validateToken(result); 
     } 
     let token = this.getAccessToken(); 

     //check if there is a token  
     if(token === undefined || token === null || token.trim() === '') 
     { 
      //no token or token is expired; 
      observer.next(false); 
      observer.complete(); 
     } 

     observer.next(true); 
     observer.complete(); 
     }, {}); 
    }); 
} 
+0

ऐसा लगता है कि यह अच्छा काम कर रहा है लेकिन मेरे पास एक और मुद्दा है जो मुझे लगता है कि शायद वे पर्यवेक्षकों का उपयोग करने से संबंधित हैं। जब मैं obserable के अंदर एक इंजेक्शन सेवा का उपयोग करने की कोशिश करता हूं जैसे is.sgerLoggedIn विधि के अंदर this.logger.log यह इस विधि पर observer.js में त्रुटि फेंकता है: Observable.prototype।_try सदस्यता लें = फ़ंक्शन (सिंक) { कोशिश करें { इसे वापस करें। सदस्यता छोड़ें (सिंक); } पकड़ो (गलती) { sink.syncErrorThrown = true; sink.syncErrorValue = err; सिंक। आतंक (गलती); } }; – Fab

+0

यह कन्स्ट्रक्टर में पंजीकृत है और अवलोकन के बाहर काम करता है लेकिन – Fab

+0

के अंदर नहीं, वास्तव में अगर मैं इंजेक्शन सेवा का उपयोग करने का प्रयास करता हूं तो मुझे वास्तव में केवल .reduce के अंदर त्रुटियां मिल रही हैं। – Fab

1

CanActivate विधि Observable, Promise, या Boolean लौटा सकती है, और कोणीय इसे अनचाहे करने और सब कुछ एसिंक को संभालने के बारे में जान पाएगा। आप एंगुलर राउटर में एक पूर्ण/असफल Observable या हल/अस्वीकार Promise लौटने से पहले आवश्यक डेटा की जांच करने के लिए अपने कोड को बदल सकते हैं, और उस अतुल्यकालिक कार्य के परिणामस्वरूप this.naviationService.AccessDenied() पर कॉल कर सकते हैं।

+1

की

canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot){ this.authService.isUserLoggedIn().map(logged => { if (logged) { return true; } else { this.naviationService.AccessDenied(); return false; } }).catch(() => { this.naviationService.AccessDenied(); return Observable.of(false); }); } } 

हिस्सा कैसे एक और/प्राधिकरण सर्वर से रीडायरेक्ट के साथ कि काम करता है? मैं पर्यवेक्षकों को डेटा एपीआई के साथ समझता हूं लेकिन रीडायरेक्ट के साथ इतना नहीं? क्या आप शायद एक कोड उदाहरण प्रदान कर सकते हैं? धन्यवाद। – Fab

+0

असल में क्या हो रहा है यह है कि कोणीय मार्ग और घटक को लोड करने से पहले आपके 'ऑथगार्ड' को बुलाया जाता है। वर्तमान कार्यान्वयन में, आपका 'CanActivate' * तत्काल * झूठ लौटाता है और' AccessDenied' पर नेविगेट करता है। ऐसा लगता है कि उस मार्ग या बाहरी रीडायरेक्ट के साथ कुछ स्थापित किया गया है, फिर उस पृष्ठ को फिर से लोड करता है जहां 'ऑथगार्ड' फिर से निकाल दिया जाता है और सत्य लौटाता है। ऑथ सर्वर के कार्यान्वयन के आधार पर, मैं देख सकता हूं कि इसे बाहर निकालना मुश्किल हो सकता है। हो सकता है कि आप विंडो को रीडायरेक्ट के लिए प्रतीक्षा करें, या वास्तव में लोड होने से पहले घटक के लिए डेटा प्राप्त करने के लिए 'हल करें' राउटर विधि – joh04667

+0

... को जांचें। – joh04667

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