Angular2 Auth Guard返回空白页,可观察到of(真)

Angular2 Auth Guard返回空白页,可观察到of(真),angular,angular2-routing,Angular,Angular2 Routing,我使用auth-guard来保护我的一些路由,在检查身份验证的同时,如果当前令牌在15分钟内过期,我将获得一个刷新令牌。我的authenticated()方法正在返回一个可观察的 问题是,当它获取刷新令牌时,它显示的是一个空白页面,即使它获取的是返回Observable.of(true)的代码(至少它显示在控制台中)。控制台中没有错误 如果我没有得到刷新标记(现在还不是时候),那么我也会返回真正的可观察对象,并且它工作正常 在auth guard中: canActivate(): Observa

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

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

如果我没有得到刷新标记(现在还不是时候),那么我也会返回真正的可观察对象,并且它工作正常

在auth guard中:

canActivate(): Observable<boolean> {
    return this.auth.authenticated();
}
canActivate():可观察{
返回此.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);
        }
     }
}
authenticated():可观察{
if(isStillValid&¤tTime.isAfter(刷新时间)){
返回此。\u refreshAuthToken()
.map((数据)=>{
//****它到达这里,但显示为空白****
可观察的返回(真);
})
.catch(()=>{
可观察到的返回(错误);
});
}否则{
如果(!isStillValid){
//重定向到登录
可观察到的返回(错误);
}
可观察的返回(真);
}
}
}
_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)
        })
}
private _getAuthToken(body, headers) : Observable<object> {
    return this.http.post(this.restUrl + "/token", body, { headers: headers })
    .map(res => res.json())    
}
private\u refreshAuthToken():可观察{
返回此。\u getAuthToken(正文、标题)
.catch(错误=>{
返回可观察的。抛出('Error');
}) 
.flatMap(数据=>{
latestRefreshToken=data.refresh_token;
body=“grant\u type=refresh\u token&refresh\u token=“+latestrefreshttoken;
标题=新标题(“…”);
返回此。\u getAuthToken(正文、标题)
})
}
_getAuthToken:

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)
        })
}
private _getAuthToken(body, headers) : Observable<object> {
    return this.http.post(this.restUrl + "/token", body, { headers: headers })
    .map(res => res.json())    
}
private\u getAuthToken(主体、标题):可观察{
返回this.http.post(this.restUrl+“/token”,正文,{headers:headers})
.map(res=>res.json())
}

该函数应返回布尔值的Observable,但返回

Observable<Observable<boolean>>

因此,您的代码应该:

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

如果您返回一个可观察的,我认为您应该
.flatMap
,否则您将返回
可观察的
。或者,在
else
的情况下,只有
返回可观察的(…)
,其中您还没有处于可观察状态。您的
\u refreshAuthToken
方法正在返回可观察状态,因此在地图内部您不必创建新的可观察状态,只需返回true或false,干杯!!