Skip to content

Commit b094eeb

Browse files
committed
Deploy gds-draft docs: 1be21ccb9951089e9f04e8d13c0e8039007c6db1
1 parent 1751d52 commit b094eeb

4 files changed

Lines changed: 102 additions & 87 deletions

File tree

gds-draft/approval-workflow.md

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,23 @@ This guide is for **David** — a data service consumer who needs to request bui
1212

1313
| Requirement | Description |
1414
|-------------|-------------|
15+
| Application registered | You have registered your application in the Self-Service Portal — see [Requesting API Access](requesting-api-access.md) Step 1 |
1516
| API access approved | Charlie has approved your application's access to their API |
16-
| Keyper credentials | OAuth2 client credentials for Keyper (contact Poort8 at hello@poort8.nl) |
17+
| Keyper API access approved | You have requested access to **Keyper** for your application in the Self-Service Portal and the request is approved |
1718
| Building details known | VBO ID of the target building and building owner's organization |
1819

20+
### One-time setup: Request access to Keyper
21+
22+
Keyper is registered as an API in the GDS Self-Service Portal, just like any other system. Before you can call the Keyper API, your application needs access to it.
23+
24+
1. Log in to the [Self-Service Portal](https://gds-preview.poort8.nl/portal)
25+
2. Navigate to the **Catalogue** and search for **Keyper**
26+
3. Click **Request Access**
27+
28+
Your request will have status **Pending** until approved.
29+
30+
> **You can continue implementing while you wait.** The repeatable steps in this guide can be built and tested independently of your access request status. Your approval requests will not go through until your application has been granted access to Keyper.
31+
1932
## Overview
2033

2134
```likec4
@@ -54,30 +67,28 @@ views {
5467

5568
## Step 1 — Authenticate with Keyper
5669

57-
Obtain an access token for the Keyper API:
70+
Use the same M2M application credentials registered in the Self-Service Portal (see [Requesting API Access](requesting-api-access.md#step-1--register-your-application)) to request an access token. Specify `keyper-api` as the scope:
5871

5972
```http
60-
POST https://poort8.eu.auth0.com/oauth/token
61-
Content-Type: application/json
73+
POST https://auth.poort8.nl/realms/gds-preview/protocol/openid-connect/token
74+
Content-Type: application/x-www-form-urlencoded
6275
63-
{
64-
"client_id": "<YOUR_KEYPER_CLIENT_ID>",
65-
"client_secret": "<YOUR_KEYPER_CLIENT_SECRET>",
66-
"audience": "Poort8-Dataspace-Keyper-Preview",
67-
"grant_type": "client_credentials"
68-
}
76+
grant_type=client_credentials&
77+
client_id=YOUR_CLIENT_ID&
78+
client_secret=YOUR_CLIENT_SECRET&
79+
scope=keyper-api
6980
```
7081

7182
Response:
7283
```json
7384
{
7485
"access_token": "eyJhbGciOiJSUzI1NiIs...",
7586
"token_type": "Bearer",
76-
"expires_in": 3600
87+
"expires_in": 300
7788
}
7889
```
7990

80-
Store the token and reuse it for multiple requests until it expires (1 hour).
91+
> **Token lifetime:** Tokens are valid for **5 minutes**. Request a new token before the current one expires. Do not cache tokens beyond their expiry.
8192
8293
## Step 2 — Prepare required data
8394

@@ -198,7 +209,7 @@ Content-Type: application/json
198209
{
199210
"id": "474e19af-8165-4b85-ad03-be81f9f8dcc2",
200211
"reference": "SENSOR-OPT-2025-Q4-001",
201-
"url": "https://keyper-preview.poort8.nl/approve/474e19af-8165-4b85-ad03-be81f9f8dcc2",
212+
"url": "https://keyper-preview.poort8.nl/approve?id=474e19af-8165-4b85-ad03-be81f9f8dcc2&app=your-app-id",
202213
"expiresAtUtc": 1730739600,
203214
"status": "Active"
204215
}

gds-draft/architecture.md

Lines changed: 42 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -6,42 +6,53 @@ This guide explains how the GDS components work together to enable sovereign bui
66

77
## System components
88

9-
```mermaid
10-
flowchart TB
11-
subgraph "GDS Participant Registry (Keycloak)"
12-
KC[Identity & Access Management]
13-
CAT[API Catalogue]
14-
end
15-
16-
subgraph "GDS Authorization Registry (NoodleBar)"
17-
OR[Organization Registry]
18-
AR[Authorization Registry]
19-
end
20-
21-
subgraph "Keyper Approve"
22-
KA[Approval Workflow Manager]
23-
end
24-
25-
subgraph "External"
26-
DSP[Data Service Provider<br/>Charlie's IoT Platform]
27-
DSC[Data Service Consumer<br/>David's Platform]
28-
BO[Building Owner<br/>Bob]
29-
end
30-
31-
DSC -->|1. Authenticate| KC
32-
DSC -->|2. Call API| DSP
33-
DSP -->|3. Check policy| AR
34-
DSC -->|4. Request approval| KA
35-
KA -->|5. Notify| BO
36-
BO -->|6. Approve| KA
37-
KA -->|7. Register policy| AR
9+
This sequence shows the end-to-end interaction order in two phases: first approval and policy registration, then data access with policy enforcement.
10+
11+
```likec4
12+
// view: architecture_end_to_end
13+
specification {
14+
element actor
15+
element system
16+
}
17+
18+
model {
19+
david = actor 'David\'s Platform'
20+
kc = system 'GDS Participant Registry (Keycloak)'
21+
keyper = system 'Keyper Approve'
22+
bob = actor 'Building Owner (Bob)'
23+
ar = system 'GDS Authorization Registry'
24+
charlie = system 'Charlie\'s IoT Platform'
25+
}
26+
27+
views {
28+
dynamic view architecture_end_to_end {
29+
title 'GDS End-to-End Flow'
30+
variant sequence
31+
32+
david -> kc 'Request token for Keyper API'
33+
kc -> david 'JWT access token'
34+
david -> keyper 'POST /v1/api/approval-links'
35+
keyper -> david '201 Created (approval link ID)'
36+
keyper -> bob 'Email with approval link'
37+
bob -> keyper 'Approves + enters verification code'
38+
keyper -> ar 'Registers policies'
39+
ar -> keyper 'Policies stored'
40+
41+
david -> kc 'Request token for provider API'
42+
kc -> david 'JWT access token'
43+
david -> charlie 'GET /data + Bearer token'
44+
charlie -> ar 'GET /api/authorization/explained-enforce'
45+
ar -> charlie 'HTTP 200: {allowed: true/false, policies}'
46+
charlie -> david 'If allowed: 200 + data / If denied: 403'
47+
}
48+
}
3849
```
3950

4051
### GDS Participant Registry
4152

4253
The Participant Registry is a Keycloak-based identity service that manages:
4354

44-
- **Organization identities** — Registration, verification (KvK, LEI, VIES), and approval
55+
- **Organization identities** — Registration, verification, and approval
4556
- **User accounts** — Credentials, email verification, and organization membership
4657
- **Application registrations** — OAuth2 clients for data service consumers (David)
4758
- **API registrations** — Service definitions for data service providers (Charlie)
@@ -103,7 +114,7 @@ https://auth.poort8.nl/realms/gds-preview/protocol/openid-connect/token
103114
https://auth.poort8.nl/realms/gds-preview/protocol/openid-connect/certs
104115
```
105116

106-
Tokens are short-lived (5 minutes) and include an `organization` claim identifying the consumer's verified organization.
117+
Tokens are short-lived (5 minutes) and include an `organization` claim identifying the consumer's verified organization. The same token endpoint serves both provider API calls (scope: the API's client ID) and Keyper API calls (scope: `keyper-api`), so a single registered M2M application is sufficient for all GDS interactions.
107118

108119
## Authorization model
109120

@@ -178,4 +189,3 @@ Both layers must be satisfied for data to flow. A consumer needs:
178189
| REST / JSON | All API communication |
179190
| OpenAPI 3.x | API specification format |
180191
| iSHARE | Policy model for authorization enforcement |
181-
| BAG / VBO | Dutch building identification for resource IDs |

gds-draft/onboarding.md

Lines changed: 11 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -18,44 +18,25 @@ flowchart LR
1818

1919
Any user can register their organization through the [Self-Service Portal](https://gds-preview.poort8.nl/portal). The registering user:
2020

21-
1. **Provides organization details** — KvK number (auto-verified via KvK API), organization name, VAT number (optional)
22-
2. **Creates a user account** — name, email, and phone number
23-
3. **Accepts conditions of use**
24-
4. **Receives a password setup email** to activate their account
21+
1. **Provides organization details** — KvK number, organization name
22+
2. **Provides user details** — name, email, and phone number
23+
3. **Receives a password setup email** to activate their account
2524

26-
After registration, the organization has status **"review-pending"** and awaits approval by Poort8.
25+
After registration, the organization will be under review for approval by Poort8.
2726

2827
## Verifications
2928

30-
Each organization undergoes verification checks in three categories.
29+
Each organization undergoes verification checks across automatic, member, and dataspace administrator-controlled steps:
3130

32-
### Automatic checks
33-
34-
These run automatically during registration:
35-
36-
| Check | What it does | Outcome |
37-
|-------|-------------|---------|
38-
| **Business register (KvK)** | Validates the KvK number via the KvK API and checks the official name | Approved if name matches; rejected if mismatch or not found |
39-
40-
### Organization checks
41-
42-
These require action from the organization's members:
43-
44-
| Check | What it does | Outcome |
45-
|-------|-------------|---------|
46-
| **Email verification** | Confirms the user's email via a verification link | Approved when user clicks the link |
47-
48-
### Dataspace operator checks
49-
50-
| Check | What it does | Outcome |
51-
|-------|-------------|----------|
52-
| **Onboarding approval** | Poort8's final decision on participation | Approved, rejected, or revoked |
31+
| Verification step | Owner | What it does | Outcome |
32+
|-------------------|-------|--------------|---------|
33+
| **Business register (KvK)** | Automatic | Validates the KvK number via the KvK API and checks the official name against the name entered during onboarding | If the name matches, onboarding continues. If it does not match, the user is asked to confirm whether they intended to onboard the KvK-registered organization |
34+
| **Onboarding user's email verification** | Original onboarding user | Verifies that the person who started onboarding controls the submitted email address (via verification link). This user automatically becomes the organization's administrator in the dataspace. | Approved when that user confirms the email address |
35+
| **Onboarding approval** | Dataspace administrator (Poort8) | Poort8's final decision on participation | Approved, rejected, or revoked |
5336

5437
## Approval process
5538

56-
After registration, Poort8 reviews the organization's details — including the business register check, and email verification status — and approves or rejects participation.
57-
58-
> **EUID cannot be changed.** If an organization registered with an incorrect KvK number, it must be deleted and re-registered with the correct details. Contact Poort8 if this occurs.
39+
After registration, Poort8 reviews the organization's details and approves or rejects participation.
5940

6041
## Organization identifiers
6142

gds-draft/portal-guide.md

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,36 @@ The GDS Self-Service Portal allows participants to manage their organization, re
66

77
**URL:** [gds-preview.poort8.nl/portal ➚](https://gds-preview.poort8.nl/portal)
88

9+
## Organization onboarding and approval
10+
11+
An organization must be onboarded and approved to access all dataspace features.
12+
13+
### Summary
14+
15+
1. The organization is onboarded through the Self-Service Portal
16+
2. The onboarding user becomes the organization's first administrator
17+
3. Poort8 reviews and approves or rejects the organization
18+
19+
Until Poort8 approves your organization, users from that organization cannot access dataspace systems.
20+
21+
For the complete onboarding and verification flow (KvK checks, email verification, and approval states), see [Organization Registration](onboarding.md).
22+
23+
### User roles in an organization
24+
25+
Users have one of two roles:
26+
27+
| Role | Capabilities |
28+
|------|--------------|
29+
| **Administrator** | Full organization management, including changing user roles and removing users |
30+
| **Member** | Can use portal features available to the organization and invite new users |
31+
32+
The user who onboards the organization becomes the organization's first **administrator**.
33+
934
## Portal capabilities by role
1035

1136
| Capability | David (Consumer) | Charlie (Provider) | Bob (Owner) |
1237
|------------|-----------------|-------------------|-------------|
1338
| View organization details ||||
14-
| Upload business register extract ||||
1539
| Register an application ||||
1640
| Register an API ||||
1741
| Browse API catalogue ||||
@@ -67,14 +91,3 @@ When a consumer requests access to your API:
6791
4. **Approve** or **reject** the request
6892

6993
Once approved, the consumer can request tokens targeting your API. You can **revoke** access at any time.
70-
71-
## View granted policies (Bob)
72-
73-
Building owners can inspect which policies have been granted for their buildings:
74-
75-
1. Log in to the portal
76-
2. Navigate to the policies overview
77-
3. Filter by your organization to see active policies
78-
4. Review which consumers have access to which buildings
79-
80-
For revoking policies, contact the dataspace administrator or use the admin interface if you have appropriate access.

0 commit comments

Comments
 (0)