Backend: - UserRecord Model + Users-Tabelle in DB - AuthService: SHA256-Passwort-Hashing, Token-Verwaltung (ConcurrentDictionary) - AuthMiddleware: Schützt alle /api/-Routes (außer /api/auth/login) - AuthEndpoint: Login, Logout, Me - Default-User admin/admin wird automatisch erstellt Frontend: - Login-Page mit Formular (Enter-Key-Support) - Globaler Fetch-Interceptor: 401 → automatisch Login-Redirect - Auth-Check beim App-Start und bei Hash-Änderungen - Logout-Link im Dashboard-Header - Login-CSS: Zentrierte Login-Box
29 lines
689 B
JavaScript
29 lines
689 B
JavaScript
// ── App Init ──
|
|
|
|
document.addEventListener('DOMContentLoaded', async () => {
|
|
// Auth-Check: Eingeloggt?
|
|
var user = await apiMe();
|
|
if (!user) {
|
|
await navigateTo('login');
|
|
return;
|
|
}
|
|
|
|
const { page, id } = parseHash();
|
|
var target = page === 'login' ? 'dashboard' : page;
|
|
await navigateTo(target, { id });
|
|
});
|
|
|
|
// Hash-Änderungen abfangen
|
|
window.addEventListener('hashchange', async () => {
|
|
const { page, id } = parseHash();
|
|
// Login-Seite immer erlauben, alles andere nur wenn eingeloggt
|
|
if (page !== 'login') {
|
|
var user = await apiMe();
|
|
if (!user) {
|
|
await navigateTo('login');
|
|
return;
|
|
}
|
|
}
|
|
await navigateTo(page, { id });
|
|
});
|