繁体   English   中英

在Angular请求生命周期中的何处刷新JWT令牌

[英]Where in Angular request lifetime to refresh JWT token

我仍然是Angular新手。 我想刷新访问令牌,但是不确定在哪里进行访问。

我知道guards and interceptors 最好的地方在哪里? 是否需要权衡取舍?

这里有许多问题说明了在两种情况下该怎么做,但没有讨论“为什么”。 我认为刷新应在请求周期的开始时在防护中进行,因此路由器知道是否要“激活”。 但是,大多数示例都在拦截器中显示了它(通过查看到期时间,或者等待401然后刷新)。

任何意见,将不胜感激。


UPDATE
我知道“如何”,我需要理解的是为什么。 正确的刷新位置在哪里?

警卫的工作是简单地检查用户是否已登录,如果不是,则重定向到登录页面。

如果刷新令牌已过期,那么我认为警卫队应该为canActivate(ActivatedRouteSnapshot, RouterStateSnapshot)返回false canActivate(ActivatedRouteSnapshot, RouterStateSnapshot)因为尽管用户已通过身份验证,但不再拥有当前授权。

这就是为什么我倾向于保持警惕。 但是大多数示例(包括下面的出色示例)都显示了拦截器中的刷新。 到那时肯定已经很晚了吗? 我在这里缺少什么-这仅仅是样式问题,还是我应该考虑的角度请求周期更多?

您可以使用HttpInterceptor 由于每个API调用都通过槽拦截器,因此您可以检查令牌是否仍然有效,请继续进行API调用

如果令牌已过期,请显示烤面包机警报并阻止进一步的API调用。

有关使用拦截器的更多信息,请访问以下10种使用拦截器Angular 7 JWT拦截器的方法

完整的代码:

HTTP-interceptor.service.ts

import { Injectable } from '@angular/core';
import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent, HttpResponse } from '@angular/common/http';
import { Observable } from 'rxjs';
import { tap } from 'rxjs/operators';
import { SessionService } from './session.service';
import { Router } from '@angular/router';
import { throwError } from 'rxjs';

declare var toastr;

@Injectable({
  providedIn: 'root'
})
export class HttpInterceptorService implements HttpInterceptor {

  constructor(private router: Router, private sessionService: SessionService) { }

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    var token = this.sessionService.getToken();
    if (token != null && this.sessionService.isTokenExpired()) {
      this.sessionService.logOut()
      toastr.warning("Session Timed Out! Please Login");
      this.router.navigate(['/login'])
      return throwError("Session Timed Out")
    } else {

      const authRquest = req.clone({
        setHeaders: {
          Authorization: 'Bearer ' + token
        }
      })
      return next.handle(authRquest)
        .pipe(
          tap(event => {
          }, error => {
          })
        )
    }

  }
}

app.module.ts

 providers: [
    {
        provide: HTTP_INTERCEPTORS,
        useClass: HttpInterceptorService,
        multi: true
      }
   ]

会话service.ts

  getToken(): string {
    return localStorage.getItem('userToken');
  }

  getTokenExpirationDate(token: string): Date {
    token = this.getToken()
    const decoded = jwt_decode(token);

    if (decoded.exp === undefined) return null;

    const date = new Date(0);
    date.setUTCSeconds(decoded.exp);
    return date;
  }

  isTokenExpired(token?: string): boolean {
    if (!token) token = this.getToken();
    if (!token) return true;

    const date = this.getTokenExpirationDate(token);
    if (date === undefined) return false;
    return !(date.valueOf() > new Date().valueOf());
  }

  logOut(loginType?: string) {
    localStorage.removeItem('isLoggedin');
    localStorage.removeItem('userRole');

  }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM