Angular2 Auth Guard使用Observable.of返回空白页(true)

时间:2017-05-22 16:30:55

标签: angular angular2-routing

我正在使用auth-guard来保护我的一些路由,并且在检查身份验证的同时,如果当前令牌在不到15分钟内到期,我将获得刷新令牌。我的authenticated()方法返回一个Observable。

问题是当它获取刷新令牌时它显示一个空白页面,即使它已经到达返回Observable.of(true)的代码(至少它显示在控制台中)。控制台没有错误。

如果我没有获得刷新令牌(现在还不是时间),那么我也会返回真正的Observable并且工作正常。

在auth-guard中:

canActivate(): Observable<boolean> {
    return this.auth.authenticated();
}

在auth.service中:

authenticated(): Observable<boolean> {
    if (isStillValid && currentTime.isAfter(refreshTime)) {
      return this._refreshAuthToken()
        .map((data) => {
          //****IT GETS HERE, BUT DISPLAYS BLANK ****
          return Observable.of(true);
        })
        .catch(() => {
          return Observable.of(false);
        });
     } else {
        if (!isStillValid) {
          //redirects to login
          return Observable.of(false);
        }
          return Observable.of(true);
        }
     }
}

_refreshAuthToken:

private _refreshAuthToken() : Observable<object> {
    return this._getAuthToken(body, headers)
        .catch(err =>  {
            return Observable.throw('Error');
        }) 
        .flatMap(data => {
            latestRefreshToken = data.refresh_token;
            body = "grant_type=refresh_token&refresh_token=" + latestRefreshToken;
            headers = new Headers('...');
            return this._getAuthToken(body, headers)
        })
}

_getAuthToken:

private _getAuthToken(body, headers) : Observable<object> {
    return this.http.post(this.restUrl + "/token", body, { headers: headers })
    .map(res => res.json())    
}

1 个答案:

答案 0 :(得分:0)

该函数应返回Oboleanable of boolean但返回

Observable<Observable<boolean>>

如果你在jsbin

中这样做
Rx.Observable.of(1)
   .map(x=>Rx.Observable.of(true))
   .subscribe(x=>console.log(typeof x) // "object"

 Rx.Observable.of(1)
   .map(x=>true)
   .subscribe(x=>console.log(x) // "boolean"

所以你的代码应该:

 return this._refreshAuthToken()
    .map((data) => {
      //****IT GETS HERE, BUT DISPLAYS BLANK ****
      return true;
    })
    .catch(() => {
      return Observable.of(false);
    });