2017-04-04 58 views
0

我創建了一個簡單的AuthGuard來驗證令牌,並返回true/false響應。 API服務器(快速)和Auth服務工作正常,但有一些錯誤發生在if (this.isValid()),因爲無論如何,用戶總是被重定向到登錄。爲什麼我的認證防護工作不正常? Angular

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函數在哪裏導致這個問題?

+0

你從來沒有在控制檯中看到記錄了一個錯誤?你調試過'IsValid'函數嗎?您的auth服務是否正常工作? 'console.log(isValid);'揭示了什麼? –

+0

控制檯日誌顯示isValid爲true。我沒有錯誤,我的驗證服務正在工作 – Moshe

回答

1

因爲this._authService.verifyToken()是一個異步操作,您將始終最終收到的false。異步操作訂閱回調將在數據從您的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?

+0

我得到以下錯誤:'TS2355:聲明類型的函數不是'void'或'any'必須返回一個類型。' – Moshe

+0

@Moshe我已經更新了我的答案。在這一點上,isValid()的返回類型應該是「any」 – echonax