我是Angular2的新手,尝试捕获401错误以进行令牌刷新,并计划重试原始请求…
这是我的authService.refresh方法:
refresh() : Observable<any> { console.log("refreshing token"); this.accesstoken = null; let params : string = 'refresh_token=' + this.refreshToken + '&grant_type=refresh_token'; let headers = new Headers(); headers.append('Authorization','Basic ' + this.clientCredentials); headers.append('Content-Type','application/x-www-form-urlencoded'); return Observable.create( observer => { this._http.post('http://localhost:8080/oauth/token',params,{ headers : headers }) .map(res => res.json()).subscribe( (data) => { this.accesstoken = data.access_token; observer.next(this.accesstoken); observer.complete(); },(error) => { Observable.throw(error); } ); }); }
update(index : number) { let headers = new Headers(); headers.append('Authorization','Bearer ' + this._authService.accesstoken); this._http.get('http://localhost:8080/rest/resource',{ headers : headers }) .catch(initialError =>{ if (initialError && initialError.status === 401) { this._authService.refresh().flatMap((data) => { if ( this._authService.accesstoken != null) { // retry with new token headers = new Headers(); headers.append('Authorization','Bearer ' + this._authService.accesstoken); return this._http.get('http://localhost:8080/rest/resource',{ headers : headers }); } else { return Observable.throw(initialError); } }); } else { return Observable.throw(initialError); } }) .map(res => res.json()) .subscribe( data => { this.resources[index] = data; },error => { console.log("error="+JSON.stringify(error)); } ); }
除了Günter的答案,我还会利用flatMap回调参数中的accesstoken而不是使用服务属性:
if (initialError && initialError.status === 401) { this._authService.refresh().flatMap((accesstoken) => { // retry with new token headers = new Headers(); headers.append('Authorization','Bearer ' + accesstoken); return this._http.get('http://localhost:8080/rest/resource',{ headers : headers }); }); } else { return Observable.throw(initialError); }
本文可能会引起您的兴趣(“处理安全性”部分):
原文地址:https://www.jb51.cc/angularjs/142084.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。