Я следовал этой документации при реализации перехватчиков 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)));
}
}