feat: implement automatic SSO login redirect on admin panel, with logout protection
All checks were successful
Build & Push Docker Image to Gitea Registry / build-and-push (push) Successful in 12s
All checks were successful
Build & Push Docker Image to Gitea Registry / build-and-push (push) Successful in 12s
This commit is contained in:
1
Brain.md
1
Brain.md
@@ -191,4 +191,5 @@ volumes:
|
|||||||
- **Visual-Premium Redesign & Untertitel:** Die Filter-Pills wurden verkleinert (Höhe von 36px auf 28px reduziert, kleinere Schriftgröße `0.78rem` und kompakteres Padding), linksbündig ausgerichtet und mit sanften Hover- & Aktiv-Transitions versehen. Zudem wurde der fälschlicherweise hinzugefügte dunkle Hintergrundbalken auf der `.control-bar` vollständig entfernt, um den nahtlosen Backdrop-Blur-Effekt über dem globalen Farbverlauf wiederherzustellen. Der Untertitel der Landing Page wurde von *"Cloud, Medien, Code..."* auf den prägnanten Namen *"Die Selfhost-Werkstatt"* abgeändert.
|
- **Visual-Premium Redesign & Untertitel:** Die Filter-Pills wurden verkleinert (Höhe von 36px auf 28px reduziert, kleinere Schriftgröße `0.78rem` und kompakteres Padding), linksbündig ausgerichtet und mit sanften Hover- & Aktiv-Transitions versehen. Zudem wurde der fälschlicherweise hinzugefügte dunkle Hintergrundbalken auf der `.control-bar` vollständig entfernt, um den nahtlosen Backdrop-Blur-Effekt über dem globalen Farbverlauf wiederherzustellen. Der Untertitel der Landing Page wurde von *"Cloud, Medien, Code..."* auf den prägnanten Namen *"Die Selfhost-Werkstatt"* abgeändert.
|
||||||
- **Favoriten-Zähler statt Online-Status:** Die "Online"-Statistik-Kachel in der Kopfzeile wurde durch eine dynamische "Favoriten"-Statistik-Kachel ersetzt, um direkt die Anzahl der geladenen Lesezeichen anzuzeigen. Die Reihenfolge wurde auf "Dienste" zuerst und "Favoriten" an zweiter Stelle geändert. Das Erreichbarkeits-Monitoring im Hintergrund läuft weiterhin stabil, um die Status-Punkte der einzelnen Dienste-Karten aktuell zu halten.
|
- **Favoriten-Zähler statt Online-Status:** Die "Online"-Statistik-Kachel in der Kopfzeile wurde durch eine dynamische "Favoriten"-Statistik-Kachel ersetzt, um direkt die Anzahl der geladenen Lesezeichen anzuzeigen. Die Reihenfolge wurde auf "Dienste" zuerst und "Favoriten" an zweiter Stelle geändert. Das Erreichbarkeits-Monitoring im Hintergrund läuft weiterhin stabil, um die Status-Punkte der einzelnen Dienste-Karten aktuell zu halten.
|
||||||
- **Service Worker API-Bypass & PWA Update:** Der Service-Worker (`sw.js`) ignoriert und reicht nun alle API-Anfragen unter `/api/` (z.B. `/api/favorites`, `/api/status`) direkt an das Netzwerk durch, anstatt sie lokal zu cachen. Dadurch werden neu angelegte Favoriten beim einfachen Navigieren auf das Dashboard sofort und ohne manuelles Strg+F5-Neuladen geladen.
|
- **Service Worker API-Bypass & PWA Update:** Der Service-Worker (`sw.js`) ignoriert und reicht nun alle API-Anfragen unter `/api/` (z.B. `/api/favorites`, `/api/status`) direkt an das Netzwerk durch, anstatt sie lokal zu cachen. Dadurch werden neu angelegte Favoriten beim einfachen Navigieren auf das Dashboard sofort und ohne manuelles Strg+F5-Neuladen geladen.
|
||||||
|
- **Automatisches SSO-Login im Admin Panel:** `/admin.html` prüft nun beim Laden, ob bereits eine aktive Sitzung vorliegt. Falls nicht und kein Fehler vorliegt, wird der Benutzer automatisch an den Keycloak SSO Login (`login()`) weitergeleitet. Dadurch entfällt der zusätzliche Anmelde-Klick komplett. Zum Schutz vor unendlichen Weiterleitungsschleifen nach einer Abmeldung wurde eine temporäre Logout-Erkennung via `sessionStorage` implementiert. Der Cache-Buster für `admin.js` wurde in `admin.html` auf `v=29` erhöht.
|
||||||
- **Cache-Buster & PWA Cache Update:** Die Cache-Busting-Parameter für `style.css` und `app.js` wurden in `index.html` auf `v=33` bzw. `v=40` hochgestuft. Im Service-Worker (`sw.js`) wurde der Cache-Name auf `mischlabs-pwa-v26` erhöht und die App-Shell-Liste entsprechend angepasst, um ein sofortiges Update der App bei allen Nutzern ohne manuelles Cache-Leeren zu garantieren.
|
- **Cache-Buster & PWA Cache Update:** Die Cache-Busting-Parameter für `style.css` und `app.js` wurden in `index.html` auf `v=33` bzw. `v=40` hochgestuft. Im Service-Worker (`sw.js`) wurde der Cache-Name auf `mischlabs-pwa-v26` erhöht und die App-Shell-Liste entsprechend angepasst, um ein sofortiges Update der App bei allen Nutzern ohne manuelles Cache-Leeren zu garantieren.
|
||||||
|
|||||||
@@ -241,6 +241,6 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script src="/admin.js?v=28" defer></script>
|
<script src="/admin.js?v=29" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
31
admin.js
31
admin.js
@@ -1187,12 +1187,11 @@ function closeNavDrawer() {
|
|||||||
|
|
||||||
async function boot() {
|
async function boot() {
|
||||||
await handleCallback();
|
await handleCallback();
|
||||||
tokenSet = getStoredTokens();
|
|
||||||
if (isTokenValid(tokenSet)) {
|
|
||||||
storeTokens(tokenSet);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!isTokenValid(tokenSet)) {
|
// Check if we just logged out
|
||||||
|
const loggedOut = sessionStorage.getItem('mischlabs.admin.logged_out') === 'true';
|
||||||
|
if (loggedOut) {
|
||||||
|
sessionStorage.removeItem('mischlabs.admin.logged_out');
|
||||||
loginPanel.hidden = false;
|
loginPanel.hidden = false;
|
||||||
adminPanel.hidden = true;
|
adminPanel.hidden = true;
|
||||||
loginButton.hidden = false;
|
loginButton.hidden = false;
|
||||||
@@ -1202,6 +1201,27 @@ async function boot() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tokenSet = getStoredTokens();
|
||||||
|
if (isTokenValid(tokenSet)) {
|
||||||
|
storeTokens(tokenSet);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isTokenValid(tokenSet)) {
|
||||||
|
if (loginMessage.textContent) {
|
||||||
|
loginPanel.hidden = false;
|
||||||
|
adminPanel.hidden = true;
|
||||||
|
loginButton.hidden = false;
|
||||||
|
logoutButton.hidden = true;
|
||||||
|
const hamburgerBtn = document.getElementById('hamburgerMenuBtn');
|
||||||
|
if (hamburgerBtn) hamburgerBtn.style.display = 'none';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Automatic silent SSO login redirect
|
||||||
|
login();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const claims = authorize(tokenSet);
|
const claims = authorize(tokenSet);
|
||||||
if (!claims) return;
|
if (!claims) return;
|
||||||
|
|
||||||
@@ -1232,6 +1252,7 @@ loginButton.addEventListener('click', login);
|
|||||||
const performLogout = () => {
|
const performLogout = () => {
|
||||||
const idToken = tokenSet?.id_token;
|
const idToken = tokenSet?.id_token;
|
||||||
clearTokens();
|
clearTokens();
|
||||||
|
sessionStorage.setItem('mischlabs.admin.logged_out', 'true');
|
||||||
const params = new URLSearchParams({
|
const params = new URLSearchParams({
|
||||||
client_id: CLIENT_ID,
|
client_id: CLIENT_ID,
|
||||||
post_logout_redirect_uri: REDIRECT_URI
|
post_logout_redirect_uri: REDIRECT_URI
|
||||||
|
|||||||
Reference in New Issue
Block a user