浏览401 Http失败

时间:2019-08-08 11:55:28

标签: javascript angular

问题

我目前在Angular应用程序中有一个身份验证防护,正在对我的API进行调用以检查用户的角色,然后将其返回以检查他们是否有权访问特定端点。

棘手的部分是,当他们注销时,JWT将从浏览器的本地存储中清除。因此,当警卫人员调用API来检查令牌是否有效时,API会返回401未经授权。

现在,我试图捕获401错误,并将用户重定向到登录屏幕,但是我无法这样做,我尝试在catchError方法中添加以下内容:

setTimeout(() => this.router.navigate(['/login']));

this.router.navigate(['/login'])

然后返回false,以便调用方法可以处理它,但是这些都不起作用。

所以我基本上想做的就是,当用户在HTTP调用中收到401未经授权时,将用户重定向到登录页面。

代码

export class GuardianGuard implements CanActivate {
    constructor(
        private router: Router,
        private http: HttpClient
    ) { }

    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
        //Get the users role from the API based on the JWT they were authenticated with
        return this.http.get(`${AppSettings.API_ENDPOINT}/Role`).pipe(
            map(data => {
                //Check if the returned server role is that of the guardian
                if (data === "3") {
                    //Allow the action if it is
                    return true;
                } else {
                    //Return to login and deny action if it is not
                    this.router.navigate(['/login']);
                    return false;
                }
            }), catchError(this.handleError));
    }

    private handleError(error: any) : Observable<boolean> {
        setTimeout(() => this.router.navigate(['/login']));
        return of(false);
    }
}

1 个答案:

答案 0 :(得分:0)

最好在某些Auth服务中具有服务逻辑。并可以如下检查授权:-

您还只能在AuthService中处理401重定向条件。

canActivate(): Observable<boolean> | Promise<boolean> | boolean {
if (this.auth.isAuthorized()) {
  this.router.navigate([CONFIG.routes.login]);
  return false;
} else {
  return true;
}