Проблемы, возникающие при обновлении токена с использованием пакета angular -oauth2-oid c - PullRequest
0 голосов
/ 23 апреля 2020

Я следовал этой документации при реализации перехватчиков https://manfredsteyer.github.io/angular-oauth2-oidc/docs/additional-documentation/working-with-httpinterceptors.html. Я вызываю метод refre sh token, который упоминается в том же документе для получения токена доступа, если срок его действия истек, но я сталкиваюсь с некоторыми серьезными проблемами при реализации. Когда я вызываю метод refre sh token в строке (83), вызывает /token и URL-запрос к бэкэнду не выполняется, так как в заголовке отправляется предыдущий токен вместо нового. Может ли кто-нибудь помочь мне с моей проблемой?

    import { Injectable, Optional } from '@angular/core';
import { OAuthStorage, OAuthModuleConfig, OAuthService } from 'angular-oauth2-oidc';
import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent } from '@angular/common/http';
import { Observable, merge, of } from 'rxjs';
import { catchError, filter, timeout, map, take, mergeMap } from 'rxjs/operators';
import { OAuthNoopResourceServerErrorHandlerService } from './oauth-noop-resource-server-error-handler.service';

@Injectable()
export class AuthInterceptorService implements HttpInterceptor {
  constructor(private authStorage: OAuthStorage,
    private oauthService: OAuthService,
    private errorHandler: OAuthNoopResourceServerErrorHandlerService,
    @Optional() private moduleConfig: OAuthModuleConfig) {
  }

  private checkUrl(url: string): boolean {
    const found = this.moduleConfig.resourceServer.allowedUrls.find(u => url.startsWith(u));
    return !!found;
  }

  private addToken(req: HttpRequest<any>): HttpRequest<any> {
    let token = this.oauthService.getAccessToken()
    let header = 'Bearer ' + token;
    console.log("token is " + token)
    let headers = req.headers
      .set('Authorization', header);

    req = req.clone({ headers });
    this.refreshTokenInProgress=false;
    return req;
  }

  private checkAccessToken(): number {
    var token = this.oauthService.getRefreshToken();
    var decodeRefreshToken = JSON.parse(atob(token.split('.')[1]));
    var Refreshtime = new Date(decodeRefreshToken['exp']).getTime();
    Refreshtime = Refreshtime * 1000;
    let accessTokenExpiry = new Date().getTime() > new Date(this.oauthService.getAccessTokenExpiration()).getTime();//Expired
    let refreshTokenExpiry = new Date().getTime() < Refreshtime;//Not expired
    // console.log('Access token expiry is '+accessTokenExpiry);
    // console.log(refreshTokenExpiry);
    if (accessTokenExpiry && refreshTokenExpiry) {
      console.log('Into true method');
      return 1;

    }
    else
      return 0;
  }

  public intercept(
    req: HttpRequest<any>,
    next: HttpHandler
  ): Observable<HttpEvent<any>> {
    console.log('Intercepting');
    const url = req.url.toLowerCase();


    if (!this.moduleConfig) {
      return next.handle(req);
    }
    if (!this.moduleConfig.resourceServer) {
      return next.handle(req);
    }
    if (this.moduleConfig.resourceServer.allowedUrls && !this.checkUrl(url)) {
      return next.handle(req); 
    }


    const sendAccessToken = this.moduleConfig.resourceServer.sendAccessToken;
    if (sendAccessToken) {
      console.log('Heelo access token')
      switch (this.checkAccessToken()) {
        case 0:
          console.log('Case 0');
          return next.handle(this.addToken(req)).pipe(catchError(err => this.errorHandler.handleError(err)));
        case 1:
          console.log('Case 1');
         this.oauthService.refreshToken().then(result=>{
          return next.handle(this.addToken(req)).pipe(catchError(err => this.errorHandler.handleError(err)));//(83)
         });
      }
    }
    else
    return next.handle(req).pipe(catchError(err => this.errorHandler.handleError(err)));
  }
}
...