Certo: Open Source Platform voor Digitale Certificeringen

Overzicht

Certo is een open-source platform waarmee organisaties en individuen controleerbare digitale bewijsstukken (badges en certificaten) kunnen uitgeven volgens wereldwijde standaarden. Of u nu educatieve programma's, workshops of certificeringscursussen organiseert, of prestaties wilt erkennen; Certo biedt een complete oplossing voor het creëren, uitgeven en verifiëren van digitale bewijsstukken.

Hoe het werkt

  1. Templates maken: Uitgevers maken prestatie-templates (Achievements) waarin wordt gedefinieerd wat de badge vertegenwoordigt, wat de criteria zijn om deze te verdienen en welke vaardigheden ermee geassocieerd zijn.
  2. Uitgifte: Uitgevers verlenen bewijsstukken aan ontvangers, dit kan individueel of in bulk via een CSV-upload.
  3. Ontvangst: Ontvangers ontvangen hun bewijsstukken en kunnen deze bekijken in hun persoonlijke dashboard.
  4. Verificatie: Iedereen kan de authenticiteit van een bewijsstuk controleren via de openbare verificatiepagina.
  5. Delen: Ontvangers kunnen hun geverifieerde bewijsstukken delen op LinkedIn en andere platforms.

Naleving van standaarden

Certo implementeert de volgende standaarden:

  • Open Badges 3.0: De standaard van het IMS Global Learning Consortium voor digitale badges.
  • W3C Verifiable Credentials: Cryptografisch beveiligde bewijsstukken die manipulatiebestendig zijn.
  • Decentralized Identifiers (DID): Voor robuust identiteitsbeheer.

Gebruiksscenario's

  • Educatieve instellingen: Uitgeven van certificaten voor het voltooien van cursussen en academische prestaties.
  • Trainingsorganisaties: Verstrekken van verifieerbare certificaten voor workshops en trainingsprogramma's.
  • Evenementorganisatoren: Toekennen van deelname-badges voor conferenties en meetups.
  • Bedrijven: Erkennen van vaardigheden, certificeringen en professionele ontwikkeling van werknemers.
  • Open Source-gemeenschappen: Bevestigen van bijdragen en participatie.
  • Beroepsverenigingen: Uitgeven van lidmaatschapsbewijzen en professionele certificeringen.

Functionaliteiten

🏆 Beheer van badges en certificaten

  • Prestaties creëren: Ontwerp badge-templates met aanpasbare criteria, vaardigheden en metadata.
  • Bewijsstukken uitgeven: Digitale certificaten verstrekken voor workshops, cursussen, evenementen en projecten.
  • Batch-uitgifte: CSV-bestanden uploaden om gelijktijdig bewijsstukken aan meerdere ontvangers uit te geven.
  • Rolgebaseerde toegang: Scheiding tussen de rollen van uitgevers en ontvangers met bijbehorende rechten.

🔐 Verificatie en beveiliging

  • Cryptografische verificatie: De authenticiteit van badges controleren via cryptografische bewijzen en het Verifiable Credentials-model.
  • Intrekkingsondersteuning: Beheer van herroepingslijsten voor ongeldig verklaarde bewijsstukken.
  • Manipulatiebestendig: Alle bewijsstukken zijn cryptografisch ondertekend en tampering-proof.

📤 Delen en integratie

  • LinkedIn-integratie: Certificaten direct delen op LinkedIn.
  • Meerdere exportformaten: Bewijsstukken exporteren in diverse formaten.
  • Openbare verificatie: Iedereen kan de echtheid van een bewijsstuk controleren via de verificatiepagina.

📋 Aanvullende functies

  • Bewijsdocumenten toevoegen: Ondersteunend bewijsmateriaal en beschrijvingen koppelen aan bewijsstukken.
  • Endorsements: Ondersteuning voor validatie van bewijsstukken door derde partijen.
  • Dashboard: Overzicht en beheer van alle uitgegeven en ontvangen bewijsstukken.
  • Open Standaarden: Volledige naleving van de Open Badges 3.0-specificatie.

Projectstructuur

certo/
├── src/
│   ├── backend/                # Strapi 5.x backend (TypeScript)
│   │   ├── src/
│   │   │   ├── api/            # API endpoints
│   │   │   │   ├── achievement/    # Badge templates/definities (Open Badges 3.0)
│   │   │   │   ├── credential/     # Uitgegeven bewijsstukken/badges
│   │   │   │   ├── profile/        # Gebruikersprofielen (uitgevers & ontvangers)
│   │   │   │   ├── evidence/       # Bewijsdocumenten
│   │   │   │   ├── endorsement/    # Third-party endorsements
│   │   │   │   └── revocation-list/# Herroepingslijsten
│   │   │   ├── admin/          # Strapi admin aanpassingen
│   │   │   ├── components/     # Herbruikbare content componenten
│   │   │   ├── middlewares/    # Custom middlewares
│   │   │   └── utils/          # Utility functies
│   │   ├── config/             # Strapi configuratie
│   │   ├── database/           # Database migraties
│   │   ├── public/             # Statische bestanden & uploads
│   │   ├── scripts/            # Utility scripts
│   │   ├── types/              # TypeScript type definities
│   │   ├── Dockerfile          # Backend Docker configuratie
│   │   └── package.json        # Backend dependencies
│   │
│   └── frontend/               # Nuxt 3 frontend (Vue 3 + TypeScript + Una UI)
│       ├── pages/              # Applicatie pagina's
│       │   ├── index.vue           # Home page
│       │   ├── issue.vue           # Badge uitgifte (CSV upload support)
│       │   ├── verify.vue          # Verificatie van bewijsstukken
│       │   ├── dashboard.vue       # Gebruikersdashboard
│       │   └── ...                 # Overige pagina's
│       ├── components/         # Vue componenten
│       ├── composables/        # Vue composables
│       ├── stores/             # Pinia state management
│       ├── middleware/         # Route middleware (auth, etc.)
│       ├── api/                # API client libraries
│       ├── types/              # TypeScript types
│       ├── plugins/            # Nuxt plugins
│       ├── assets/             # CSS, afbeeldingen, SVG componenten
│       ├── public/             # Statische publieke bestanden
│       ├── e2e/                # Playwright E2E tests
│       ├── Dockerfile          # Frontend Docker configuratie
│       └── package.json        # Frontend dependencies

├── netlify/                    # Netlify serverless functies
│   └── functions/
│       └── og-credential/      # Open Graph afbeelding generatie
├── docker-compose.yml          # Docker Compose configuratie
├── README.md                   # Dit bestand
├── LICENSE                     # AGPL-3.0 Licentie
├── CONTRIBUTING.md             # Richtlijnen voor bijdragen
└── CODE_OF_CONDUCT.md          # Gedragscode

Systeemvereisten

Voor Docker Setup (Aanbevolen)

  • Docker en Docker Compose
  • Node.js 18-22.x (voor lokale ontwikkeling)

Voor lokale ontwikkeling

  • Node.js 18.x - 22.x
  • npm 6.0.0 of hoger
  • PostgreSQL 13+ (of SQLite voor ontwikkeling)

Technologische Stack

  • Backend: Strapi 5.15.0, TypeScript 5.x, Node.js 18-22.x
  • Frontend: Nuxt 3.10+, Vue 3.4+, TypeScript 5.x, Una UI
  • Database: PostgreSQL (productie) of SQLite (ontwikkeling)
  • Authenticatie: JWT met de jose bibliotheek
  • Testen: Vitest (unit), Playwright (E2E)

Installatie en configuratie voor ontwikkeling

  1. Clone de repository:

``bash git clone https://github.com/schroedinger-hat/certo.git cd certo ``

  1. Omgevingsvariabelen aanmaken:

Maak een .env bestand aan in de src/backend map met de volgende variabelen: ```env # Vereiste Strapi Secrets ADMINJWTSECRET=your-admin-jwt-secret JWTSECRET=your-jwt-secret APPKEYS=your-app-keys

# Database Configuratie (PostgreSQL) DATABASECLIENT=postgres DATABASEHOST=localhost DATABASEPORT=5432 DATABASENAME=certo DATABASEUSERNAME=strapi DATABASEPASSWORD=strapi

# Server Configuratie HOST=0.0.0.0 PORT=1337

# Frontend URL (voor CORS) FRONTEND_URL=http://localhost:3000 ```

Maak een .env bestand aan in de src/frontend map: ```env # API Configuratie NUXTPUBLICAPIURL=http://localhost:1337 NUXTPUBLICWEBSITEURL=http://localhost:3000

# Optioneel: Google Analytics NUXTPUBLICGTAG=your-gtag-id ```

  1. Docker containers starten:

``bash docker-compose up -d `` Dit start de backend (Strapi), frontend (Nuxt 3) en de PostgreSQL database. Bij de eerste keer opstarten zal de backend automatisch testdata aanmaken en API-rechten configureren.

Standaard inloggegevens (voor zowel admin panel als frontend):

  • Email: admin@certo.com
  • Wachtwoord: certo

Toegang tot de applicaties:

  • Backend (Strapi Admin): http://localhost:1337/admin
  • Frontend (Nuxt 3): http://localhost:3000

Lokaal uitvoeren (zonder Docker)

Indien u de applicaties liever lokaal draait, moet u PostgreSQL apart installeren of SQLite gebruiken.

Backend (Strapi)

  1. Database instellen (PostgreSQL of SQLite).
  2. .env bestand aanmaken zoals hierboven beschreven.
  3. Installeren en uitvoeren:

``bash cd src/backend npm install npm run develop ``

Frontend (Nuxt 3)

  1. .env bestand aanmaken zoals hierboven beschreven.
  2. Installeren en uitvoeren:

``bash cd src/frontend npm install npm run dev ``

Ontwikkelingsworkflow

  1. Start eerst de backend (draait op poort 1337).
  2. Start de frontend (maakt verbinding met de backend API).
  3. Maak een admin-account aan in Strapi.
  4. Registreer een gebruikersaccount in de frontend.
  5. Stel de gebruikersrol in op "issuer" in het Strapi admin panel om badges te kunnen uitgeven.

API-documentatie

De API volgt de Open Badges 3.0-specificatie. Swagger UI (OpenAPI) is beschikbaar op http://localhost:1337/documentation.

Belangrijke Endpoints

Publieke Endpoints:

  • GET /api/credentials/:id - Publieke gegevens van een bewijsstuk ophalen (Open Badges 3.0 formaat).
  • POST /api/credentials/verify - Authenticiteit van een bewijsstuk verifiëren.
  • GET /api/revocation-list/check/:id - Controleren of een bewijsstuk is ingetrokken.

Geauthentiseerde Endpoints:

  • POST /api/achievements - Badge-templates aanmaken (alleen voor uitgevers).
  • POST /api/credentials/batch-issue - Bewijsstukken in bulk uitgeven aan meerdere ontvangers.
  • GET /api/profiles/me - Huidig gebruikersprofiel ophalen.
  • GET /api/profiles/:id/credentials - Bewijsstukken van een gebruiker ophalen.
  • POST /api/endorsements - Endorsements voor bewijsstukken aanmaken.
  • POST /api/evidence - Bewijsmateriaal koppelen aan certificaten.

Datamodellen

  • Achievement: Badge template/definitie (Badge Class in Open Badges 3.0).
  • Credential: Uitgegeven badge/certificaat (Badge Assertion in Open Badges 3.0).
  • Profile: Gebruikersprofiel (uitgever of ontvanger).
  • Evidence: Ondersteunende documentatie voor bewijsstukken.
  • Endorsement: Validatie van bewijsstukken door een derde partij.
  • Revocation List: Lijst met ingetrokken bewijsstukken.

Testen

Frontend Tests

  • Unit Tests (Vitest): npm run test:unit
  • End-to-End Tests (Playwright): npm run test:e2e (dekt registratie, login, uitgifte workflow, verificatie en dashboard functionaliteit).

Backend Tests

De backend maakt gebruik van het Strapi testing framework. Tests kunnen worden uitgevoerd via:

cd src/backend
npm test

Implementatie

Docker Deployment

De eenvoudigste manier is via Docker Compose:

docker-compose up -d

Handmatige Implementatie

Backend: npm installnpm run buildnpm start Frontend: npm installnpm run buildnpm start

Productie Omgevingsvariabelen: Zorg voor sterke, willekeurige strings voor ADMINJWTSECRET, JWTSECRET en APPKEYS. Update tevens de FRONTENDURL en NUXTPUBLICAPIURL naar de productie-URL's.

Bijdragen

Bijdragen zijn welkom! Fork de repository, maak een feature branch aan, commit uw wijzigingen en open een Pull Request.

Licentie

Dit project is gelicenseerd onder de GNU Affero General Public License v3.0 (AGPL-3.0).

Erkenningen

  • Open Badges 3.0 Specification
  • Verifiable Credentials Data Model
  • Strapi
  • Nuxt 3
  • Una UI
  • Schrödinger Hat