【问题标题】:Handling Expired Token From Api in Angular 4在 Angular 4 中处理来自 Api 的过期令牌
【发布时间】:2018-02-19 04:45:26
【问题描述】:

我需要帮助来处理我的 Angular 应用程序中的过期令牌。我的 api 已过期,但我的问题是当我忘记退出我的 angular 应用程序时,一段时间后,我仍然可以访问主页但没有数据。我能做些什么吗?有没有可以处理这个的库?或者有什么我可以安装的吗?更好的是,如果我什么都不会安装。下面是我的验证码?我可以添加任何可以处理过期的东西吗?如果它过期了我将无法访问主页。

auth.service.ts

 export class AuthService {
  private loggedIn = false;

  constructor(private httpClient: HttpClient) {
  }

  signinUser(email: string, password: string) {  
    const headers = new HttpHeaders() 
    .set('Content-Type', 'application/json');

    return this.httpClient
    .post(
      'http://sample.com/login', 
       JSON.stringify({ email, password }), 
       { headers: headers }
    )
    .map(
        (response: any) => {
          localStorage.setItem('auth_token', response.token);
          this.loggedIn = true;
          return response;
        });
   }

    isLoggedIn() {
      if (localStorage.getItem('auth_token')) {
        return this.loggedIn = true;
      }
    }

   logout() {
     localStorage.removeItem('auth_token');
     this.loggedIn = false;
    }
}

authguard.ts

@Injectable()
export class AuthGuard implements CanActivate {

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

  canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {

    if (this.authService.isLoggedIn()) {
      // logged in so return true
      return true;
    }

    else {
      // not logged in so redirect to login page with the return url
      this.router.navigate(['signin'])
      return false;
      }
  }
}

【问题讨论】:

  • 您可以在离开应用时强制应用清除登录状态。
  • @Pengyy。但我认为这不是专业网络应用程序的工作方式,对吧?关闭浏览器后,他们仍然可以访问自己的帐户。
  • 这取决于您应用的身份验证策略。对我来说,奇怪的是应用程序仍然可以登录,但 API 不再可用。
  • 注销时发生了什么?
  • @Kuncevic。你的意思是当我点击注销按钮时?它注销了应用程序,我将无法访问主页

标签: angular token access-token angular-http


【解决方案1】:

您可以使用 http 拦截器来做到这一点。

intercept(req: HttpRequest<any>, next: HttpHandler) {
  if(!localStorage.getItem('token'))
    return next.handle(req);

  // set headers
  req = req.clone({
    setHeaders: {
      'token': localStorage.getItem('token')
    }
  })

  return next.handle(req).do((event: HttpEvent<any>) => {
    if(event instanceof HttpResponse){
      // if the token is valid
    }
  }, (err: any) => {
    // if the token has expired.
    if(err instanceof HttpErrorResponse){
      if(err.status === 401){
        // this is where you can do anything like navigating
        this.router.navigateByUrl('/login');
      }
    }
  });
}

Here's the full solution

【讨论】:

    【解决方案2】:

    我认为您可以使用两种解决方案。

    第一个你可以在浏览器关闭时调用你的注销功能,例如:

      @HostListener('window:unload', ['$event'])
      handleUnload(event) {
        this.auth.logout();
      }
    

    https://developer.mozilla.org/de/docs/Web/Events/unload

     @HostListener('window:beforeunload', ['$event'])
          public handleBeforeUnload(event) {
            this.auth.logout();
          }
    

    https://developer.mozilla.org/de/docs/Web/Events/beforeunload

    这样,当浏览器关闭时,您的this.auth.logout(); 将被自动调用。

    第二你可以安装像angular2-jwt这样的库,它可以帮助你检测if token has expired

    jwtHelper: JwtHelper = new JwtHelper();
    
    useJwtHelper() {
      var token = localStorage.getItem('token');
    
      console.log(
        this.jwtHelper.decodeToken(token),
        this.jwtHelper.getTokenExpirationDate(token),
        this.jwtHelper.isTokenExpired(token)
      );
    }
    

    【讨论】:

    • 你有什么建议,如果我关闭浏览器,我会调用注销?或者当我忘记注销并再次打开浏览器时,我仍然可以访问主页并在其中保存数据。一段时间后,令牌过期但我的问题是我仍在主页上但没有数据,我应该被重定向到登录页面
    • 我认为您最好使用 angular2-jwt 这样的库,这样您就可以以适当的方式处理您的案件,它具有您需要的所有功能。
    • @Kuncevice。它支持角度4吗?我安装时出错
    • @Joseph 是的,它支持angular 4 我刚刚在应用程序中安装了它,没有问题。确保您安装的是 angular2-jwt 而不是 angular-jwt
    • 你到底有什么问题?
    猜你喜欢
    • 1970-01-01
    • 2022-06-18
    • 2021-10-19
    • 2015-10-05
    • 2019-12-11
    • 2017-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多