Changeset f4b7b6a in Klonkt
- Timestamp:
- 06/19/2026 09:31:54 AM (3 months ago)
- Branches:
- main
- Children:
- 1e2e9e7
- Parents:
- 1080d14
- Files:
-
- 3 edited
-
CHANGELOG.md (modified) (1 diff)
-
src/routes/auth.js (modified) (4 diffs)
-
src/views/pages/auth-login.ejs (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
CHANGELOG.md
r1080d14 rf4b7b6a 15 15 16 16 ### Gewijzigd 17 - Login gesplitst: de publieke loginpagina (`/auth/login`) toont voor bezoekers nu 18 **alleen** Google-login (luisteraars/fans). De beheerders-login (gebruikersnaam + 19 wachtwoord) staat verborgen op `/auth/admin` (nergens gelinkt). 17 20 - Post-navigatie (Newer/Older) houdt nu op elke post dezelfde twee-kaarten-structuur: 18 21 ontbreekt er een nieuwere/oudere post, dan staat er een subtiele uitgegrijsde -
src/routes/auth.js
r1080d14 rf4b7b6a 44 44 } 45 45 46 // ==================== LOGIN (beheerder = wachtwoord) ==================== 46 // ==================== LOGIN ==================== 47 // Publieke loginpagina: voor BEZOEKERS alleen Google-login (luisteraars/fans). 48 // De beheerders-login (wachtwoord) staat hier bewust NIET — die zit verborgen op 49 // /auth/admin (zie hieronder), zodat de admin-login niet zichtbaar is op de plek 50 // waar bezoekers heen worden gestuurd. 47 51 router.get('/login', (req, res) => { 48 52 const next = safeNext(req.query.next) || ''; … … 56 60 success: req.query.success || null, 57 61 username: '', 62 adminLogin: false, 58 63 googleReady: fanLoginReady(), 64 next, 65 }); 66 }); 67 68 // Verborgen beheerders-login (gebruikersnaam + wachtwoord). Nergens in de UI 69 // gelinkt — de beheerder navigeert hier rechtstreeks naartoe (/auth/admin). 70 router.get('/admin', (req, res) => { 71 const next = safeNext(req.query.next) || ''; 72 if (req.session.user) return res.redirect(next || '/'); 73 if (isSetupMode()) return res.redirect('/auth/register' + (next ? '?next=' + encodeURIComponent(next) : '')); 74 renderPage(req, res, 'pages/auth-login', { 75 pageTitle: 'Beheerder inloggen', 76 bodyClass: 'on-special on-auth', 77 error: req.query.error || null, 78 gerr: null, 79 success: req.query.success || null, 80 username: '', 81 adminLogin: true, 82 googleReady: false, 59 83 next, 60 84 }); … … 65 89 const next = safeNext(req.body.next) || ''; 66 90 91 // Foutweergave op de (verborgen) beheerders-loginpagina: toon het wachtwoord- 92 // formulier opnieuw (adminLogin:true), niet de Google-only publieke pagina. 67 93 const renderErr = (error, status = 400) => { 68 94 res.status(status); 69 95 return renderPage(req, res, 'pages/auth-login', { 70 pageTitle: 'Inloggen', bodyClass: 'on-special', 71 error, success: null, username: username || '', googleReady: fanLoginReady(), next, 96 pageTitle: 'Beheerder inloggen', bodyClass: 'on-special on-auth', 97 error, gerr: null, success: null, username: username || '', 98 adminLogin: true, googleReady: false, next, 72 99 }); 73 100 }; … … 229 256 updated_at = CURRENT_TIMESTAMP WHERE id = ? 230 257 `).run(hash, row.id); 231 res.redirect('/auth/ login?success=' + encodeURIComponent('Wachtwoord gereset — log nu in.'));258 res.redirect('/auth/admin?success=' + encodeURIComponent('Wachtwoord gereset — log nu in.')); 232 259 }); 233 260 -
src/views/pages/auth-login.ejs
r1080d14 rf4b7b6a 1 <% 2 // adminLogin = de verborgen beheerders-loginpagina (/auth/admin): toont het 3 // gebruikersnaam/wachtwoord-formulier. De publieke /auth/login toont voor 4 // bezoekers ALLEEN Google-login (luisteraars/fans). Zo staat de admin-login 5 // niet zichtbaar op de plek waar bezoekers heen gestuurd worden. 6 var _admin = (typeof adminLogin !== 'undefined' && adminLogin); 7 %> 1 8 <div class="container auth-page"> 2 <h1> Inloggen</h1>9 <h1><%= _admin ? 'Beheerder inloggen' : 'Inloggen' %></h1> 3 10 <% if (typeof success !== 'undefined' && success) { %><div class="alert alert-success"><%= success %></div><% } %> 4 11 <% … … 6 13 admin: { icon: '🔐', title: 'Dit is een beheerders-account', 7 14 body: 'Je logde in met Google, maar dit e-mailadres hoort bij de beheerder van deze site. Inloggen met Google is alleen voor luisteraars/fans — beheerders gebruiken altijd hun wachtwoord (zo kan een Google-login nooit per ongeluk beheerrechten geven).', 8 list: ['<strong>Ben je de beheerder?</strong> Log hieronder in met je <strong>gebruikersnaam + wachtwoord</strong>.', '<strong>Wil je als fan inloggen?</strong> Gebruik een <strong>ander Google-account</strong> (niet je beheerdersadres).'] },15 list: ['<strong>Ben je de beheerder?</strong> <a href="/auth/admin">Log in met je gebruikersnaam + wachtwoord</a>.', '<strong>Wil je als fan inloggen?</strong> Gebruik een <strong>ander Google-account</strong> (niet je beheerdersadres).'] }, 9 16 session: { icon: '⏱️', title: 'Login afgebroken', body: 'De Google-login is afgebroken of de sessie was verlopen. Probeer het gewoon opnieuw.' }, 10 email: { icon: '✉️', title: 'Geen geverifieerd e-mailadres', body: 'Je Google-account heeft geen geverifieerd e-mailadres. Verifieer je adres bij Google , of log in met je wachtwoord.' },17 email: { icon: '✉️', title: 'Geen geverifieerd e-mailadres', body: 'Je Google-account heeft geen geverifieerd e-mailadres. Verifieer je adres bij Google.' }, 11 18 linked: { icon: '🔗', title: 'Adres al gekoppeld', body: 'Dit e-mailadres is al aan een ander Google-account gekoppeld. Gebruik dat account, of neem contact op met de beheerder.' }, 12 unavailable: { icon: '🚫', title: 'Google-login niet beschikbaar', body: 'Inloggen met Google is op deze site (nog) niet ingesteld. Log in met je gebruikersnaam en wachtwoord.' },19 unavailable: { icon: '🚫', title: 'Google-login niet beschikbaar', body: 'Inloggen met Google is op deze site (nog) niet ingesteld.' }, 13 20 failed: { icon: '⚠️', title: 'Google-login mislukt', body: 'Er ging iets mis bij het inloggen met Google. Probeer het opnieuw.' }, 14 21 }; … … 24 31 <% } else if (error) { %><div class="alert alert-error"><%= error %></div><% } %> 25 32 26 <form method="post" action="/auth/login" class="auth-form"> 27 <% if (typeof next !== 'undefined' && next) { %> 28 <input type="hidden" name="next" value="<%= next %>"> 29 <% } %> 30 <label> 31 <span>Gebruikersnaam of e-mail</span> 32 <input type="text" name="username" value="<%= username %>" required autofocus autocomplete="username"> 33 </label> 34 <label> 35 <span>Wachtwoord</span> 36 <input type="password" name="password" required autocomplete="current-password"> 37 </label> 38 <button type="submit" class="btn btn-primary">Inloggen</button> 39 <p class="auth-link auth-link-muted"><a href="/auth/reset-request">Wachtwoord vergeten?</a></p> 40 </form> 41 42 <% if (googleReady) { %> 43 <div class="auth-divider"><span>of als luisteraar</span></div> 33 <% if (_admin) { %> 34 <%# Verborgen beheerders-login (wachtwoord). %> 35 <form method="post" action="/auth/login" class="auth-form"> 36 <% if (typeof next !== 'undefined' && next) { %> 37 <input type="hidden" name="next" value="<%= next %>"> 38 <% } %> 39 <label> 40 <span>Gebruikersnaam of e-mail</span> 41 <input type="text" name="username" value="<%= username %>" required autofocus autocomplete="username"> 42 </label> 43 <label> 44 <span>Wachtwoord</span> 45 <input type="password" name="password" required autocomplete="current-password"> 46 </label> 47 <button type="submit" class="btn btn-primary">Inloggen</button> 48 <p class="auth-link auth-link-muted"><a href="/auth/reset-request">Wachtwoord vergeten?</a></p> 49 </form> 50 <% } else if (googleReady) { %> 51 <%# Publieke login: alleen Google, voor luisteraars/fans. %> 52 <p class="auth-sub">Log in om te reageren en je favorieten te bewaren.</p> 44 53 <a class="btn btn-google" href="/auth/google<%= (typeof next !== 'undefined' && next) ? '?next=' + encodeURIComponent(next) : '' %>"> 45 54 <svg class="g-icon" width="18" height="18" viewBox="0 0 18 18" aria-hidden="true"> … … 51 60 <span>Inloggen met Google</span> 52 61 </a> 62 <% } else { %> 63 <div class="alert">Inloggen met Google is op deze site nog niet ingesteld.</div> 53 64 <% } %> 54 65 </div> … … 61 72 .auth-notice-list { margin: 0; padding-left: 18px; line-height: 1.6; } 62 73 .auth-notice-list li { margin: 4px 0; } 74 .auth-sub { color: var(--ink-muted); margin: 0 0 1rem; } 63 75 </style>
Note:
See TracChangeset
for help on using the changeset viewer.
![(please configure the [header_logo] section in trac.ini)](/chrome/site/your_project_logo.png)