【问题标题】:retry observable inside refresh token subscribe - angular 4在刷新令牌订阅中重试可观察 - 角度 4
【发布时间】:2017-11-08 18:08:08
【问题描述】:

嗨,我有一个服务 AuthenticationService 来刷新令牌和一个拦截 AuthHttp 调用的拦截器,问题是在调用失败时的拦截器方法中,我让 refreshToken 调用订阅 observable,然后当我得到需要调用的响应时第一个 http 调用无法正常工作:

refreshToken(): Observable<any>{
    return this.authHttp.get(GLOBAL.apiurl+'/refresh-token',"").map(
            (response) => {
                    let token = response.json() && response.json().token;
                    if (token){
                        console.log('refresh token');
                        localStorage.setItem('token', token);
                        return true;
                    }
                    else{
                        console.log('no token');
                        this.resetLocalStorage();
                        return false;
                    }
                }
    );
}

然后我有一个 authttp 的拦截器:

request(url: string | Request, options?: RequestOptionsArgs): Observable<Response> {
    return this.intercept(super.request(url, options));
  }

intercept(observable: Observable<Response>): Observable<Response> {

    return observable.catch((err, source) => {

      if (this.isUnauthorized(err.status)) {
        //logout the user or do what you want
          this.authService.refreshToken().subscribe(result => {
                    if(!result){
                    }
                    HERE THE FIRST FAILED CALL MUST BE CALLED
                },
                err => {
                }
            );
        if (err instanceof Response) {
          return Observable.throw(err.json().message || 'backend server error');
        }
        return Observable.empty();
      } else {
        return Observable.throw(err);
      }
    })

  }

【问题讨论】:

  • 只是好奇。如果初始调用失败 b/c 令牌已过期,那么刷新它会不会太晚了?服务器如何知道可以向当前未经过身份验证的人颁发新令牌?在我的应用中,令牌变得不可用之前会被刷新。
  • 因为服务器仅在过期令牌在黑名单中时才会刷新(您还需要过期令牌来刷新它)所以它是一个拥有过期令牌的用户并且可以完成刷新一周之内。
  • 这似乎有问题。基本上,您的服务器将接受过期令牌作为用户真实的证明。对于任何需要身份验证的事物(例如:获取有效的令牌),令牌不应该不再被接受吗?

标签: angular rxjs angular2-observables angular-http-interceptors authhttp


【解决方案1】:

在此块中,您将返回 Observable.empty();在异步调用之外,我认为您需要在服务调用中分配它。我认为现在你会得到空返回,因为你已经返回了 observable 而没有等待服务调用(下面给出的伪代码你可能需要根据你的要求更正它)

if (this.isUnauthorized(err.status)) {
        //logout the user or do what you want
          this.authService.refreshToken().subscribe(result => {
                    if(!result){
                    }
                    HERE THE FIRST FAILED CALL MUST BE CALLED
                    // your return must be somewhere here
                    return Observable.empty();
                },
                err => {
                    return Observable.throw(err.json().message || 'backend server error');
                }
            );

      } 

【讨论】:

    猜你喜欢
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    相关资源
    最近更新 更多