当令牌刷新时,AuthGuard服务可以激活并不会导航

时间:2017-06-17 06:30:27

标签: angular jwt

AuthGuard我遇到了一个奇怪的问题。

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

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

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.navigateByUrl('/sessiontimeout');
        this.authUserService.requireLoginSubject.next(true);
        return Observable.of(false);
      }

      this.oAuthService.refreshToken().then(() => 
      {
        console.log("refreshed token");
        this.authUserService.requireLoginSubject.next(false);
        return Observable.of(true);
      }).catch(() => {
        this.router.navigateByUrl('/sessiontimeout');
        this.authUserService.requireLoginSubject.next(true);
        return Observable.of(false);
      });
    }
}

1 个答案:

答案 0 :(得分:3)

我认为您忘记在刷新案例中添加退货:

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);
              });
}
编辑:将承诺转换为Observable,以便更简单地连接运算符。