Autorisatie
De Identity Federation-dienst van Cleverbase gebruikt OAuth 2.0 voor autorisatie.
GET /oauth2/authorize
Omschrijving
Start de OAuth 2.0-autorisatieserver met een Authorization Code flow, zoals beschreven in sectie 1.3.1 van RFC 6749.
De autorisatie komt terug als authorization code, die de client vervolgens MOET gebruiken om met de methode oauth2/token een access token (en id_token) op te halen.
Input parameters
| Parameter | Aanwezigheid | Waarde | Omschrijving |
|---|---|---|---|
| response_type | REQUIRED | String | Moet altijd "code" zijn. |
| client_id | REQUIRED | String | Unieke client identifier. |
| redirect_uri | OPTIONAL | String | De URL waarnaar na het autorisatieproces wordt teruggestuurd (standaard de geregistreerde redirect). |
| scope | REQUIRED | String | Door spaties gescheiden reeks. Moet "openid" bevatten. Mag aanvullende scopes bevatten, zoals "com.cleverbase.proof" en "email". |
| state | REQUIRED | String | Maximaal 255 bytes aan willekeurige gegevens van de client, die ongewijzigd terugkomen op de redirect-URI. |
| nonce | OPTIONAL | String | Reeks waarmee een clientsessie aan een ID token wordt gekoppeld, om replay-aanvallen tegen te gaan. |
| ui_locales | OPTIONAL | String | De talen en schriften die de eindgebruiker voor de UI verkiest, volgens RFC5646. Engels en Nederlands worden ondersteund. Zonder deze waarde, of bij een niet-ondersteunde taal, is Nederlands de standaard. |
Antwoord
| Parameter | Aanwezigheid | Waarde | Omschrijving |
|---|---|---|---|
| code | REQUIRED | String | De authorization code die de autorisatieserver heeft gegenereerd |
| state | REQUIRED | String | Hoort overeen te komen met de state uit het verzoek |
| error | OPTIONAL | String | Eén foutcode |
| error_description | OPTIONAL | String | Leesbare tekst met aanvullende informatie over de fout |
Foutgevallen
De kolom hieronder bevat de tekst die de gebruiker te zien krijgt, en die blijft daarom onvertaald staan zoals hij is.
| Geval | Getoond aan de gebruiker | Error | Error description |
|---|---|---|---|
ChallengeExpired | De QR code is vervallen. De QR code heeft een beperkte levensduur. Probeer het nog een keer en scan het binnen de 10 minuten. | access_denied | authentication challenge expired |
EmailUnverified | 'Uw email is niet geverifieerd', 'Activeer uw e-mail adres om verder te gaan. Om uw e-mail adres te valideren zoek naar "Verifieer je e-mailadres" in uw inbox en volg de instructies daar.' | access_denied | user email is unverified |
ConsentExpired | 'Pincode niet op tijd hebt ingevoerd', 'Wacht niet te lang om de pincode in te voeren, hier staat een tijdslimiet op.' | access_denied | consent request expired |
ConsentRejected | 'U ging niet akkoord met het delen van uw gegevens' | access_denied | Resource owner rejected consent |
ProcessExpired | 'Tijdslimiet bereikt', 'Deze handeling heeft een beperkte levensduur. Probeer het nog een keer en voer je pincode in binnen de 10 minuten.' | access_denied | process expired |
NonPkioCertificate | Kan niet verbinden met onze systemen. Er was een technisch probleem aan onze kant, probeer het nog een keer. | server_error | n.v.t. |
VerificationFailed | Kan niet verbinden met onze systemen. Er was een technisch probleem aan onze kant, probeer het nog een keer. | server_error | n.v.t. |
SystemError | Kan niet verbinden met onze systemen. Er was een technisch probleem aan onze kant, probeer het nog een keer. | server_error | n.v.t. |
ConsentInvalidated | Kan niet verbinden met onze systemen. Er was een technisch probleem aan onze kant, probeer het nog een keer. | server_error | n.v.t. |
AuthenticationFailure | Kan niet verbinden met onze systemen. Er was een technisch probleem aan onze kant, probeer het nog een keer. | server_error | n.v.t. |
Voorbeelden
-
Verzoek met alleen de service-scope
Minimaal verzoek voor alleen inloggen:
GET /oauth2/authorize? response_type=code& client_id=<OAuth2_client_id>& redirect_uri=<OAuth2_redirect_uri>& scope=openid& lang=en-US& state=12345678& nonce=54321 -
Verzoek met uitgebreide scopes
Met de IDF-scopes
"openid email com.cleverbase.personal_info com.cleverbase.id_number":GET /oauth2/authorize? response_type=code& client_id=<OAuth2_client_id>& redirect_uri=<OAuth2_redirect_uri>& scope=openid email com.cleverbase.personal_info com.cleverbase.id_number& lang=en-US& state=12345678& nonce=54321 -
Antwoord met alleen de service-scope
HTTP/1.1 302 Found Location: <OAuth2_redirect_uri>? code=FhkXf9P269L8g& state=12345678 -
Foutantwoord
HTTP/1.1 302 Found Location: <OAuth2_redirect_uri>?error=invalid_request& error_description=Invalid%20Authorization%20Code
POST /oauth2/token
Omschrijving
Haal bij de autorisatieserver een OAuth 2.0 bearer access token en een ID token op, door de authorization code mee te sturen die de server na een geslaagde authenticatie teruggaf, samen met de gebruikte scope en het client-id en client secret die de clientapplicatie heeft.
Input parameters
| Parameter | Aanwezigheid | Waarde | Omschrijving |
|---|---|---|---|
| grant_type | REQUIRED | String | Moet altijd "authorization_code" zijn |
| code | REQUIRED | String | De code uit de stap oauth2/authorize |
| client_id | REQUIRED | String | Unieke client identifier (zie Vereisten) |
| redirect_uri | REQUIRED | String | De URL waarnaar de gebruiker na het afronden van de autorisatie ging. |
Input headers
| Parameter | Aanwezigheid | Waarde | Omschrijving |
|---|---|---|---|
| Authorization | REQUIRED | String | Moet altijd Basic Auth zijn, bijvoorbeeld Basic Y2xpZW50SUQ6cGFzc3dvcmQ (de Base64-codering van CLIENT_ID:CLIENT_SECRET, volgens RFC 6749) |
Antwoord
| Parameter | Aanwezigheid | Waarde | Omschrijving |
|---|---|---|---|
| access_token | REQUIRED | String | Het kortlevende access token, te gebruiken afhankelijk van de scope van het OAuth 2.0-autorisatieverzoek. |
| expires_in | OPTIONAL | Int | De levensduur van het service access token, in seconden. |
| id_token | REQUIRED | JWT | Het ID token is een beveiligingstoken in JWT-vorm, met uitspraken over de authenticatie van een eindgebruiker door een autorisatieserver bij gebruik van een client. Het bevat ten minste de claim sub met de pairwise pseudonieme identiteit van de eindgebruiker. Je kunt het uitlezen met bijvoorbeeld jwt.io. |
| scope | REQUIRED | String | Door spaties gescheiden reeks met de scope waarvoor autorisatie is verleend. |
| token_type | REQUIRED | String | Moet Bearer zijn |
Voorbeelden
-
Voorbeeldverzoek
POST /oauth2/token HTTP/1.1 Authorization: Basic K3dfKT59SUD8gWghq1ghjuZ Content-Type: application/x-www-form-urlencoded grant_type=authorization_code& code=<RESULT_FROM_/oauth2/authorize>& client_id=<OAuth2_client_id>& client_secret=<OAuth2_client_secret>& redirect_uri=<OAuth2_redirect_uri> -
Voorbeeldantwoord
Voorbeeld wanneer het oorspronkelijke verzoek aan
oauth2/authorizealleen"openid"bevatte:{ "access_token": "f0EigERuAYruavv2fwRc4ZJKn1x1Uef8ymarsCqKfJw...", "expires_in": 3600, "id_token": "<ID_TOKEN_JWT_CONTENT>", "scope": "openid", "token_type": "bearer" }Voorbeeld wanneer dat verzoek de scopes
"openid email com.cleverbase.personal_info com.cleverbase.id_number"bevatte:{ "access_token": "rxdF-27ehy4LFSUsh32gVDfN9QpdwqDu-3ZtbVsx5J8...", "expires_in": 3600, "id_token": "<ID_TOKEN_JWT_CONTENT>", "scope": "openid email com.cleverbase.personal_info com.cleverbase.id_number", "token_type": "bearer" }
Het ID token valideren
Clients MOETEN het ID token in het tokenantwoord valideren volgens OIDC hfst. 3.1.3.7.
Ontbrekende claims
Als een claim wel is opgevraagd maar niet gedeeld kan worden, valt het veld weg uit het id_token en uit het antwoord van userinfo, conform OpenID Connect Specification 3.3.3.6. Clients MOETEN er dus rekening mee houden dat niet alle opgevraagde claims in het id_token en het antwoord van userinfo aanwezig zijn.
Gebruikersinformatie
Het UserInfo-endpoint is een OAuth 2.0 Protected Resource die claims teruggeeft over de geauthenticeerde eindgebruiker. Om die claims op te halen doet de client een verzoek aan het UserInfo-endpoint met een access token dat via OpenID Connect-authenticatie is verkregen. De claims komen terug als JSON-object met naam-waardeparen.
Let op: wordt dit endpoint voor IDF gebruikt, dan zijn de optionele scopes nodig. Anders komt alleen een pairwise pseudonieme identifier voor de natuurlijke persoon terug. Zie scopes en claims voor de details.
Let op
Deze functie werkt op dit moment alleen op de oude host "https://idf.acc.cleverbase.com".
Meer informatie: OpenID Connect.
GET /userinfo
Input headers
| Parameter | Aanwezigheid | Waarde | Omschrijving |
|---|---|---|---|
| Authorization | REQUIRED | String | Moet altijd van het type Bearer zijn, verkregen uit de OAuth-flow met de scope "openid". Bijvoorbeeld: Bearer 4/CKN69L8gdSYp5_pwH3XlFQZ3ndFhkXf9P2_TiHRG-bA |
Antwoord
| Parameter | Aanwezigheid | Waarde | Omschrijving |
|---|---|---|---|
| sub | REQUIRED | String | Subject: identifier voor de eindgebruiker bij de issuer. |
| com.cleverbase.proof | OPTIONAL | JSON | Een JSON-array van JSON-objecten met de velden id, content_type en base64_encoded_content. De relying party hoort de inhoud te archiveren, samen met de identifier en het opgegeven content type. |
| com.cleverbase.last_name | OPTIONAL | String | Achternaam van de eindgebruiker, zoals in het identiteitsdocument. |
| given_name | OPTIONAL | String | Voornaam of voornamen van de eindgebruiker, zoals in het identiteitsdocument. |
| birthdate | OPTIONAL | String | Geboortedatum van de eindgebruiker, zoals in het identiteitsdocument. |
| com.cleverbase.birthplace | OPTIONAL | String | Geboorteplaats van de eindgebruiker, zoals in het identiteitsdocument. |
| com.cleverbase.nationality | OPTIONAL | String | Nationaliteit van de eindgebruiker, zoals in het identiteitsdocument. |
| com.cleverbase.document.type | OPTIONAL | String | Het documenttype waarmee de eindgebruiker zich heeft geïdentificeerd. |
| com.cleverbase.id_number | OPTIONAL | String | Uniek nummer van het identiteitsdocument dat bij de registratie is gebruikt. |
| OPTIONAL | String | Het e-mailadres van voorkeur van de eindgebruiker. | |
| email_verified | OPTIONAL | Boolean | True als het e-mailadres van de eindgebruiker geverifieerd is. |
| com.cleverbase.nl_brp_voornaam | OPTIONAL | String | Voornaam volgens de regels van de BRP. |
| com.cleverbase.nl_brp_voorvoegsel | OPTIONAL | String | Voorvoegsel volgens de regels van de BRP. |
| com.cleverbase.nl_brp_geslachtsnaam | OPTIONAL | String | Geslachtsnaam volgens de regels van de BRP. |
| com.cleverbase.nl_brp_geslachtsnaam_zonder_voorvoegsel | OPTIONAL | String | Geslachtsnaam zonder voorvoegsel, volgens de regels van de BRP. |
| com.cleverbase.id_document_issuance_date | OPTIONAL | String | Datum van afgifte van het identiteitsdocument. |
| com.cleverbase.id_document_issuance_place | OPTIONAL | String | Plaats van afgifte van het identiteitsdocument. |
| com.cleverbase.id_document_expiration_date | OPTIONAL | String | Vervaldatum van het identiteitsdocument, als ISO 8601-datum (YYYY-MM-DD). |
| aud | REQUIRED | String | Audience: voor wie of wat het token bedoeld is |
| auth_time | REQUIRED | Int | Het moment van authenticatie, als Unix-tijdstempel |
| iat | REQUIRED | Int | Het moment waarop het token is uitgegeven, als Unix-tijdstempel |
| iss | REQUIRED | String | Issuer: wie dit token heeft gemaakt en ondertekend |
| rat | REQUIRED | Int | Onbekend, als Unix-tijdstempel |
Voorbeeldverzoek
GET /userinfo HTTP/1.1
Authorization: Bearer 4/CKN69L8gdSYp5_pwH3XlFQZ3ndFhkXf9P2_TiHRG-bA
Content-Type: application/json
Voorbeeldantwoord
Voorbeeld wanneer het oorspronkelijke verzoek aan oauth2/authorize alleen de scope "openid" bevatte (dus alleen inloggen):
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
{
"aud": [
<client_id>
],
"auth_time": 1650458268,
"iat": 1650458274,
"iss": "https://esign.acc.cleverbase.com/",
"rat": 1650458253,
"sub": "bf70e2da-feff-4c6b-86c2-47eda199ab30"
}
Voorbeeld wanneer dat verzoek de scopes "openid email com.cleverbase.personal_info com.cleverbase.id_number" bevatte:
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
{
"aud": [
<client_id>
],
"auth_time": 1650459478,
"birthdate": "1990-12-22",
"com.cleverbase.birthplace": "Rome",
"com.cleverbase.document.type": "NLD_PASSPORT",
"com.cleverbase.id_number": "XWN75IM16",
"com.cleverbase.last_name": "De Bruijn",
"com.cleverbase.nationality": "NLD",
"email": "demo.acc.190422.102459@cleverbase.com",
"email_verified": true,
"given_name": "Willeke Liselotte",
"iat": 1650459485,
"iss": "https://esign.acc.cleverbase.com/",
"rat": 1650459462,
"sub": "bf70e2da-feff-4c6b-86c2-47eda199ab30"
}