Dit document valt onder de volgende licentie:
Creative Commons Attribution 4.0 International Public License
Het verzamelen van gegevens over actuele betalingsverplichtingen is voor burgers die in schuldhulpverlening terecht komen een grote drempel. Met het project Vorderingenoverzicht Rijk leveren we een bijdrage aan het verlagen van die drempel, zodat problemen met betalingen en schulden sneller kunnen worden opgelost of worden voorkomen. Het is daarom onze missie om burgers in staat te stellen gemakkelijk een overzicht van hun financiële verplichtingen aan overheidsorganisaties te verkrijgen, zodat zij hun eigen situatie kennen. Deze missie is samengevat in de volgende user story
:
"Als burger wil ik een overzicht van mijn actuele betalingsverplichtingen aan overheidsorganisaties zien, zodat ik mijn situatie ken en op basis hiervan (direct) de noodzakelijke of gewenste acties kan ondernemen."
Op basis van een makkelijker en beter overzicht kan de burger als dat nodig is de noodzakelijke of gewenste acties ondernemen. Het overzicht vormt daarmee een belangrijk hulpmiddel voor burgers om meer grip te krijgen op hun financiële situatie en in actie te kunnen komen, eventueel samen met een hulpverlener. In andere gevallen kan het overzicht mensen het inzicht geven, dat er geen actuele risico's zijn. Het Vorderingenoverzicht is er in ieder geval voor iedereen, voor alle burgers van Nederland.
⌛ nog niet beschikbaar: toepassingsprofiel
Dit is een werkversie die op elk moment kan worden gewijzigd, verwijderd of vervangen door andere documenten. Het is geen goedgekeurde consultatieversie.
Deze standaard beschrijft twee protocollen:
configurationToken
voor gebruik in het tweede protocol.configurationToken
uit het eerste protocol in voor de financiële informatie.Beide protocollen maken gebruik van het CreateSession
protocol uit de Blauwe Knop Connect standaard voor het authenticeren van de App naar de organisatie. Beide keren levert dat een sessionToken
op, en een AES sleutel voor versleuteling van het verkeer tussen de App en organisatie. De App verstuurt het sessionToken
mee met zijn berichten aan de organisatie, welke deze gebruikt om de relevante sessie-informatie op te zoeken wat is vastgesteld tijdens het CreateSession
protocol. Daarbij is het van belang dat hij ook controleert dat de sessie inmiddels niet verlopen is, en dat de scope
parameter de verwachte waarde heeft.
De sectie over cryptografie uit de Blauwe Knop Connect standaard is ook van toepassing in deze standaard.
De protocollen in deze standaard faciliteren het uitwisselen van al of niet digitaal ondertekende documenten tussen de app en de organisatie. Een Document is een in deze standaard gedefinieerde datastructuur, met daarin in elk geval de volgende velden:
type
(verplicht): een string die het type van dit document aanduidt, bijvoorbeeld "FINANCIAL_CLAIMS_INFORMATION_REQUEST"
.version
(optioneel): een string met een decimaal getal erin, die de versie van de datastructuur aangeeft.body
(optioneel): een datastructuur waarvan de structuur afhangt van de waarde van type
.Een Document MAG ondertekend worden, wat in dat geval in de vorm van een JWS MOET zijn, met "document"
als de waarde van de sub
parameter. De kid
parameter MAG gebruikt worden in de JWS header en MOET indien aanwezig een string zijn.
Voorbeeld van een Document JWS (met newlines enkel voor leesbaarheid):
eyJ0eXAiOiJqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6IjEifQ.eyJzdWIiOiJkb2N1bWVudCIsInR5
cGUiOiJFWEFNUExFX0RPQ1VNRU5UX1RZUEUiLCJ2ZXJzaW9uIjoiMSIsImJvZHkiOnsiZm9vIjoiYmF
yIn19.EHcxxbaDLX0MkrJvlg6kQ3ENgmV9ndEYp5eaFF6MnHcumH_9mfMVCTJtxwf9zSdqtZ2gRMnKp
n-e9OPPaeiGdA
De inhoud van deze JWS (zie ook https://jwt.io) is als volgt (zie de Cryptografie sectie in de Blauwe Knop Connect standaard voor een uitleg van de hier gebruikte notatie):
{
"typ": "jwt",
"alg": "ES256",
"kid": "1"
}
.
{
"sub": "document",
"type": "EXAMPLE_DOCUMENT_TYPE",
"version": "1",
"body": {
"foo": "bar"
}
}
Deze JWS kan geverifieerd worden met de volgende public key:
{
"kty": "EC", "crv": "P-256",
"x": "T5PP_Q1prhqQoBH5tgXkfrLGV5wrB8HuANJZezYP5m8",
"y": "dtALK0t1e3dJXGyYgiyRrqONAQhi2LjFYYh9S5GqHyg"
}
In het ConfigureRequest
protocol geeft de App middels een digitaal ondertekend Document aan dat de burger financiële informatie op wil gaan vragen.
Het resulteert in een configurationToken
die de organisatie aan de App verstuurt waarmee deze later de daadwerkelijke financiële informatie op kan vragen, in het RequestFinancialInformation
protocol.
Het protocol kent de volgende participanten:
CitizenFinancialClaimProcess
is een proces in de vorm van een HTTP server die draait bij de organisatie.
Deze ontvangt en verwerkt verzoeken van de App, en slaat resulterende informatie op in de FinancialClaimRequestService
voor later.FinancialClaimRequestService
is een database die draait bij de organisatie.De App en het CitizenFinancialClaimProcess
maken aan het begin van het protocol gebruik van het CreateSession
protocol voor het authenticeren van de App naar de organisatie en het produceren van een AES sleutel voor versleuteling van het verkeer tussen de App en organisatie.
De stappen van dit protocol worden hier niet expliciet getoond of uitgeschreven.
Het protocol ziet er in een sequence diagram als volgt uit.
ConfigureRequest
protocolEr volgt een expliciete beschrijving van de protocolberichten, die refereert aan de genummerde stappen in bovenstaand sequence diagram. Alle whitespace in JSON structuren is enkel bedoeld voor de leesbaarheid van deze standaard en dient niet te worden opgenomen in implementaties.
De App gebruikt het CreateSession
protocol uit de Blauwe Knop Connect standaard voor authenticatie, resulterend in een sessionToken
en een AES key voor later gebruik.
De App stelt een Document
JWS samen (zie de sectie over Documenten hierboven), met "FINANCIAL_CLAIMS_INFORMATION_REQUEST"
als type
, en zonder version
en body
.
Voorbeeld:
{
"typ": "jwt",
"alg": "ES256"
}
.
{
"sub": "document",
"type": "FINANCIAL_CLAIMS_INFORMATION_REQUEST"
}
De App versleutelt het Document
JWS met de AES key van de sessie in de vorm van een JWE (zie de Cryptografie sectie in de Blauwe Knop Connect standaard).
De App verstuurt het versleutelde Document
JWS naar de CitizenFinancialClaimsProcess
middels een HTTP POST
met de volgende inhoud:
Authorization
: het sessionToken
uit stap 1.POST
body: het versleutelde Document
JWS.Voorbeeld:
POST /configure_claims_request HTTP/1.1
Host: organization.example.com
Authorization: 9YryEzKheqpx5iS2JsDNRHoydCBIsAKV
eyNaIioBb2_Jhb...x5Nz-g
De CitizenFinancialClaimProcess
genereert met een CSPRNG een willekeurige alfanumerieke configuration token die minimaal 22 karakters MOET zijn (zodat hij minimaal 128 bit entropie heeft).
De CitizenFinancialClaimsProcess
maakt een JSON object met daarin de volgende velden:
sub
: MOET de vaste waarde configuration_token
hebben.iss
: de URL van de CitizenFinancialClaimsProcess
.configuration_token
: het configuration_token
uit stap 8.Voorbeeld:
{
"sub": "configuration_token",
"iss": "https://citizen-financial-claims-process.example.com/",
"configuration_token": "LarRGSbmUPYtRYO6BQ4yn8"
}
De CitizenFinancialClaimsProcess
versleutelt dit JSON object met de AES key van de sessie in de vorm van een JWE (zie de Cryptografie sectie in de Blauwe Knop Connect standaard), en stuurt dat in de HTTP response behorende bij het HTTP request uit Stap 5 terug naar de app.
De App ontsleutelt de JWE met de session AES key, en valideert dat:
iss
en sub
de waardes zoals daar gespecificeerd.Middels het RequestFinancialInformation
protocol kan de burger financiële informatie opvragen.
Het resulteert in een door de organisatie digitaal ondertekend Document met daarin de financiële informatie.
Dit protocol kan alleen worden uitgevoerd als de App en organisatie eerder het ConfigureRequest
protocol hebben uitgevoerd, zodat de App beschikking heeft over een configurationToken
.
Daarnaast maken ook in dit protocol (net als ConfigureRequest
) de App en het CitizenFinancialClaimProcess
gebruik van het CreateSession
protocol voor het authenticeren van de App naar de organisatie en het produceren van een AES sleutel voor versleuteling van verder verkeer tussen de App en organisatie.
(De ConfigureRequest
en RequestFinancialInformation
protocollen hebben ieder een eigen authenticatiesessie nodig: dat wil zeggen, het sessionToken
resulterende uit het CreateSession
protocol dat werd uitgevoerd tijdens het ConfigureRequest
protocol kan niet worden hergebruikt in het RequestFinancialInformation
protocol.
In plaats daarvan moet CreateSession
opnieuw worden uitgevoerd.)
Dit protocol kent dezelfde participanten als het ConfigureRequest
protocol, en daarnaast ook de volgende participant:
SourceSystem
: een systeem van de organisatie die financiële informatie van burgers beheert, en ter beschikking stelt aan andere systemen van de organisatie.Net als in het ConfigureRequest
protocol wordt het sessionToken
gebruikt als identifier voor de sessie.
Deze wordt niet op applicatielaag versleuteld (uiteraard wel op transportniveau middels TLS), omdat de organisatie middels het sessionToken
de AES key moet opzoeken die voor versleuteling gebruikt kan worden.
Het configurationToken
en al het verdere verkeer wordt echter wel op applicatielaag versleuteld opgestuurd (en daarnaast nog eens middels TLS).
Het protocol ziet er in een sequence diagram als volgt uit.
RequestFinancialInformation
protocolEr volgt een expliciete beschrijving van de protocolberichten, die refereert aan de genummerde stappen in bovenstaand sequence diagram. Alle whitespace in JSON structuren is enkel bedoeld voor de leesbaarheid van deze standaard en dient niet te worden opgenomen in implementaties.
De App gebruikt het CreateSession
protocol uit de Blauwe Knop Connect standaard voor authenticatie, resulterend in een sessionToken
en een AES key voor later gebruik.
De App maakt een JSON object met daarin de volgende velden:
sub
: MOET de vaste waarde configuration_token
hebben.iss
: MOET de vaste waarde bk-connect://app/
hebben.configuration_token
: het configuration_token
uit het ConfigureRequest
protocol.Voorbeeld:
{
"sub": "configuration_token",
"iss": "bk-connect://app/",
"configuration_token": "LarRGSbmUPYtRYO6BQ4yn8"
}
Vervolgens versleutelt de App dit object met de session AES key uit het CreateSession
protocol in de vorm van een JWE (zie de Cryptografie sectie in de Blauwe Knop Connect standaard).
De App verstuurt een HTTP POST
naar de CitizenFinancialClaimsProcess
met de volgende inhoud:
configurationToken
: De JWE uit stap 2.Authorization
: het sessionToken
uit stap 1.Voorbeeld:
POST /request_financial_claims_information?configurationToken=eylNzToF_nyZU... HTTP/1.1
Host: organization.example.com
Authorization: 9YryEzKheqpx5iS2JsDNRHoydCBIsAKV
Het CitizenFinancialClaimsProcess
ontsleutelt de JWE met de session AES key, en valideert dat:
iss
en sub
de waardes zoals daar gespecificeerd.Het CitizenFinancialClaimsProcess
doet een HTTP POST
request naar /financial_claims_information
van het SourceSystem
om financiële informatie op te vragen, met in de POST
body een JSON object met daarin:
bsn
: Het BSN in de vorm van een string.Voorbeeld:
POST /financial_claims_information HTTP/1.1
Host: sourcesystem.example.com
{
"bsn": "999991772"
}
NB: toegang tot het /financial_claims_information
endpoint MOET geauthenticeerd zijn zodat enkel geauthoriseerde diensten waaronder het CitizenFinancialClaimsProcess
er toegang toe hebben.
Deze authenticatie valt buiten de scope van deze standaard, maar te denken valt aan een Authorization
HTTP header met daarin een voorgeconfigureerd token, of het bereikbaar maken van het endpoint enkel binnen een intern netwerk van de organisatie, of tweezijdig TLS, of een combinatie van deze maatregelen.
Het SourceSystem
antwoordt met een JSON object met daarin de financiële informatie.
De CitizenFinancialClaimsProcess
stelt op basis van de response van het SourceSystem
die hij heeft geraadpleegd een Document JWS samen (zie de sectie over Documenten hierboven), met "FINANCIAL_CLAIMS_INFORMATION_RESPONSE"
als type
, en de financiële informatie in de body
.
Voorbeeld:
{
"typ": "jwt",
"alg": "ES256",
"kid": "1"
}
.
{
"sub": "document",
"type": "FINANCIAL_CLAIMS_INFORMATION_RESPONSE",
"version": "2",
"body": {
// financial document as returned by the SourceSystem
}
}
De CitizenFinancialClaimsProcess
versleutelt bovenstaande Document JWS met de AES key van de sessie in de vorm van een JWE (zie de Cryptografie sectie in de Blauwe Knop Connect standaard), en stuurt dat in de HTTP response behorende bij het HTTP request uit Stap 3 terug naar de app.
Naast onderdelen die als niet normatief gemarkeerd zijn, zijn ook alle diagrammen, voorbeelden, en noten in dit document niet normatief. Verder is alles in dit document normatief.
De trefwoorden MAG en MOET in dit document moeten worden geïnterpreteerd als in BCP 14 [RFC2119] [RFC8174] als, en alleen als deze in hoofdletters zijn weergegeven, zoals hier getoond.