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 { 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; } }