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