Logo für Webseiten-Tab implementiert
Dieser Commit ist enthalten in:
committet von
Server Deploy
Ursprung
ef153789cc
Commit
5b1f8b1cfe
@ -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);
|
||||
}
|
||||
|
||||
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren