簡體   English   中英

Angular 6在令牌更新后重新生成請求之前更改JWT令牌

[英]Angular 6 change JWT token before remake request after token update

我在令牌過期時使用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);
    }
  }),
)

}

如果我的問題很好,您可以使用async等待刷新令牌,您可以檢查當前令牌的訪問權限,或者如果它在CanActivate無效則刷新它順便說一句,在每個請求上,它都會檢查Access for token而不需要在interceptor添加其他代碼

在auth服務

     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

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM