我有一个AuthGuard,我想在我的应用程序中检查我的身份验证状态。
简化后,它应该像这样工作:
{
_id: 5de4debccc333611e4d14d4f5
companies: Google Comp. Inc.$Google Comp. Inc. Estd.$Tree, Ltd.$Tree, Ltd.
}
,则返回true access_cookie
和access_cookie
,则返回false refresh_cookie
,但只有access_cookie
,则请求一个新的refresh_cookie
,并在成功后返回true 但是,当然返回简单的真假,但对新access_cookie
的请求是access_cookie
。
我的AuthGuard:
Observable<boolean>
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
...
const result = this.auth.checkCredentials(scopes);
console.log(result);
....
}
(简体):
checkCredentials()
checkCredentials(): boolean{
if (!this.cookieService.check('access_token')) {
if(this._getRefreshToken(){
try {
this.refresh().subscribe(
result=> {
return result;
},
error => {
return false;
});
} catch (e) {
return false;
}
}
}
return true;
}
可观察
refresh
refresh(): Observable<boolean> {
if (this._getRefreshToken() && !this.cookieService.check('access_token')) {
const oauth2_token_endpoint = TOKEN_URL;
const headers = new HttpHeaders({
'Content-Type': 'application/x-www-form-urlencoded',
'Authorization': 'Basic ' + btoa(CLIENT_ID + ':' + CLIENT_SECRET),
});
const body = 'grant_type=' + GrantType.REFRESH + '&refresh_token=' + this._getRefreshToken();
return this.http.post<UserData>(oauth2_token_endpoint, body, {headers})
.pipe(map(user => {
if (user && user.access_token) {
this._saveToken(user);
return true;
}
return false;
}));
}
return throwError('Refresh Token Error');
}
被执行,但是它不等待checkCredentials()
而是立即返回refresh()
。
我在哪里缺少什么?
我正在使用Angular 8.2.14和rxjs 6.4.0
答案 0 :(得分:2)
您的checkCredentials
不在嵌套的if
块内返回结果,它还订阅了可观察对象而不是返回它。使用map
代替subscribe
,然后返回Obserable
。您还应该在返回类型的方法上更改签名,以使其返回boolean
或 Observable<boolean>
。
checkCredentials(): boolean | Observable<boolean> {
if (!this.cookieService.check('access_token') && this._getRefreshToken()) {
return this.refresh().pipe(map(
result=> {
return result;
}, error => {
return false;
}));
}
return true;
}
不感兴趣:我将您的2个if
块合并为1个。