Logo für Webseiten-Tab implementiert

Dieser Commit ist enthalten in:
hendrik_gebhardt@gmx.de
2026-01-10 16:47:02 +00:00
committet von Server Deploy
Ursprung ef153789cc
Commit 5b1f8b1cfe
53 geänderte Dateien mit 2377 neuen und 46 gelöschten Zeilen

Datei anzeigen

@ -133,12 +133,23 @@ class ApiClient {
}
// Handle authentication failure
handleAuthFailure() {
// requestToken: Der Token, der bei der fehlgeschlagenen Anfrage verwendet wurde
handleAuthFailure(requestToken = null) {
// Race-Condition Check: Wenn ein neuer Token existiert, der NACH dem
// fehlgeschlagenen Request gesetzt wurde, nicht ausloggen
const currentToken = localStorage.getItem('auth_token');
if (requestToken && currentToken && requestToken !== currentToken) {
console.log('[API] 401 ignored - new token exists (login occurred after request)');
return false; // Nicht ausloggen
}
console.log('[API] Authentication failed - clearing tokens');
this.setToken(null);
this.setRefreshToken(null);
this.setCsrfToken(null);
window.dispatchEvent(new CustomEvent('auth:logout'));
return true;
}
// Proaktiver Token-Refresh Timer
@ -224,8 +235,12 @@ class ApiClient {
// Handle 401 Unauthorized
if (response.status === 401) {
const currentTokenNow = localStorage.getItem('auth_token');
console.log('[API] 401 received for:', endpoint);
console.log('[API] Token used in request:', token ? token.substring(0, 20) + '...' : 'NULL');
console.log('[API] Current token in storage:', currentTokenNow ? currentTokenNow.substring(0, 20) + '...' : 'NULL');
console.log('[API] Tokens match:', token === currentTokenNow);
// Versuche Token mit Refresh-Token zu erneuern
if (this.refreshToken && !this.refreshingToken && !options._tokenRefreshAttempted) {
console.log('[API] Attempting token refresh...');
@ -235,14 +250,27 @@ class ApiClient {
return this.request(endpoint, { ...options, _tokenRefreshAttempted: true });
} catch (refreshError) {
console.log('[API] Token refresh failed:', refreshError.message);
// Fallback zum Logout
this.handleAuthFailure();
// Fallback zum Logout - aber nur wenn kein neuer Login stattfand
if (this.handleAuthFailure(token)) {
throw new ApiError('Sitzung abgelaufen', 401);
}
// Neuer Token existiert - Request mit neuem Token wiederholen (max 1x)
if (!options._newTokenRetried) {
return this.request(endpoint, { ...options, _tokenRefreshAttempted: true, _newTokenRetried: true });
}
throw new ApiError('Sitzung abgelaufen', 401);
}
}
// Kein Refresh-Token oder Refresh bereits versucht
this.handleAuthFailure();
// Nur ausloggen wenn kein neuer Token existiert
if (this.handleAuthFailure(token)) {
throw new ApiError('Sitzung abgelaufen', 401);
}
// Neuer Token existiert - Request mit neuem Token wiederholen (max 1x)
if (!options._newTokenRetried) {
return this.request(endpoint, { ...options, _newTokenRetried: true });
}
throw new ApiError('Sitzung abgelaufen', 401);
}