Relying party documentation
Claims & identifiers
What your application receives in ID tokens and UserInfo — standard scopes, approved claims, how to call broker UserInfo, and what is withheld by default.
How data is delivered
After login, read identity from the broker ID token (JWT) and/or UserInfo (GET /oauth2/userinfo with the broker access token). For approved clients, the platform configures the same approved claims in both unless your onboarding letter documents an exception.
Map sub to your local user record (e.g. oidc_sub). Store eid when your allow-list includes it — this is the citizen's eID card number, not the same as sub. Use rp_token (scope eid) for agreed government back-office correlation.
- Browser returns to your callback with an authorization
code. - Your server exchanges the code at
https://localhost:9443/oauth2/token(PKCE + client secret for confidential clients). - Use the response
access_tokento call UserInfo athttps://localhost:9443/oauth2/userinfo. - Merge UserInfo with decoded id_token claims if either source is minimal.
Broker UserInfo API
Production RPs call the SXM Identity Broker only — not the upstream eID /connect/userinfo endpoint. The broker issues an opaque access token (UUID shape); upstream eID expects a JWT access token instead.
| Item | Value |
|---|---|
| Method | GET |
| URL | https://localhost:9443/oauth2/userinfo |
| Authorization | Bearer {access_token} from POST /oauth2/token |
| Scopes required | openid profile email eid |
Example request
curl -sS -H "Authorization: Bearer {broker_access_token}" \
https://localhost:9443/oauth2/userinfoResponse fields (approved standard bundle)
| Claim | Scope | Description |
|---|---|---|
| sub | openid | Stable subject for your client — primary SSO key |
| name | profile | Full display name |
| given_name | profile | First name |
| family_name | profile | Last name |
| birthdate | profile | YYYY-MM-DD |
| Email on file | ||
| email_verified | Boolean when email scope granted | |
| username | (broker) | Internal broker username (pairwise-style); not the eID card number |
| citizen_status | eid | e.g. active, suspended, revoked |
| rp_token | eid | Opaque RP-specific correlation token |
| eid | eid | Citizen eID card number (SXM- + 9-digit elfproef, e.g. SXM-123456782) when on allow-list |
Mapping to your application
| OIDC claim | Suggested use |
|---|---|
| sub | Unique key column (oidc_sub) — create/update user on every login |
| Contact; fallback identifier only if policy allows | |
| name / given_name / family_name | Display name |
| birthdate | Profile or eligibility checks |
| eid | Citizen eID card number when approved |
| citizen_status | Gate access (active vs suspended/revoked) |
| rp_token | Back-office / registry APIs — not for login primary key |
Scopes
Standard sandbox bundle: openid profile email eid
| Scope | Purpose |
|---|---|
| openid | Required — includes sub |
| profile | name, given_name, family_name, birthdate |
| email, email_verified (when approved) | |
| eid | citizen_status, rp_token, eid (card number when approved); uin only by exception |
Claims catalog
| Claim | Typical scope | Use |
|---|---|---|
| sub | openid | Primary SSO key (oidc_sub) — pairwise per client |
| name | profile | Display name |
| given_name | profile | First name |
| family_name | profile | Last name |
| birthdate | profile | YYYY-MM-DD |
| Contact address on file | ||
| email_verified | Boolean | |
| eid | eid | Citizen eID card number when approved |
| citizen_status | eid | e.g. active, suspended |
| rp_token | eid | Opaque registry correlation token |
| uin | eid | Exception only — raw UIN |
Default approved bundle: sub, name, given_name, family_name, email, birthdate, citizen_status, rp_token, eid.
Example ID token (illustrative)
Decoded payload only — values differ per environment and client_id. Shape matches a standard sandbox citizen with scope eid.
{
"sub": "94900f70-d9d6-4548-965c-b96602061aa3",
"iss": "https://{BROKER_HOST}/oauth2/token",
"aud": "YOUR_CLIENT_ID",
"exp": 1792401493,
"iat": 1792397893,
"nonce": "your-nonce",
"name": "Michael Brown",
"given_name": "Michael",
"family_name": "Brown",
"birthdate": "1990-01-15",
"email": "michael.brown@mock.civil.sx",
"email_verified": true,
"citizen_status": "active",
"rp_token": "a1b2c3d4e5f6789012345678abcdef01",
"eid": "SXM-123456782"
}Example UserInfo (illustrative)
Response body from GET https://localhost:9443/oauth2/userinfo for the same login. Field presence depends on scopes, allow-list, and broker configuration.
{
"sub": "94900f70-d9d6-4548-965c-b96602061aa3",
"birthdate": "1990-01-15",
"name": "Michael Brown",
"given_name": "Michael",
"family_name": "Brown",
"email": "michael.brown@mock.civil.sx",
"email_verified": true,
"username": "u3vNo_NERm31fPRzWQXbcHpbV8Bkp5KWIjxrVwPJ4bY",
"citizen_status": "active",
"rp_token": "a1b2c3d4e5f6789012345678abcdef01",
"eid": "SXM-123456782"
}Withheld by default
FAQ: Missing claims
| Symptom | What to check |
|---|---|
| Only sub + profile/email | Scope must include eid for eid bundle; revoke broker consent and sign in again after platform claim repair |
| No eid / rp_token / citizen_status | Broker OIDC scope eid must list those attributes; federation from Sint Maarten eID must be active |
| Only sub | Broker SP requested-claims / claim mapping incomplete — contact platform team |
| UserInfo 401 | Use broker access_token from token endpoint, not id_token; token may be expired |