angular 2 http exception handler and jwt refresh -


i trying refresh jwt token when got exception, when exception errorhandler should handle them.

i have 1 piece of code, 1 token refresh works, , 1 piece of code exception handler works, can't combine them in working way.

the problem can't throw exception , catch errorhandler in observable.

here code can refresh token with. when fails checks if error code token_expired, when refresh token , retry request.

export class httperrorservice extends http {    constructor(backend: xhrbackend, defaultoptions: requestoptions) {     super(backend, defaultoptions);   }    request(url: string | request, options?: requestoptionsargs, disablerefresh = false): observable<response> {       return super.request(url, options).catch((error: response) => {         // refresh token on token_expired exception.         if (!disablerefresh && error.status === 401 && error.json().error.code === 'token_expired') {           return this.renewtoken().flatmap((response) => {             const res = response.json();             // replace token in storage.             localstorage.setitem('__token', res.data.token);              // replace request token new one.             if (url instanceof request) {               url.headers.set('authorization', 'bearer ' + res.data.token);             } else if (options) {               options.headers.set('authorization', 'bearer ' + res.data.token);             }              // prevent loop disable refreshing @ next request.             return this.request(url, options, true);           });         }          // here want throw exception.         // need able catch exception handler.         // throw error; doesn't work.         return observable.throw(error);       });   }    private getbaseurl(): string {     return environment.base_uri;   };    renewtoken(): observable<response> {     const headers = new headers();     headers.append('authorization', 'bearer ' + localstorage.getitem('__token'))      return this.post(this.getbaseurl() + '/auth/refresh', {}, {headers: headers});   } } 

the bad thing above can't catch exception in exception handler.

the following code can throw exceptions can catched errorhandler. have no idea how can refresh token in 1 call...

export class httperrorservice extends http {    constructor(backend: xhrbackend, defaultoptions: requestoptions) {     super(backend, defaultoptions);   }    request(url: string | request, options?: requestoptionsargs, disablerefresh = false): observable<response> {     return observable.create(observer => {       super.request(url, options).subscribe(         res => observer.next(res),         err => {           if (!disablerefresh && err.status === 401 && err.json().error.code === 'token_expired') {             // can't return this.renewtoken()...           }           observer.error(err);           throw new httpexception(err); // getting catched errorhandler         },         () => observer.complete);     });   }    private getbaseurl(): string {     return environment.base_uri;   };    renewtoken(): observable<response> {     const headers = new headers();     headers.append('authorization', 'bearer ' + localstorage.getitem('__token'))      return this.post(this.getbaseurl() + '/auth/refresh', {}, {headers: headers});   } } 

my error handler contains console.log().
https://angular.io/api/core/errorhandler

how can working?

after hours got solution!

export class httperrorservice extends http {    constructor(backend: xhrbackend, defaultoptions: requestoptions) {     super(backend, defaultoptions);   }    request(url: string | request, options?: requestoptionsargs, disablerefresh = false): observable<response> {     return observable.create(observer => {       super.request(url, options).retrywhen(attempts => this.retryrequest(attempts)).catch((error: response) => {         // refresh token on token_expired exception.         if (!disablerefresh && error.status === 401 && error.json().error.code === 'token_expired') {           return this.renewtoken().flatmap((response) => {             const res = response.json();             // replace token in storage.             localstorage.setitem('__token', res.data.token);              // replace request token new one.             if (url instanceof request) {               url.headers.set('authorization', 'bearer ' + res.data.token);             } else if (options) {               options.headers.set('authorization', 'bearer ' + res.data.token);             }              // prevent loop disable refreshing @ next request.             return this.request(url, options, true);           });         }          throw observable.throw(error);       }).subscribe(         res => observer.next(res),         err => {           observer.error(err);           throw new httpexception(err);         }       );     });   }    private getbaseurl(): string {     return environment.base_uri;   };    renewtoken(): observable<response> {     const headers = new headers();     headers.append('authorization', 'bearer ' + localstorage.getitem('__token'))      return this.post(this.getbaseurl() + '/auth/refresh', {}, {headers: headers});   }    retryrequest(attempts: any) {     let count = 0;      return attempts.flatmap(error => {         return ++count >= 3 ? observable.throw(error) : observable.timer(count * 1000);     });   }  } 

Comments

Popular posts from this blog

PHP and MySQL WP -

android - InAppBilling registering BroadcastReceiver in AndroidManifest -

go - golang pprof for c library code -