Angular AuthGuard服务不能激活';刷新令牌时无法导航

Angular AuthGuard服务不能激活';刷新令牌时无法导航,angular,jwt,Angular,Jwt,我对AuthGuard有一个奇怪的问题 当我单击一个链接时,它会检查用户是否拥有有效的访问令牌。如果没有,它将查找刷新令牌,然后尝试使用它获取访问令牌(this.oAuthService.refreshToken()) 如果需要刷新,它似乎无法导航。令牌已刷新,但页面不导航。在令牌刷新后,我可以在第二次单击受保护页面的链接后成功导航 canActivate(路由:ActivatedRouteSnapshot,状态:RouterStateSnashot):可观察 { this.authUserSe

我对
AuthGuard
有一个奇怪的问题

当我单击一个链接时,它会检查用户是否拥有有效的访问令牌。如果没有,它将查找刷新令牌,然后尝试使用它获取访问令牌(
this.oAuthService.refreshToken()

如果需要刷新,它似乎无法导航。令牌已刷新,但页面不导航。在令牌刷新后,我可以在第二次单击受保护页面的链接后成功导航

canActivate(路由:ActivatedRouteSnapshot,状态:RouterStateSnashot):可观察
{
this.authUserService.lastUrl=state.url;
if(this.oAuthService.hasValidAccessToken()){
this.authUserService.requireLoginObject.next(false);
可观察的返回(真);
}否则{
if(sessionStorage.getItem('refresh\u token')==null){
this.router.navigateByUrl('/sessiontimeout');
this.authUserService.requireLoginObject.next(true);
可观察到的返回(错误);
}
这个.oAuthService.refreshToken()。然后(()=>
{
console.log(“刷新的令牌”);
this.authUserService.requireLoginObject.next(false);
可观察的返回(真);
}).catch(()=>{
this.router.navigateByUrl('/sessiontimeout');
this.authUserService.requireLoginObject.next(true);
可观察到的返回(错误);
});
}
}

我想您忘了在刷新案例中添加退货:

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean>
{
    this.authUserService.lastUrl = state.url;

    if (this.oAuthService.hasValidAccessToken()) {
      this.authUserService.requireLoginSubject.next(false);
      return Observable.of(true);
    } else {

      if (sessionStorage.getItem('refresh_token') === null) {
        this.router.navigate(['/sessiontimeout']);
        this.authUserService.requireLoginSubject.next(true);
        return Observable.of(false);
      }

      return Observable.fromPromise(this.oAuthService.refreshToken())
             .mergeMap(()=>{
                       this.authUserService.requireLoginSubject.next(false);
                       return Observable.of(true);
              })
             .catch(()=>{
                      this.router.navigateByUrl('/sessiontimeout');
                      this.authUserService.requireLoginSubject.next(true);
                      return Observable.of(false);
              });
}
canActivate(路由:ActivatedRouteSnapshot,状态:RouterStateSnashot):可观察
{
this.authUserService.lastUrl=state.url;
if(this.oAuthService.hasValidAccessToken()){
this.authUserService.requireLoginObject.next(false);
可观察的返回(真);
}否则{
if(sessionStorage.getItem('refresh\u token')==null){
this.router.navigate(['/sessiontimeout']);
this.authUserService.requireLoginObject.next(true);
可观察到的返回(错误);
}
返回Observable.fromPromise(this.oAuthService.refreshToken())
.mergeMap(()=>{
this.authUserService.requireLoginObject.next(false);
可观察的返回(真);
})
.catch(()=>{
this.router.navigateByUrl('/sessiontimeout');
this.authUserService.requireLoginObject.next(true);
可观察到的返回(错误);
});
}

编辑:将承诺转换为可观察的,以便更容易地连接运算符。

refreshttoken()
是一个承诺。如果没有传输错误,我不能从这里返回它。是的,我的错。我不是一个承诺专家。我会编辑我的答案,但你能提供更多的代码吗?guard类和refreshToken方法会很有帮助refreshToken方法返回没有val的承诺吗?
canActivate
也支持promises。因此,您可以选择返回
Promise.resolve(true)
。如果您确实在某个地方有一个可观察的对象,您可以轻松地将其转换为Promise。
myObservable.toPromise()