加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

typescript – Angular2:令牌刷新时捕获401错误

发布时间:2020-12-17 07:28:11 所属栏目:安全 来源:网络整理
导读:我是Angular2的新手,尝试捕获401错误以进行令牌刷新,并计划重试原始请求… 这是我的authService.refresh方法: refresh() : Observableany { console.log("refreshing token"); this.accessToken = null; let params : string = 'refresh_token=' + this.ref
我是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));
    }
 ); 
}

由于某些原因,这不起作用……
我想知道angular2中令牌刷新功能的正确实现是什么?在这里输入代码

除了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);
}

本文可能会引起您的兴趣(“处理安全性”部分):

> http://restlet.com/blog/2016/04/18/interacting-efficiently-with-a-restful-service-with-angular2-and-rxjs-part-3/

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读