vokabeltraining/src/app/service/auth.interceptor.ts

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