-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: implementando evento de refresh token na aplicação
- Loading branch information
Raul Melo
committed
Jul 11, 2024
1 parent
e2c4b26
commit acd34c1
Showing
5 changed files
with
4,833 additions
and
3,412 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
149 changes: 100 additions & 49 deletions
149
libs/wizpro-tools/src/service/interceptors/interceptor.token.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,57 +1,108 @@ | ||
import { | ||
HttpErrorResponse, | ||
HttpEvent, | ||
HttpHandler, | ||
HttpInterceptor, | ||
HttpRequest | ||
} from '@angular/common/http'; | ||
import { Injectable } from '@angular/core'; | ||
import { Observable, throwError } from 'rxjs'; | ||
import { catchError } from 'rxjs/operators'; | ||
import { getDataStorage } from '../../utils/token.storage'; | ||
HttpErrorResponse, | ||
HttpEvent, | ||
HttpHandler, | ||
HttpInterceptor, | ||
HttpRequest, | ||
} from '@angular/common/http'; | ||
import { Injectable, inject } from '@angular/core'; | ||
import { Observable, of, throwError } from 'rxjs'; | ||
import { catchError, delay, switchMap } from 'rxjs/operators'; | ||
import { getDataStorage, WcoEventsService } from '../../public-api'; | ||
|
||
/** | ||
* Interceptor responsável por adicionar o cabeçalho 'x-tenant' e o token de autorização nas requisições HTTP. | ||
*/ | ||
@Injectable() | ||
export class WcoTenantInterceptor2 implements HttpInterceptor { | ||
private wcoEvent = inject(WcoEventsService); | ||
private exec = false; | ||
|
||
constructor() {} | ||
|
||
/** | ||
* Interceptor responsável por adicionar o cabeçalho 'x-tenant' e o token de autorização nas requisições HTTP. | ||
* Intercepta a requisição HTTP e adiciona o cabeçalho 'x-tenant' e o token de autorização, se disponível. | ||
* Caso ocorra um erro de autenticação (status 401), redireciona o usuário para a página inicial. | ||
* @param request A requisição HTTP. | ||
* @param next O próximo manipulador de requisição na cadeia. | ||
* @returns Um Observable que emite o evento HTTP resultante. | ||
*/ | ||
@Injectable() | ||
export class WcoTenantInterceptor implements HttpInterceptor { | ||
constructor() {} | ||
|
||
/** | ||
* Intercepta a requisição HTTP e adiciona o cabeçalho 'x-tenant' e o token de autorização, se disponível. | ||
* Caso ocorra um erro de autenticação (status 401), redireciona o usuário para a página inicial. | ||
* @param request A requisição HTTP. | ||
* @param next O próximo manipulador de requisição na cadeia. | ||
* @returns Um Observable que emite o evento HTTP resultante. | ||
*/ | ||
intercept( | ||
request: HttpRequest<any>, | ||
next: HttpHandler | ||
): Observable<HttpEvent<any>> { | ||
const auth = getDataStorage('', 'w-auth'); | ||
const token = auth ? auth.hash : ''; | ||
|
||
request = request.clone({ | ||
setHeaders: { | ||
'x-tenant': getDataStorage('tenant', 'w-theme') | ||
}, | ||
}); | ||
intercept( | ||
request: HttpRequest<any>, | ||
next: HttpHandler | ||
): Observable<HttpEvent<any>> { | ||
const modifiedRequest = this.addTenantHeader(request); | ||
const auth = getDataStorage('', 'w-auth'); | ||
|
||
if (auth) { | ||
const token = auth.hash; | ||
if (token) { | ||
request = request.clone({ | ||
setHeaders: { | ||
Authorization: `Bearer ${token}`, | ||
}, | ||
}); | ||
const { refresh_token, expire_date } = auth; | ||
const expires_in = new Date(expire_date); | ||
const currentDateTime = new Date(); | ||
|
||
request = this.addAuthToken(modifiedRequest, token); | ||
|
||
if (!this.exec && refresh_token && expires_in <= currentDateTime) { | ||
this.exec = true; | ||
this.wcoEvent.emitEvent('refreshToken', {}); | ||
|
||
// Atrasar a requisição por 3 segundos | ||
return of(null).pipe( | ||
delay(3000), | ||
switchMap(() => { | ||
const newToken = getDataStorage('hash', 'w-auth'); | ||
request = this.addAuthToken(modifiedRequest, newToken); | ||
return next.handle(request).pipe(catchError(this.handleError)); | ||
}) | ||
); | ||
} | ||
} | ||
|
||
return next.handle(request).pipe( | ||
catchError((error: HttpErrorResponse) => { | ||
if (error.status == 401) { | ||
window.location.href = '/'; | ||
} | ||
return throwError(() => error); | ||
}) | ||
); | ||
} | ||
|
||
return next.handle(request).pipe(catchError(this.handleError)); | ||
} | ||
|
||
/** | ||
* Adiciona o cabeçalho 'x-tenant' à requisição HTTP. | ||
* @param request A requisição HTTP. | ||
* @returns A requisição HTTP modificada com o cabeçalho 'x-tenant'. | ||
*/ | ||
private addTenantHeader(request: HttpRequest<any>): HttpRequest<any> { | ||
const tenant = getDataStorage('tenant', 'w-theme') || ''; | ||
return request.clone({ | ||
setHeaders: { | ||
'x-tenant': tenant, | ||
}, | ||
}); | ||
} | ||
|
||
/** | ||
* Adiciona o token de autorização à requisição HTTP. | ||
* @param request A requisição HTTP. | ||
* @param token O token de autorização. | ||
* @returns A requisição HTTP modificada com o cabeçalho de autorização. | ||
*/ | ||
private addAuthToken( | ||
request: HttpRequest<any>, | ||
token: string | ||
): HttpRequest<any> { | ||
return request.clone({ | ||
setHeaders: { | ||
Authorization: `Bearer ${token}`, | ||
}, | ||
}); | ||
} | ||
|
||
/** | ||
* Lida com erros de requisição HTTP. | ||
* @param error O erro HTTP. | ||
* @returns Um Observable que emite o erro. | ||
*/ | ||
private handleError(error: HttpErrorResponse): Observable<never> { | ||
if (error.status == 401) { | ||
this.wcoEvent.emitEvent('refreshToken', {}); | ||
} | ||
return throwError(() => error); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1 @@ | ||
export type WcoEventsType = 'trackPage' | 'track' | 'logout' ; | ||
export type WcoEventsType = 'trackPage' | 'track' | 'logout' | 'refreshToken' ; |
Oops, something went wrong.