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
Post a Comment