Een privacy-first leeftijdsverificatiesysteem bouwen met OpenEUDI

Hoe u met de OpenEUDI SDK een leeftijdsverificatiesysteem bouwt dat geen enkel persoonsgegeven opslaat. Een booleaans resultaat — geen geboortedatum.

eIDAS Pro Team
10 maart 2026
7 min leestijd

Gecorrigeerd op 20 oktober 2026: in een eerdere versie van dit artikel stond dat de EUDI Wallet uit de PID een booleaans age_over_18 afleidt, zodat de geboortedatum het apparaat nooit verlaat. De PID bevat geen leeftijdsattribuut: de verifier vraagt alleen de geboortedatum op en leidt het ja/nee zelf af; age_over_18 bestaat alleen in de aparte leeftijdsattestatie (proof-of-age attestation). De codevoorbeelden gebruiken nu de echte API van @openeudi/core.

Het probleem met traditionele leeftijdsverificatie

De meeste hedendaagse leeftijdsverificatiesystemen werken door persoonsgegevens te verzamelen:

  • Invoer van geboortedatum: gebruikers typen hun geboortedatum in. Geen verificatie. Makkelijk te liegen.
  • Documentupload: gebruikers fotograferen hun identiteitsbewijs. U heeft nu een documentafbeelding met naam, adres, foto en documentnummer — veel meer data dan nodig om de vraag "is deze persoon ouder dan 18?" te beantwoorden.
  • Leeftijdsschatting door derden: AI schat de leeftijd op basis van een selfie. Verwerking van biometrische gegevens met aanzienlijke AVG-implicaties.

Al deze benaderingen verzamelen meer data dan nodig om een eenvoudige ja/nee-vraag te beantwoorden.

Het privacy-first alternatief

Met verificatie via de EUDI Wallet werkt leeftijdscontrole anders:

U vraagt:      "Is deze persoon 18 jaar of ouder?"
De wallet:     deelt één ondertekend attribuut, verder niets
U bewaart:     "Ja." (of "Nee.")

Geen naam. Geen document. Geen selfie. Geen biometrische gegevens. Bij de PID — de persoonsidentificatiegegevens die elke EUDI Wallet bevat — is dat ene attribuut de geboortedatum: de verifier ziet die één keer, leidt er het ja/nee uit af en gooit hem weg. Alleen de aparte leeftijdsattestatie beantwoordt age_over_18 zonder dat de geboortedatum het apparaat verlaat. In beide gevallen bewaart u alleen een booleaans resultaat, gedekt door de handtekening van een door de overheid vertrouwde uitgever.

Implementatie met OpenEUDI

Stap 1: installeren en configureren

import { VerificationService, DemoMode, VerificationType } from '@openeudi/core';

const service = new VerificationService({
  mode: new DemoMode(), // Simulates the wallet; a production mode implements IVerificationMode
});

Stap 2: een leeftijdsverificatiesessie aanmaken

const session = await service.createSession({
  type: VerificationType.AGE,
  // That's all. No name, no address, no document: an age check only.
});
// session.walletUrl: render it as a QR code for the wallet

Het cruciale inzicht: wat de wallet deelt, hangt af van de credential. De PID bevat geen leeftijdsattribuut, dus een verificatiemodus vraagt alleen de geboortedatum op (selectieve openbaarmaking), toetst de 18+-grens en geeft uw code uitsluitend het booleaanse resultaat. Een leeftijdsattestatie (eu.europa.ec.av.1) bevat age_over_18 rechtstreeks, zodat de geboortedatum het apparaat niet verlaat — maar per oktober 2026 geeft alleen Denemarken die in productie uit.

Stap 3: het resultaat verwerken

service.on('session:verified', (session, result) => {
  if (result.ageVerified) {
    // Allow access to age-restricted content/product
    allowPurchase();
  }
});

service.on('session:rejected', (session, reason) => {
  // Block access
  showAgeRestrictionMessage();
});

Stap 4: wat u opslaat (bijna niets)

// Audit log, written inside the 'session:verified' handler — no PII
await db.verificationLogs.create({
  sessionId: session.id,
  verificationType: session.type, // VerificationType.AGE
  result: result.ageVerified, // true/false — never the birth date
  verifiedAt: session.completedAt,
  // No name. No DOB. No document number. No PII.
});

WooCommerce-integratie

Voor WordPress-/WooCommerce-winkels die leeftijdsgebonden producten verkopen:

// The OpenEUDI WooCommerce plugin handles this automatically.
// In your WordPress admin:
// 1. Install the OpenEUDI Age Verification plugin
// 2. Go to WooCommerce → Settings → Age Verification
// 3. Select which product categories require verification
// 4. Choose verification threshold (18+, 21+)
// 5. Done.

De plugin voegt een verificatiestap toe vóór het afrekenen voor gemarkeerde producten. De klant scant een QR-code, keurt goed in zijn wallet, en de bestelling gaat door. Er worden door de plugin geen persoonsgegevens verzameld of opgeslagen.

AVG-analyse

Minimale gegevensverwerking (artikel 5, lid 1, onder c))

Traditionele leeftijdsverificatie verzamelt:

  • Volledige naam, geboortedatum, documentnummer, documentafbeeldingen, selfie

Leeftijdsverificatie met OpenEUDI ontvangt:

  • Eén attribuut — de geboortedatum uit de PID, of age_over_18 uit een leeftijdsattestatie — dat direct wordt teruggebracht tot een booleaans resultaat: true of false

De AVG vereist dat persoonsgegevens "toereikend zijn, ter zake dienend en beperkt tot wat noodzakelijk is". Eén attribuut dat direct tot een booleaans resultaat wordt teruggebracht, komt dicht bij het minimum dat nodig is om leeftijd te verifiëren; het absolute minimum is de leeftijdsattestatie, die de geboortedatum helemaal niet prijsgeeft.

Opslagbeperking (artikel 5, lid 1, onder e))

Bij traditionele verificatie moet u:

  • Bewaartermijnen vaststellen voor identiteitsdocumenten
  • Veilige verwijderingsprocedures implementeren
  • Reageren op inzage- en verwijderingsverzoeken van betrokkenen

Met OpenEUDI:

  • Is het verificatieresultaat (true/false) volgens de meeste interpretaties geen persoonsgegeven
  • Is de sessie-ID een willekeurige identificator zonder koppeling aan de persoon
  • Is geen bewaarbeleid voor persoonsgegevens nodig, omdat er geen persoonsgegevens worden opgeslagen: de geboortedatum wordt weggegooid zodra het booleaanse resultaat vaststaat

Gegevensbeschermingseffectbeoordeling

Een DPIA is voor leeftijdsverificatie met OpenEUDI mogelijk niet vereist, omdat:

  • Er geen systematische monitoring van personen plaatsvindt
  • Er geen bijzondere categorieën van gegevens worden verwerkt
  • Er geen grootschalige verwerking van persoonsgegevens plaatsvindt
  • Het enige verwerkte attribuut (de geboortedatum) slechts kortstondig aanwezig is, en wat bewaard wordt (een booleaans resultaat) een minimaal risico voor betrokkenen vormt

Vergelijk dit met traditionele, op KYC gebaseerde leeftijdsverificatie, waarvoor door de verwerking van documentafbeeldingen en biometrische gegevens vrijwel zeker een DPIA vereist is.

Beschikbare leeftijdsattributen

Welk leeftijdsattribuut een verifier kan opvragen, hangt af van de credential in de wallet:

CredentialAttribuutRetourneertOpmerkingen
PID (eu.europa.ec.eudi.pid.1 / urn:eudi:pid:1)birth_date (mdoc) / birthdate (SD-JWT VC)DatumVerplicht in elke PID; de verifier leidt elke grens af (16+, 18+, 21+)
Leeftijdsattestatie (eu.europa.ec.av.1)age_over_18BooleaansAndere age_over_NN optioneel; per oktober 2026 één uitgever in productie (Denemarken)

De PID zelf bevat geen age_over_NN-attribuut; leeftijdsattributen zijn in 2025 uit het PID-rulebook geschrapt. Voor een leeftijdscontrole vraagt eIDAS Pro alleen de geboortedatum uit de PID op, leidt daaruit een 18+-resultaat af en retourneert, bewaart of logt de geboortedatum nooit; wordt een leeftijdsattestatie getoond, dan gebruikt eIDAS Pro in plaats daarvan age_over_18. U ontvangt alleen het booleaanse resultaat — nooit de onderliggende persoonsgegevens. Landcompliance wordt afgehandeld via uw merchant whitelist-/blacklist-configuratie.

Landspecifieke overwegingen

Leeftijdsgrenzen voor verificatie variëren per land en product:

LandAlcoholTabakGokken
De meeste EU-landen18+18+18+
Duitsland16+ (bier/wijn), 18+ (sterke drank)18+18+
België16+ (bier/wijn), 18+ (sterke drank)18+21+
Oostenrijk16+ (bier/wijn), 18+ (sterke drank)18+18+

De OpenEUDI SDK bevat geen compliance-mapping per land: VerificationType.AGE is één leeftijdscontrole, gedocumenteerd als 18+. Een andere grens — 16+ voor bier in Duitsland, 21+ voor gokken in België — moet uw verificatiemodus zelf op de geboortedatum toepassen, want een leeftijdsattestatie garandeert alleen age_over_18.


De OpenEUDI SDK is Apache-2.0-gelicentieerd en gratis. Voor beheerde leeftijdsverificatie in productie (vandaag met bank-eID, beheerd WRPAC zodra dat verkrijgbaar is), zie de managed plannen van eIDAS Pro.

Gerelateerde artikelen

Dit artikel delen

Help anderen meer te weten komen over eIDAS-verificatie