【问题标题】:Angular 6 change JWT token before remake request after token updateAngular 6在令牌更新后重制请求之前更改JWT令牌
【发布时间】:2019-10-06 17:21:16
【问题描述】:

我在令牌过期时使用 JWT 身份验证结束(后端检查它)我必须调用刷新令牌 API 并重新进行最后一次调用失败,因为令牌过期。
我已经有了拦截器,但我必须在发出请求之前更新身份验证标头,并且我必须等待refreshToken 调用。

intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    const { shouldRetry } = this;
    return next.handle(request).pipe(  
      retryWhen(genericRetryStrategy({
        shouldRetry
      })),

      catchError(err => {
        //401 the token is invalid so I have to refresh it
        if (err.status === 401) {
          this.auth.refreshToken().subscribe(
            (apiResult: SessionTokenResponse) => {
              this.auth.saveToken(apiResult.token);
            },
            error => this.auth.logout()
          );
          request = request.clone({headers: request.headers.set('Authorization', 'Bearer ' + this.auth.getSessionToken)});
          return next.handle(request);
        }
        const error = err.error.message || err.statusText;
        return throwError(error);
      }),
    )
  }

重新拨打电话是否正确?我如何才能等待refreshToken 的结束?谢谢

编辑:我更新了这段似乎可以工作的代码,我正在测试它

intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const { shouldRetry } = this;
return next.handle(request).pipe(
  retryWhen(genericRetryStrategy({
    shouldRetry
  })),

  catchError(err => {
    //401 the token is invalid so I have to refresh it
    if (err.status === 401) {
      this.auth.refreshToken().subscribe(
        (apiResult: SessionTokenResponse) => {
          this.auth.saveToken(apiResult.token);
          request = request.clone({ headers: request.headers.set('Authorization', 'Bearer ' + apiResult.token) });
          next.handle(request).subscribe();
        },
        err => this.auth.logout()
      );          
    }else{
      const error = err.error.message || err.statusText;
      return throwError(error);
    }
  }),
)

}

【问题讨论】:

    标签: javascript angular typescript rxjs jwt


    【解决方案1】:

    如果我能很好地解决您的问题,您可以使用 async 等待刷新令牌 您可以检查当前令牌的访问权限,如果它在CanActivate 中无效,则刷新它顺便说一句,在每个请求中,它都会检查访问权限以获取令牌,无需在interceptor 中添加额外的代码

    在身份验证服务中

         async isAuthenticated(){
         const response = await this.auth.refreshToken().toPromise();
         return response;
      }
    

    在 CanActivate 中

    async canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
        this.authenticated= await this.Service.isAuthenticated();
        if(this.authenticated) {
             this.auth.saveToken(apiResult.token);
             return true;
          }
        else
            this.auth.logout();
            // navigate to login
    
    }
    

    【讨论】:

    • 我必须等待新令牌才能重新拨打电话
    • 不明白是否必须更新令牌我必须管理 401 错误,在您的示例中,您无需此检查即可更新令牌
    猜你喜欢
    • 2020-11-09
    • 2015-02-21
    • 2019-02-20
    • 2013-08-01
    • 2020-10-07
    • 1970-01-01
    • 2018-11-07
    • 2021-04-06
    • 2017-10-11
    相关资源
    最近更新 更多