74 lines
2.1 KiB
TypeScript
74 lines
2.1 KiB
TypeScript
import { HttpInterceptorFn } from '@angular/common/http';
|
|
import { inject } from '@angular/core';
|
|
import { Auth } from '@angular/fire/auth';
|
|
import { from } from 'rxjs';
|
|
import { catchError, switchMap } from 'rxjs/operators';
|
|
|
|
export const authInterceptor: HttpInterceptorFn = (req, next) => {
|
|
const auth = inject(Auth); // Injizieren Sie den Auth-Dienst
|
|
const token = localStorage.getItem('accessToken');
|
|
|
|
if (token) {
|
|
const decodedToken = decodeToken(token);
|
|
const expirationTime = decodedToken.exp * 1000; // Umwandeln in Millisekunden
|
|
const currentTime = Date.now();
|
|
|
|
if (currentTime > expirationTime) {
|
|
// Token ist abgelaufen, erneuern Sie es
|
|
return from(refreshToken(auth)).pipe(
|
|
switchMap(newToken => {
|
|
const clonedReq = req.clone({
|
|
setHeaders: {
|
|
Authorization: `Bearer ${newToken}`,
|
|
},
|
|
});
|
|
return next(clonedReq);
|
|
}),
|
|
catchError(error => {
|
|
console.error('Failed to refresh token', error);
|
|
return next(req); // Ohne Token fortfahren
|
|
}),
|
|
);
|
|
} else {
|
|
// Token ist gültig
|
|
const clonedReq = req.clone({
|
|
setHeaders: {
|
|
Authorization: `Bearer ${token}`,
|
|
},
|
|
});
|
|
return next(clonedReq);
|
|
}
|
|
} else {
|
|
return next(req);
|
|
}
|
|
};
|
|
|
|
async function refreshToken(auth: Auth): Promise<string> {
|
|
return new Promise((resolve, reject) => {
|
|
const unsubscribe = auth.onAuthStateChanged(async user => {
|
|
if (user) {
|
|
try {
|
|
const newToken = await user.getIdToken(true); // Token erneuern
|
|
localStorage.setItem('accessToken', newToken);
|
|
resolve(newToken);
|
|
} catch (error) {
|
|
console.error('Failed to refresh token', error);
|
|
reject(error);
|
|
}
|
|
} else {
|
|
reject(new Error('No authenticated user found'));
|
|
}
|
|
unsubscribe(); // Abonnement beenden
|
|
});
|
|
});
|
|
}
|
|
|
|
function decodeToken(token: string): any {
|
|
try {
|
|
return JSON.parse(atob(token.split('.')[1]));
|
|
} catch (e) {
|
|
console.error('Error decoding token', e);
|
|
return null;
|
|
}
|
|
}
|