2017-07-20 6 views
5

[हल]HttpInterceptor-> सेवा-> HttpClient चक्रीय निर्भरता

मैं मैन्युअल में इंजेक्शन लगाने AuthService AuthInterceptor के रूप में एक ऐसी ही GitHub issue पर इस comment ने सुझाव दिया द्वारा इसे हल।

तरीकों अपने HttpInterceptor HTTP अनुरोध कर रहे हैं, अपने इंटरसेप्टर में बाहर जाने वाले अनुरोधों जाँच करना सुनिश्चित करें ताकि केवल लोगों को प्रमाणीकरण की जरूरत है कि रोक पाने में आप से AuthService उपयोग कर रहे हैं (या यह हो सकता है जो कुछ भी) यदि (यानी: अनंत प्रत्यावर्तन जहां प्रमाणीकरण अंतिम बिंदुओं को आपके अनुरोधों को रोका जाएगा और इतने पर से बचने के लिए ...)

उदाहरण:

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { 
    // Ignore if login or refresh request 
    if (req.url.includes('login')) { 
    return next.handle(req); 
    } 

    const authService: AuthService = this.inj.get(AuthService); 
    return authService.getCurrentToken().concatMap(token => { 
    if(token) { 
     const authHeader = 'Bearer ' + token; 
     const authReq = req.clone({setHeaders: {Authorization: authHeader}}); 
     return next.handle(authReq); 
    } 
    return next.handle(req); 
    }); 
} 

तो मेरे पास मेरी प्रमाणीकरण सेवा है, AuthService, मूल रूप से दो विधियां हैं, जो उपयोगकर्ता से एक नया टोकन प्राप्त करता है, उपयोगकर्ता नाम और पासवर्ड दिया जाता है, और जो वर्तमान संग्रहित टोकन पुनर्प्राप्त करता है और टोकन को रीफ्रेश करता है आवश्यक होने पर प्रक्रिया। दोनों स्पष्ट रूप से HttpClient पर भरोसा करते हैं। यही है, AuthService पर HttpClient पर निर्भरता है। आइए इसे ध्यान में रखें।

एक और "सेवा" एक HttpInterceptor है कि मैं बाहर जाने वाले सभी अनुरोधों AuthService द्वारा किए गए प्राधिकरण हैडर जोड़ने के लिए (अब यह गंदा हो रही है) के अलावा अन्य रोकना चाहते हैं। और उस शीर्षलेख को बनाने के लिए, हमें एक टोकन की आवश्यकता है, जिसे हम AuthService से प्राप्त करते हैं। यही है, AuthInterceptor (मेरे इंटरसेप्टर का नाम) AuthService पर निर्भरता है। और जहां तक ​​मुझे पता है, HttpClient पर सभी HTTP_INTERCEPTORS पर निर्भरता है। Cyclic Dependency

कैसे उस चक्र को तोड़ने के लिए पर कोई भी विचार या सुझाव:

तो परिदृश्य इस प्रकार है? AuthService के HttpClientसे स्वतंत्र करने के लिए कोई तरीका है AuthInterceptor? या यह एक बुरा विचार है? (एक और तीसरे समारोह उपयोगकर्ता लॉग आउट होने के लिए AuthService में जोड़ दिया जाएगा, जिसका अनुरोध करेगा पकड़ा हो सकता है और प्राधिकरण हेडर के रूप में अच्छी तरह से उन्हें करने के लिए जोड़ा है)

अब तक मैं एक ऐसी ही issue पाया, लेकिन वैकल्पिक हल का सुझाव दिया वहाँ नहीं करता है मेरी समस्या का समाधान नहीं है, अब मुझे किसी भी अनुरोध भेजे जाने से पहले बूटस्ट्रैपिंग प्रक्रिया के दौरान अनंत रिकर्सन मिलता है। मैंने this से बचने के लिए लॉगिन और टोकन रीफ्रेश अनुरोधों को अवरुद्ध करने के मामले को संभाला है, इसलिए जहां तक ​​मुझे पता है, यह मुद्दा यहां नहीं है। मेरे कोड के अवलोकन के साथ यहां एक plunk है।खनखनाहट से

अंश:

constructor(private injector: Injector) { 
    setTimeout(() => { 
    this.auth = this.injector.get(AuthService); 
    }) 
} 

बग रिपोर्ट आप के बाद से अद्यतन किया गया है से जुड़ा हुआ है, एक वैकल्पिक वैकल्पिक हल के साथ (में AuthService पुन: प्राप्त करने:

@Injectable() 
export class AuthInterceptor implements HttpInterceptor { 
    private auth: AuthService; 

    constructor(inj: Injector) { 
    this.auth = inj.get(AuthService); 
    } 

    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { 
    // Ignore if login or refresh request 
    if (req.url.includes('login')) { 
     return next.handle(req); 
    } 

    console.log('Intercepting request...'); 
    return this.auth.getToken().map(token => { 
     const authHeader = 'Bearer ' + token; 
     const authReq = req.clone({setHeaders: {Authorization: authHeader}}); 
     return authReq; 
    }).concatMap(newReq => next.handle(newReq)); 
    } 
} 

उत्तर

5

समय समाप्त साथ this.auth सेट करने का प्रयास अवरोध समारोह/और इसे कन्स्ट्रक्टर में सेट नहीं कर रहा है): https://github.com/angular/angular/issues/18224#issuecomment-316957213

+0

यह समस्या अभी भी मेरे लिए बनी रहती है, भले ही मैं अवरोधन समारोह और उपयोग इंजेक्टर के अंदर AuthService निर्धारित किया है। – igsm

1

अद्यतन 2018/08/02 - कोणीय 5.2.3

बस एक इस पर अद्यतन: इस कोणीय 5.2.3

https://github.com/angular/angular/blob/master/CHANGELOG.md#bug-fixes-2

में तय किया गया था ताकि सीधे सेवाओं है कि में HttpClient पर निर्भर इंजेक्षन कर सकते हैं HttpInterceptors

@Injectable() 
export class AuthInterceptor implements HttpInterceptor { 

    constructor(private auth: AuthService) 
संबंधित मुद्दे