OpenEUDI SDK Snelstart: uw eerste verificatie in 5 minuten

Een stapsgewijze handleiding om de OpenEUDI SDK te installeren, een verificatiesessie aan te maken en het resultaat te verwerken — allemaal in minder dan 5 minuten met DEMO-modus.

eIDAS Pro Team
24 maart 2026
6 min leestijd

Gecorrigeerd op 20 oktober 2026: een eerdere versie van dit artikel noemde attributen als age_over_18 en 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:

ModeGedragToepassing
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 dataIntegratietests, CI/CD-pipelines
Uw eigen IVerificationModeEchte 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:

TypeResultaatveldenBeschrijving
VerificationType.AGEageVerifiedIs de gebruiker 18 jaar of ouder?
VerificationType.COUNTRYcountry, countryVerifiedIs het land van de gebruiker toegestaan?
VerificationType.BOTHAlle bovenstaandeLeeftijd 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:

  1. Wordt een QR-code gegenereerd (visueel identiek aan een echte)
  2. Rondt de sessie na 3 seconden automatisch af
  3. Wordt een synthetisch resultaat geretourneerd (verified: true, ageVerified: true)
  4. 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

Dit artikel delen

Help anderen meer te weten komen over eIDAS-verificatie