为什么我的Auth Guard工作不正常?角

时间:2017-04-04 23:26:50

标签: angular authentication authorization

我创建了一个简单的AuthGuard来验证令牌,并返回一个真/假响应。 API服务器(Express)和Auth服务工作正常,但if (this.isValid())发生了一些错误,因为无论如何,用户总是被重定向到登录。

export class AuthGuard implements CanActivate {

  constructor(private router: Router,
              private _authService: AuthService) { }

  canActivate() {
    if (this.isValid()) {
      return true;
    } else {
      // not logged in so redirect to login page
      this.router.navigate(['/login']);
      return false;
    }

  }
  isValid(): boolean {
    let isValid = false;
    if (localStorage.getItem('currentUser')) {
      this._authService.verifyToken().subscribe(validToken => {
        isValid = validToken === true;
      });
    }
    console.log(isValid);
    return isValid;
  }
}

isValid函数中的哪个位置导致此问题?

1 个答案:

答案 0 :(得分:1)

您始终会从false收到isValid,因为this._authService.verifyToken()是异步操作。当数据从api点到达时,将执行异步操作订阅回调。因此它将执行

console.log(isValid);
return isValid;

在订阅回调之前。

您可以在订阅中移动逻辑:

isValid(): any{
    let isValid = false;
    if (localStorage.getItem('currentUser')) {
      this._authService.verifyToken().subscribe(validToken => {
        isValid = validToken === true;
        console.log(isValid);
        return isValid;
      });
    }    
}

有关详情:How do I return the response from an Observable/http/async call in angular2?