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.

  1. Browser returns to your callback with an authorization code.
  2. Your server exchanges the code at https://localhost:9443/oauth2/token (PKCE + client secret for confidential clients).
  3. Use the response access_token to call UserInfo at https://localhost:9443/oauth2/userinfo.
  4. 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.

ItemValue
MethodGET
URLhttps://localhost:9443/oauth2/userinfo
AuthorizationBearer {access_token} from POST /oauth2/token
Scopes requiredopenid profile email eid

Example request

curl (replace access token)
curl -sS -H "Authorization: Bearer {broker_access_token}" \
  https://localhost:9443/oauth2/userinfo

Response fields (approved standard bundle)

ClaimScopeDescription
subopenidStable subject for your client — primary SSO key
nameprofileFull display name
given_nameprofileFirst name
family_nameprofileLast name
birthdateprofileYYYY-MM-DD
emailemailEmail on file
email_verifiedemailBoolean when email scope granted
username(broker)Internal broker username (pairwise-style); not the eID card number
citizen_statuseide.g. active, suspended, revoked
rp_tokeneidOpaque RP-specific correlation token
eideidCitizen eID card number (SXM- + 9-digit elfproef, e.g. SXM-123456782) when on allow-list

Mapping to your application

OIDC claimSuggested use
subUnique key column (oidc_sub) — create/update user on every login
emailContact; fallback identifier only if policy allows
name / given_name / family_nameDisplay name
birthdateProfile or eligibility checks
eidCitizen eID card number when approved
citizen_statusGate access (active vs suspended/revoked)
rp_tokenBack-office / registry APIs — not for login primary key

Scopes

Standard sandbox bundle: openid profile email eid

ScopePurpose
openidRequired — includes sub
profilename, given_name, family_name, birthdate
emailemail, email_verified (when approved)
eidcitizen_status, rp_token, eid (card number when approved); uin only by exception

Claims catalog

ClaimTypical scopeUse
subopenidPrimary SSO key (oidc_sub) — pairwise per client
nameprofileDisplay name
given_nameprofileFirst name
family_nameprofileLast name
birthdateprofileYYYY-MM-DD
emailemailContact address on file
email_verifiedemailBoolean
eideidCitizen eID card number when approved
citizen_statuseide.g. active, suspended
rp_tokeneidOpaque registry correlation token
uineidException 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.

Decoded broker id_token claims
{
  "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.

GET /oauth2/userinfo response body
{
  "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

SymptomWhat to check
Only sub + profile/emailScope must include eid for eid bundle; revoke broker consent and sign in again after platform claim repair
No eid / rp_token / citizen_statusBroker OIDC scope eid must list those attributes; federation from Sint Maarten eID must be active
Only subBroker SP requested-claims / claim mapping incomplete — contact platform team
UserInfo 401Use broker access_token from token endpoint, not id_token; token may be expired