source: Klonkt/docs/privacy-betaalde-posts.md@ f9b1c5c

main
Last change on this file since f9b1c5c was 61e3daf, checked in by Robin <roboburr@…>, 7 weeks ago

Feature: paid posts slice 1, owner Patreon config (encrypted)

The site owner can connect their OWN Patreon campaign for paid posts
(klonkt-demo-aki), premium-gated in Beheer. Client id/secret, campaign
id and the creator access/refresh token are stored ENCRYPTED at rest
(new CryptoBox AES-256-GCM helper, key from PAID_SECRET), so a database
dump leaks nothing usable; the token auto-refreshes. Separate from
Klonkt Premium's license flow, which is untouched. Degrades gracefully:
without PAID_SECRET the admin page refuses to save rather than storing
plaintext. Nothing patron-facing yet (posts.paid + unlock come in
slices 2 to 4), so no changelog entry.

CryptoBox also carries the cookie-less signed-blob helper (signBlob/
verifyBlob) that slices 3 and 4 reuse for the OAuth state and the
WebAuthn challenge.

Changed files:
src/config/database.js

  • paid_patreon table (site_id PK, secrets encrypted)

src/server.js

  • mount /admin/paid

src/views/pages/admin.ejs

  • "Betaalde posts" button in Beheer

New file:
src/services/CryptoBox.js

  • aes-256-gcm encrypt/decrypt + HMAC signBlob/verifyBlob

src/services/PaidPatreonService.js

  • owner config CRUD (encrypted), token refresh, creatorAccessToken

src/routes/admin-paid.js

  • premium-gated config form (GET/POST/disconnect)

src/views/pages/admin-paid.ejs

  • the form + status

test/paid-patreon.test.js

  • crypto roundtrip, no-plaintext-in-DB, refresh, blob signing

docs/paid-posts-design.md, docs/privacy-betaalde-posts.md

  • concurrency property documented

-robo
Co-Authored-By: Claude Opus 4.8 <noreply@…>

  • Property mode set to 100644
File size: 5.7 KB
Line 
1# Privacyverklaring: betaalde posts (concept)
2
3Status: CONCEPT. Hoort bij de paid-posts-feature (in ontwikkeling). Dit is de
4tekst die een Klonkt-site als pagina toont zodra de feature aan staat; de
5site-eigenaar is de verwerkingsverantwoordelijke voor zijn eigen site. EN/DE
6volgen zodra de feature meelevert.
7
8Ontwerpbeslissingen waar deze tekst op leunt (Robin, 21-7-2026): her-link met
9vervaltermijn (geen Patreon-id opgeslagen), passkey per post, geen cookies.
10Als een van die drie ooit wijzigt, moet deze tekst mee wijzigen.
11
12---
13
14## In gewone taal
15
16- Om een betaalde post te lezen bewijs je met een **passkey** dat je supporter
17 bent. Meer niet.
18- Wij slaan **geen naam, geen e-mailadres, geen Patreon-account en geen
19 cookies** van je op.
20- De koppeling met Patreon gebeurt **eenmalig in je eigen browser**, direct met
21 Patreon. Wij onthouden alleen het resultaat: deze passkey hoort bij een
22 geldige supporter, tot een vervaldatum.
23- Verloopt het? Dan koppel je gewoon opnieuw. Zo hoeven wij nooit bij te houden
24 wie je bent.
25- Lekt onze database ooit uit, dan staat daar niets in dat naar jou als persoon
26 te herleiden is.
27
28## Wat wij opslaan, en wat niet
29
30| Slaan wij op | Slaan wij NIET op |
31| --- | --- |
32| De publieke sleutel van je passkey | Je naam of e-mailadres |
33| Bij welke site en welk steunbedrag/tier de passkey hoort | Je Patreon-account of Patreon-id |
34| Een vervaldatum | Cookies of volgpixels |
35| | Je IP-adres in dit verband |
36
37De publieke sleutel van een passkey is een technisch gegeven dat alleen kan
38bevestigen "dit is dezelfde passkey als toen". Er valt geen identiteit uit af
39te leiden, en de geheime helft verlaat jouw apparaat nooit.
40
41## Hoe de koppeling werkt
42
431. Je klikt op "ontgrendel via Patreon" bij een betaalde post.
442. Je logt in **bij Patreon zelf** (in je eigen browser, op patreon.com) en
45 geeft eenmalig toestemming. Patreon vertelt deze site alleen of je een
46 actieve supporter bent en op welk niveau.
473. Is dat zo, dan maak je op je apparaat een passkey aan. Vanaf dat moment is
48 de passkey je enige sleutel. Wat Patreon in stap 2 meldde, bewaren wij niet:
49 alleen het recht (site, niveau, vervaldatum) blijft over, gekoppeld aan de
50 passkey.
514. Bij elke betaalde post bevestig je met je passkey (vingerafdruk, gezicht of
52 pincode van je eigen apparaat). Er wordt geen sessie of cookie aangelegd.
53
54## Geen cookies
55
56Deze functie gebruikt geen cookies, geen localStorage-tracking en geen
57sessies. Elke ontgrendeling is een losse, lokale bevestiging met je passkey.
58Dat betekent ook: per post een korte bevestiging. Dat is een bewuste keuze,
59geen gemis.
60
61## Meerdere mensen tegelijk
62
63Omdat er geen sessie en geen "ingelogde gebruiker" bestaat, kunnen meerdere
64mensen tegelijk en los van elkaar posts ontgrendelen: elke bevestiging staat op
65zichzelf. Er is geen gedeelde toestand die van elkaar afhangt. Deel je hetzelfde
66apparaat en profiel met iemand, dan kan de passkey-kiezer wel tonen dat de ander
67een passkey heeft (geen toegang, alleen zichtbaar); gebruik dan aparte apparaten
68of profielen.
69
70## Bewaartermijn en verlopen
71
72Het recht dat aan je passkey hangt heeft een vervaldatum die aansluit op de
73maandelijkse Patreon-cyclus. Daarna doet de passkey niets meer en koppel je
74opnieuw (stap 1 tot 3, doorgaans twee klikken omdat je bij Patreon al bent
75ingelogd). Verlopen rechten worden opgeruimd. Wij kunnen je nergens aan
76herinneren, want we weten niet wie je bent; dat is precies de bedoeling.
77
78Stop je met steunen, dan werkt je passkey nog hoogstens tot de vervaldatum en
79daarna niet meer.
80
81## Als er iets misgaat (datalek)
82
83Zou de database van deze site uitlekken, dan bevat die voor deze functie
84alleen passkey-sleutels, steunniveaus en vervaldata. Die zijn niet tot
85personen te herleiden: er is geen naam, e-mailadres of Patreon-id om ze aan te
86knopen. Wij melden een datalek waar dat wettelijk moet, maar kunnen jou niet
87persoonlijk waarschuwen, om dezelfde reden als hierboven.
88
89## Jouw rechten (AVG)
90
91Je hebt de gebruikelijke AVG-rechten (inzage, verwijdering, bezwaar). Er is
92een eigenaardigheid: wij kunnen jou **niet identificeren** (artikel 11 AVG),
93dus een verzoek per e-mail met "verwijder mijn gegevens" kunnen wij niet aan
94een record koppelen. Wat wel werkt:
95
96- **Verwijderen**: gebruik de "vergeet deze passkey"-optie op de site (je
97 bevestigt met de passkey zelf, dat is het bewijs dat het record van jou is),
98 of verwijder de passkey uit je apparaat en laat het recht simpelweg
99 verlopen.
100- **Inzage**: alles wat er over je passkey bestaat staat hierboven in de
101 tabel; er is niets aanvullends om in te zien.
102
103## Wie is waarvoor verantwoordelijk
104
105- **De eigenaar van deze site** is verwerkingsverantwoordelijke voor de
106 passkey-rechten hierboven, en voor de koppeling met zijn eigen
107 Patreon-campagne. De site bewaart daarvoor een versleuteld toegangs-token
108 van de **eigenaar zelf** (niet van supporters); daarmee kan de site tijdens
109 jouw koppeling bij Patreon verifiëren dat je supporter bent.
110- **Patreon** is zelfstandig verwerkingsverantwoordelijke voor je
111 Patreon-account, je betaling en wat je daar deelt. Daarop is het
112 privacybeleid van Patreon van toepassing (patreon.com/privacy). Patreon is
113 een Amerikaans bedrijf; je koppeling loopt rechtstreeks tussen jouw browser
114 en Patreon.
115- **Klonkt** is de software waar deze site op draait en verwerkt zelf niets
116 van jou; er is geen centrale Klonkt-dienst in deze flow.
117
118## Grondslag
119
120De verwerking (passkey-sleutel plus recht) is noodzakelijk voor de uitvoering
121van wat je vraagt: toegang tot betaalde posts waarvoor je supporter bent
122(artikel 6 lid 1 sub b AVG). Er wordt niets voor andere doeleinden gebruikt:
123geen profilering, geen statistiek op persoonsniveau, geen delen met derden.
124
125## Wijzigingen
126
127Verandert deze functie, dan verandert deze tekst mee, met datum. Huidige
128versie: concept, juli 2026.
Note: See TracBrowser for help on using the repository browser.