Changeset b919a67 in Klonkt for src/routes/auth.js


Ignore:
Timestamp:
06/19/2026 08:00:37 AM (3 months ago)
Author:
roboburr <roboburr@…>
Branches:
main
Children:
2900f1d
Parents:
70679063
Message:

auth: all Google login errors as clear explanation blocks (codes instead of bare alert)

The Google callback now redirects with ?gerr=<code> (admin/session/email/linked/
unavailable/failed) and auth-login.ejs maps each code to a clear explanation block
with icon + heading + text (admin gets the two login paths as well). Completes the
error indication consistently; free-form ?error= text remains as fallback for the
regular alert.

Co-Authored-By: Claude <noreply@…>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/routes/auth.js

    r70679063 rb919a67  
    236236router.get('/google', (req, res) => {
    237237  if (!fanLoginReady()) {
    238     return res.redirect('/auth/login?error=' + encodeURIComponent('Inloggen met Google is op deze site niet beschikbaar.'));
     238    return res.redirect('/auth/login?gerr=unavailable');
    239239  }
    240240  const state = crypto.randomBytes(16).toString('hex');
     
    256256
    257257router.get('/google/callback', async (req, res) => {
    258   const fail = (msg) => res.redirect('/auth/login?error=' + encodeURIComponent(msg));
    259   if (!fanLoginReady()) return fail('Inloggen met Google is op deze site niet beschikbaar.');
     258  const fail = (code) => res.redirect('/auth/login?gerr=' + code);
     259  if (!fanLoginReady()) return fail('unavailable');
    260260  try {
    261261    const { code, state } = req.query;
    262     if (!code || !state || state !== req.session.oauthState) return fail('Login afgebroken of ongeldige sessie.');
     262    if (!code || !state || state !== req.session.oauthState) return fail('session');
    263263    const next = safeNext(req.session.oauthNext) || '';
    264264    delete req.session.oauthState;
     
    268268    const info = await fetchUserinfo(tok.access_token);
    269269    const email = (info.email || '').trim().toLowerCase();
    270     if (!email || info.email_verified === false) return fail('Geen geverifieerd Google-e-mailadres.');
     270    if (!email || info.email_verified === false) return fail('email');
    271271
    272272    let user = db.prepare('SELECT * FROM users WHERE LOWER(email) = ?').get(email);
     
    277277      if (user.role === 'god' || user.role === 'admin') {
    278278        // Eigen, duidelijke uitleg-pagina (zie auth-login.ejs) i.p.v. een kale melding.
    279         return res.redirect('/auth/login?gerr=admin');
     279        return fail('admin');
    280280      }
    281281      // Bestaande luisteraar: koppel google_sub/avatar als die ontbreken; weiger
    282282      // als al aan een ander Google-account gekoppeld.
    283283      if (user.google_sub && info.sub && user.google_sub !== info.sub) {
    284         return fail('Dit e-mailadres is al aan een ander Google-account gekoppeld.');
     284        return fail('linked');
    285285      }
    286286      db.prepare(`
     
    307307  } catch (e) {
    308308    console.error('[auth/google/callback]', e.message);
    309     fail('Google-login mislukt. Probeer opnieuw.');
     309    fail('failed');
    310310  }
    311311});
Note: See TracChangeset for help on using the changeset viewer.