Authentication with firebase, Landing Page 1.Teil
This commit is contained in:
73
src/app/service/auth.interceptor.ts
Normal file
73
src/app/service/auth.interceptor.ts
Normal file
@@ -0,0 +1,73 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user