Ich verwende JWT mit Refresh-Token-Strategie als Authentifizierung und ich habe einen Interceptor in meinem Angular-Client, der das Token als Header sendet.Angular: Refresh-Token nur einmal
Ich überprüfe vor dem Senden den Ablauf und aktualisiere das Token bei Bedarf mit meinem refreshToken.
Das Problem ist, wenn Sie 2 (oder mehr) Anfragen senden, beide versuchen, das Token zu aktualisieren. Ich benötige eine Funktion, die req für Refresh-Token sendet und wenn sie mehrere Male auf einmal aufgerufen wird, nur 1 http req zum Aktualisieren auf den Server gibt und das neue aktualisierte Token an alle zurückgibt, die es aufgerufen haben.
Das ist mein Interceptor:
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const authService = this.inj.get(AuthService);
const token = authService.getToken();
// if no token or this is a refresh token req
if (!token || req.url.split('/').pop() === 'refreshToken') {
return next.handle(req);
}
const decoded = jwt.decode(token);
// if token expired
if (decoded.exp < (Date.now()/1000)) {
return authService.refreshJWTToken().concatMap((newToken) => {
const clonedReq = req.clone({
headers: req.headers.set('Authorization', 'JWT ' + newToken)
});
return next.handle(clonedReq);
});
}
const clonedReq = req.clone({ headers: req.headers.append('Authorization', 'JWT ' + token) });
return next.handle(clonedReq);
}
Die Funktion, die ich brauche, ist authService.refreshJWTToken();
Ich weiß, dass es etwas mit Observable-Operatoren zu tun hat, aber ich bin ein bisschen neu dazu.