|
| 1 | +# Policy inschieten als issuer |
| 2 | + |
| 3 | +Deze gids is voor ontwikkelaars aan de **issuer-kant** die een autorisatiebeleid (policy) rechtstreeks via de NoodleBar/TSL API aanmaken, zodat een dataservice consumer transport-emissiedata mag ophalen. Deze gids is het spiegelbeeld van [Transport Emissie Data Autorisatie](transport-emissie-data-autorisatie.md): die beschrijft hoe de datadienst-aanbieder een policy *controleert* via `explained-enforce`; deze gids beschrijft hoe de data-rechthebbende die policy *aanmaakt*. |
| 4 | + |
| 5 | +In deze usecase machtigt **Bob (Greenpack, de wegvervoerder)** de dataservice consumer **David (GreenlinQ / VAA)** om bij **Charlie (BigMile)** transport-emissiedata op te halen voor een specifiek klantnummer van een teler. |
| 6 | + |
| 7 | +> **Belangrijk — standaard schiet een issuer policies voor zichzelf in.** In het standaardpad is de issuer de organisatie waarmee je bent geauthenticeerd. Je mag `issuerId` weglaten (dan wordt het afgeleid uit je token) of expliciet je eigen EUID meesturen. Voor cross-organisatie aanmaak gelden extra voorwaarden: dit kan alleen voor door Poort8 goedgekeurde trusted/control plane clients met delegated rechten. |
| 8 | +
|
| 9 | +## Voor wie is deze gids? |
| 10 | + |
| 11 | +Voor applicaties van een **data-rechthebbende (issuer)** die: |
| 12 | + |
| 13 | +- zelf, buiten Keyper om, een policy aanmaken via de TSL API; |
| 14 | +- een dataservice consumer willen machtigen voor een specifiek klantnummer; |
| 15 | +- de issuer van de policy zelf zijn — je machtigt namens je eigen organisatie. |
| 16 | + |
| 17 | +Deze gids beschrijft niet de Keyper approval-flow. De nadruk ligt op het standaardpad (aanmaken voor je eigen organisatie); delegated/trusted varianten worden hieronder alleen op hoofdlijnen benoemd. |
| 18 | + |
| 19 | +## Rollen in deze usecase |
| 20 | + |
| 21 | +| Rol | Partij | AR-veld | EUID | |
| 22 | +| --------------------------------------- | ----------------------------------------------- | ----------------------------- | ---------------- | |
| 23 | +| Data-rechthebbende / machtiger (= jezelf) | Bob — Greenpack SSC B.V. (KVK 77118421) | `issuer` / `issuerId` | `NLNHR.77118421` | |
| 24 | +| Dataservice consumer | David — GreenlinQ / VAA, Fresh Info B.V. (KVK 60756829) | `subject` / `subjectId` | `NLNHR.60756829` | |
| 25 | +| Datadienst-aanbieder | Charlie — BigMile (KVK 73401919) | `serviceProvider` | `NLNHR.73401919` | |
| 26 | +| Onderliggende rechthebbende-op-toegang | Alice — teler | `resource` / `resourceId` via klantnummer | bijv. `KLANT-7788` | |
| 27 | + |
| 28 | +De EUID is opgebouwd als `NLNHR.<KVK-nummer>`. Het klantnummer van de teler is rechtstreeks de `resourceId`; er wordt in deze usecase geen resource group-hierarchie gebruikt. |
| 29 | + |
| 30 | +## Procesoverzicht |
| 31 | + |
| 32 | +```mermaid |
| 33 | +sequenceDiagram |
| 34 | + autonumber |
| 35 | + participant Bob as Bob (Greenpack, issuer) |
| 36 | + participant Auth as TSL Keycloak |
| 37 | + participant AR as TSL Autorisatieregister |
| 38 | +
|
| 39 | + Bob->>Auth: Token ophalen (client credentials) |
| 40 | + Auth-->>Bob: Bearer token |
| 41 | + Bob->>AR: POST /v1/api/policies (issuerId = Greenpack zelf) |
| 42 | + AR-->>Bob: 201 Created |
| 43 | +``` |
| 44 | + |
| 45 | +## Het "standaard voor jezelf"-principe |
| 46 | + |
| 47 | +Wanneer Greenpack zich authenticeert via client credentials, is het verkregen token gekoppeld aan de organisatie Greenpack in het TSL-realm. Het `POST /v1/api/policies`-endpoint leidt de issuer af uit die geauthenticeerde organisatie. `issuerId` is daarom optioneel: |
| 48 | + |
| 49 | +- Laat je `issuerId` weg → de issuer wordt afgeleid uit je token (Greenpack). |
| 50 | +- Zet je `issuerId` op je eigen EUID → de policy wordt aangemaakt. |
| 51 | +- Zet je `issuerId` op de EUID van een andere organisatie zonder delegated/trusted rechten → de aanvraag wordt geweigerd (`403 Forbidden`). |
| 52 | + |
| 53 | +Dit is bewust: een organisatie kan alleen toegang verlenen tot data waarover zij zelf de rechthebbende is, tenzij een trusted/control plane app met delegated rechten dit expliciet namens deelnemers mag doen. De beleidsaanmaak blijft dan op hetzelfde policies-endpoint, maar met aanvullende autorisatieregels en governance. Zie ter achtergrond [NoodleBar Scopes](../noodlebar/11%20-%20Scopes.md). |
| 54 | + |
| 55 | +## Voorwaarden |
| 56 | + |
| 57 | +| Wat | Hoe | |
| 58 | +| --------------------------------------------------------------- | -------------------------------------------------------- | |
| 59 | +| Greenpack (issuer) geregistreerd in het TSL Participantenregister, inclusief app | Wegvervoerder / Poort8 | |
| 60 | +| API-toegang tot `noodlebar-api` | Via de catalogus in de portal | |
| 61 | +| Keycloak `client_id` + `client_secret` voor de TSL-omgeving | Wordt bij het registreren van de app uitgegeven | |
| 62 | +| Consumer (GreenlinQ / VAA) en serviceProvider (BigMile) bekend en geregistreerd | Zie het TSL Participantenregister | |
| 63 | +| Klantnummer van de teler bekend | Uit de eigen administratie van de wegvervoerder | |
| 64 | +| Voor cross-org aanmaak: trusted/control plane registratie + delegated rechten | Alleen na expliciete goedkeuring door Poort8 | |
| 65 | + |
| 66 | +## Stap 1 — Token ophalen |
| 67 | + |
| 68 | +Authenticeer tegen de TSL Keycloak-omgeving via OAuth 2.0 client credentials met scope `noodlebar-api`. Het verkregen `access_token` autoriseert je app om namens Greenpack de TSL API aan te roepen. |
| 69 | + |
| 70 | +``` |
| 71 | +POST https://auth.poort8.nl/realms/tsl/protocol/openid-connect/token |
| 72 | +Content-Type: application/x-www-form-urlencoded |
| 73 | +
|
| 74 | +grant_type=client_credentials |
| 75 | +&client_id=<YOUR_CLIENT_ID> |
| 76 | +&client_secret=<YOUR_CLIENT_SECRET> |
| 77 | +&scope=noodlebar-api |
| 78 | +``` |
| 79 | + |
| 80 | +## Policy-velden |
| 81 | + |
| 82 | +| Veld | Beschrijving | Voorbeeld | |
| 83 | +| ----------------- | ----------------------------------------------------- | ------------------------ | |
| 84 | +| `issuerId` | Data-rechthebbende (standaard: jezelf), als EUID | `NLNHR.77118421` | |
| 85 | +| `subjectId` | Dataservice consumer (GreenlinQ / VAA), als EUID | `NLNHR.60756829` | |
| 86 | +| `serviceProvider` | Datadienst-aanbieder (BigMile), als EUID | `NLNHR.73401919` | |
| 87 | +| `action` | Toegestane actie | `GET` | |
| 88 | +| `resourceId` | Klantnummer van de teler | `KLANT-7788` | |
| 89 | +| `type` | Resource type | `transport-emissie-data` | |
| 90 | +| `attribute` | Data-attributen | `*` | |
| 91 | +| `useCase` | Use case-model | `unspecified` | |
| 92 | +| `expiration` | Geldigheid van het mandaat als Unix timestamp | `2147483647` | |
| 93 | + |
| 94 | +Alleen `subjectId`, `action` en `resourceId` zijn technisch verplicht; de overige velden zijn optioneel. Vul `issuerId`, `serviceProvider`, `type`, `attribute` en `useCase` echter altijd in overeenstemming met de latere `explained-enforce`-check in, anders vindt het Autorisatieregister geen passende policy. |
| 95 | + |
| 96 | +## Stap 2 — Policy aanmaken |
| 97 | + |
| 98 | +Maak de policy aan die de consumer machtigt om voor het opgegeven klantnummer transport-emissiedata op te halen. In het standaardpad zet je `issuerId` op je eigen EUID (of laat je het veld weg). |
| 99 | + |
| 100 | +``` |
| 101 | +POST https://tsl.poort8.nl/v1/api/policies |
| 102 | +Authorization: Bearer <ACCESS_TOKEN> |
| 103 | +Content-Type: application/json |
| 104 | +``` |
| 105 | + |
| 106 | +```json |
| 107 | +{ |
| 108 | + "useCase": "unspecified", |
| 109 | + "issuerId": "NLNHR.77118421", |
| 110 | + "subjectId": "NLNHR.60756829", |
| 111 | + "serviceProvider": "NLNHR.73401919", |
| 112 | + "action": "GET", |
| 113 | + "resourceId": "<KLANTNUMMER>", |
| 114 | + "type": "transport-emissie-data", |
| 115 | + "attribute": "*", |
| 116 | + "expiration": 2147483647 |
| 117 | +} |
| 118 | +``` |
| 119 | + |
| 120 | +Een geslaagde aanmaak levert `201 Created` met de aangemaakte policy (inclusief `policyId`). Zie de [TSL API documentatie ➚](https://tsl.poort8.nl/scalar/v1) voor het volledige schema. |
| 121 | + |
| 122 | +## Policy bijwerken of verwijderen |
| 123 | + |
| 124 | +- `PUT /v1/api/policies` — werk een bestaande policy bij, bijvoorbeeld om de `expiration` te verlengen. |
| 125 | +- `DELETE /v1/api/policies/{id}` — verwijder een policy en trek daarmee de machtiging in. |
| 126 | + |
| 127 | +De data-rechthebbende die de policy heeft aangemaakt kan deze te allen tijde intrekken. Zie de [TSL API documentatie ➚](https://tsl.poort8.nl/scalar/v1) voor de endpoint-specificaties. |
| 128 | + |
| 129 | +## Omgevingsgegevens |
| 130 | + |
| 131 | +| Service | URL | |
| 132 | +| ---------------- | ----------------------------------------------------------------- | |
| 133 | +| Token endpoint | `https://auth.poort8.nl/realms/tsl/protocol/openid-connect/token` | |
| 134 | +| Policies endpoint | `https://tsl.poort8.nl/v1/api/policies` | |
| 135 | +| API documentatie | [TSL API docs ➚](https://tsl.poort8.nl/scalar/v1) | |
| 136 | + |
| 137 | +Vragen? Neem contact op met Poort8 via **<hello@poort8.nl>**. |
0 commit comments