Gecorrigeerd op 20 oktober 2026: een eerdere versie van dit artikel noemde attributen als
age_over_18en stelde dat de wallet het booleaanse resultaat bewijst zonder de geboortedatum prijs te geven. De EUDI-PID bevat geen leeftijdsattribuut: de verifier vraagt de geboortedatum op en leidt het ja/nee zelf af. De codevoorbeelden volgen nu ook de gepubliceerde API van@openeudi/core.
Vereisten
- Node.js 20+ geïnstalleerd
- Een TypeScript-project (of JavaScript met ESM)
- Een terminal en uw favoriete editor
Dat is alles. Geen API-sleutels, geen registratie, geen WRPAC-certificaat. DEMO-modus werkt direct.
Stap 1: installeren
npm install @openeudi/core
Of met uw voorkeurspakketbeheerder:
pnpm add @openeudi/core
yarn add @openeudi/core
Stap 2: een verifier aanmaken
import { VerificationService, DemoMode, InMemorySessionStore } from '@openeudi/core';
// Initialiseren in DEMO-modus — geen credentials nodig
const service = new VerificationService({
mode: new DemoMode(),
store: new InMemorySessionStore(), // optioneel: dit is de standaard-store
});
De optie mode bepaalt hoe de SDK zich gedraagt:
| Mode | Gedrag | Toepassing |
|---|---|---|
new DemoMode() | Rondt na 3 seconden automatisch af (aan te passen met delayMs) | Showcases, salesdemo's, landingspagina's |
new MockMode() | Simuleert wallet-reacties met configureerbare data | Integratietests, CI/CD-pipelines |
Uw eigen IVerificationMode | Echte EUDI Wallet-verificatie (OpenID4VP via @openeudi/openid4vp) | Live verificaties (vereist WRPAC) |
Stap 3: een verificatiesessie aanmaken
import { VerificationType } from '@openeudi/core';
const session = await service.createSession({ type: VerificationType.AGE });
// session.id is de unieke sessie-ID
// session.walletUrl is de OpenID4VP-link: codeer die als QR-code of open hem op mobiel
// session.expiresAt is het moment waarop de sessie verloopt (standaard: 5 minuten)
Het veld type bepaalt wat u wilt verifiëren. eIDAS Pro is ontworpen rond privacy-first booleaanse resultaten — uw code krijgt een ja/nee-antwoord, nooit ruwe persoonsgegevens:
| Type | Resultaatvelden | Beschrijving |
|---|---|---|
VerificationType.AGE | ageVerified | Is de gebruiker 18 jaar of ouder? |
VerificationType.COUNTRY | country, countryVerified | Is het land van de gebruiker toegestaan? |
VerificationType.BOTH | Alle bovenstaande | Leeftijd en land in één sessie |
Landcompliance (welke landen zijn toegestaan) stelt u per sessie in met countryWhitelist of countryBlacklist (niet allebei) — de SDK vergelijkt het land uit de credential met die lijst en retourneert countryVerified.
Let op: in DEMO-modus zijn de resultaten synthetisch. Met een echte wallet wordt het leeftijdsantwoord afgeleid: de EUDI-PID bevat geen attribuut age_over_18, dus de verifier vraagt alleen de geboortedatum op (selectieve openbaarmaking), toetst de 18-jaarsgrens en bewaart alleen ageVerified. Een ja/nee zonder enige geboortedatum vereist de aparte leeftijdsattestatie (proof-of-age attestation, eu.europa.ec.av.1), die in productie tot nu toe alleen Denemarken uitgeeft.
Stap 4: de QR-code tonen
De walletUrl van de sessie wordt een QR-code die de gebruiker scant met zijn EUDI Wallet-app.
// Vereist de optionele peer dependency: npm install qrcode
import { generateQRCode } from '@openeudi/core/qr';
const qrCodeUrl = await generateQRCode(session.walletUrl); // base64 PNG-data-URL
// In een webcontext
const img = document.createElement('img');
img.src = qrCodeUrl;
document.getElementById('qr-container').appendChild(img);
// In React
function VerificationQR({ qrCodeUrl }) {
return <img src={qrCodeUrl} alt="Scan with your EUDI Wallet" />;
}
// In Next.js (met next/image)
import Image from 'next/image';
function VerificationQR({ qrCodeUrl }) {
return <Image src={qrCodeUrl} alt="Scan with your EUDI Wallet" width={256} height={256} />;
}
Stap 5: wachten op het resultaat
// Event-based (aanbevolen voor webapps)
service.on('session:verified', (session, result) => {
console.log('Verification successful!');
console.log('Verified:', result.verified); // true
console.log('Age verified:', result.ageVerified); // true
console.log('Session ID:', session.id);
console.log('Timestamp:', session.completedAt);
});
service.on('session:rejected', (session, reason) => {
console.log('Verification rejected:', reason);
});
service.on('session:expired', (session) => {
console.log('Session expired — generate a new QR code');
});
// Verlopen sessies worden door een sweep gedetecteerd, dus voer die periodiek uit
setInterval(() => service.cleanupExpired(), 60_000);
Of lees de sessiestatus op aanvraag uit:
import { VerificationStatus } from '@openeudi/core';
const current = await service.getSession(session.id);
if (current.status === VerificationStatus.VERIFIED) {
console.log('Age verified:', current.result.ageVerified);
}
Volledig voorbeeld: Express.js API-route
import express from 'express';
import { VerificationService, DemoMode, InMemorySessionStore, VerificationType } from '@openeudi/core';
import type { CompletedSession, VerificationResult } from '@openeudi/core';
import { generateQRCode } from '@openeudi/core/qr';
const app = express();
const service = new VerificationService({
mode: new DemoMode(),
store: new InMemorySessionStore(),
});
// Een nieuwe verificatiesessie aanmaken
app.post('/api/verify', async (req, res) => {
const session = await service.createSession({ type: VerificationType.AGE });
res.json({
sessionId: session.id,
qrCodeUrl: await generateQRCode(session.walletUrl),
});
});
// Sessiestatus opvragen (of gebruik SSE voor realtime)
app.get('/api/verify/:sessionId', async (req, res) => {
const session = await service.getSession(req.params.sessionId);
res.json({ status: session.status, result: 'result' in session ? session.result : null });
});
// SSE-endpoint voor realtime updates
app.get('/api/verify/:sessionId/events', (req, res) => {
res.setHeader('Content-Type', 'text/event-stream');
res.setHeader('Cache-Control', 'no-cache');
res.setHeader('Connection', 'keep-alive');
const { sessionId } = req.params;
// Events vuren voor elke sessie, dus filter op de sessie die deze client volgt
const onVerified = (session: CompletedSession, result: VerificationResult) => {
if (session.id !== sessionId) return;
res.write(`data: ${JSON.stringify({ type: 'verified', result })}\n\n`);
res.end();
};
const onRejected = (session: CompletedSession, reason: string) => {
if (session.id !== sessionId) return;
res.write(`data: ${JSON.stringify({ type: 'rejected', reason })}\n\n`);
res.end();
};
service.on('session:verified', onVerified);
service.on('session:rejected', onRejected);
req.on('close', () => {
service.off('session:verified', onVerified);
service.off('session:rejected', onRejected);
});
});
app.listen(3000, () => console.log('Server running on port 3000'));
Wat gebeurt er in DEMO-modus?
Als u deze code uitvoert in DEMO-modus:
- Wordt een QR-code gegenereerd (visueel identiek aan een echte)
- Rondt de sessie na 3 seconden automatisch af
- Wordt een synthetisch resultaat geretourneerd (
verified: true,ageVerified: true) - Vuurt uw
session:verified-listener met het resultaat
Er is geen echte wallet bij betrokken. Zo kunt u de volledige verificatie-UI en backend-flow bouwen en testen voordat EUDI Wallets worden gelanceerd.
Volgende stappen
- Schakel over naar MockMode om te testen met configureerbare reacties (een standaardresultaat, of per sessie overschrijven met
setSessionResult()) - Voeg de WooCommerce-plugin toe aan uw WordPress-winkel voor verificatie bij het afrekenen
- Lees de API-referentie voor geavanceerde configuratie (sessie-TTL, eigen session stores, foutafhandeling)
- Doe mee aan de GitHub-discussies om problemen te melden of functies aan te vragen
Wanneer EUDI Wallets worden gelanceerd, vervangt u new DemoMode() door een productie-IVerificationMode op basis van @openeudi/openid4vp en uw WRPAC-gegevens — of gebruikt u de managed service van eIDAS Pro om het certificaatbeheer volledig over te slaan.
OpenEUDI valt onder de Apache-2.0-licentie en is gepubliceerd op npm — geef de GitHub-repo een ster om op de hoogte te blijven van nieuwe releases.
Gerelateerde artikelen
OpenEUDI geïntroduceerd: een open-source SDK voor EU-verificatie van digitale identiteit
We maken de kernbibliotheek voor het verificatieprotocol achter eIDAS Pro open source. OpenEUDI is een gratis TypeScript-SDK onder Apache-2.0-licentie voor het integreren van EUDI Wallet-verificatie in elke webapplicatie.
8 min leestijd
OpenID4VP begrijpen: het protocol achter de EU Digital Identity Wallets
Een technische verdieping in OpenID4VP — het verificatieprotocol dat EUDI Wallets gebruiken om geverifieerde attributen te delen met bedrijven. Hoe het werkt, waarom het ertoe doet, en hoe OpenEUDI het implementeert.
12 min leestijd
Dit artikel delen
Help anderen meer te weten komen over eIDAS-verificatie