diff --git a/.github/ISSUE_TEMPLATE/prepare-release.md b/.github/ISSUE_TEMPLATE/prepare-release.md
index 92b0df4807..67712c41e0 100644
--- a/.github/ISSUE_TEMPLATE/prepare-release.md
+++ b/.github/ISSUE_TEMPLATE/prepare-release.md
@@ -8,17 +8,32 @@ assignees: sergei-maertens
- [ ] Resolve release blockers
- [ ] ...
-- [ ] Re-generate VCR cassettes for API tests (see instructions on Taiga)
+- [ ] Re-generate VCR cassettes for API tests (see instructions on Taiga). You can find all test
+ cases with `grep OFVCRMixin -r src`
+
- [ ] Appoinments: Qmatic
- [ ] Suwinet
- - [ ] DigiD/eHerkenning (Signicat)
+ - DigiD/eHerkenning (Signicat)
+
+ - [ ] `openforms.authentication.contrib.digid.tests.test_signicat_integration`
+ - [ ] `openforms.authentication.contrib.eherkenning.tests.test_signicat_integration`
+
+ - OIDC based authentication flows
+
+ - [ ] `openforms.authentication.tests.test_oidc`
+ - [ ] `openforms.authentication.contrib.digid_eherkenning_oidc`
+ - [ ] `openforms.authentication.contrib.org_oidc`
+ - [ ] `openforms.authentication.contrib.org_oidc`
+ - [ ] `openforms.tests.test_registrator_prefill`
+
- [ ] Haal Centraal BRP Personen bevragen
- - [ ] `src.soap.tests.test_client`
+ - [ ] `soap.tests.test_client`
- [ ] BRK (Kadaster)
- [ ] KVK
- [ ] Ogone
- [ ] Objects API (registration)
- [ ] ZGW APIs (registration)
+
- [ ] Release new SDK version
- [ ] Correct SDK version pinned in `.sdk-release`
- [ ] Check translations
diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index 921b3c68e8..acdcee88e6 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -2,6 +2,39 @@
Changelog
=========
+2.7.0 "TBD" (2024-07-??)
+========================
+
+This release is in development, meaning it is not finished yet or suitable for
+production use.
+
+Upgrade notes
+-------------
+
+* ⚠️ The feature flag to disable backend validation is now removed, instances relying
+ on it should verify that their existing forms works with the validation enforced.
+
+* We're consolidating the OpenID Connect *Redirect URI* endpoints into a single
+ endpoint: ``/auth/oidc/callback/``. The legacy endpoints are still enabled (by default),
+ but scheduled for removal in Open Forms 3.0.
+
+ You can already opt-in to the new behaviour through three environment variables:
+
+ - ``USE_LEGACY_OIDC_ENDPOINTS=false``: admin login
+ - ``USE_LEGACY_DIGID_EH_OIDC_ENDPOINTS=false``: DigiD/eHerkenning plugins
+ - ``USE_LEGACY_ORG_OIDC_ENDPOINTS=false``: Organization OIDC plugin
+
+ Note that the OpenID applications need to be updated on the identity provider,
+ specifically the allowed "Redirect URIs" setting needs to be updated with the
+ following path replacements:
+
+ - ``/oidc/callback/`` -> ``/auth/oidc/callback/``
+ - ``/digid-oidc/callback/`` -> ``/auth/oidc/callback/``
+ - ``/eherkenning-oidc/callback/`` -> ``/auth/oidc/callback/``
+ - ``/digid-machtigen-oidc/callback/`` -> ``/auth/oidc/callback/``
+ - ``/eherkenning-bewindvoering-oidc/callback/`` -> ``/auth/oidc/callback/``
+ - ``/org-oidc/callback/`` -> ``/auth/oidc/callback/``
+
2.6.9 (2024-06-14)
==================
@@ -61,7 +94,6 @@ Note that 2.4.8 was never published to Docker Hub.
* [#4390] Fixed regression introduced by #4368 that would break template variables in
hyperlinks inside WYSIWYG content.
-
2.4.8 (2024-06-14)
==================
@@ -73,17 +105,6 @@ Bugfix release
* [#4362] Fixed a crash in the form designer when a textfield/textarea allows multiple
values in forms with translations enabled.
-2.7.0-alpha.1 (2024-XX-XX)
-==========================
-
-This is an alpha release, meaning it is not finished yet or suitable for production use.
-
-Upgrade notes
--------------
-
-* ⚠️ The feature flag to disable backend validation is now removed, instances relying
- on it should verify that their existing forms works with the validation enforced.
-
2.6.7 (2024-05-22)
==================
diff --git a/docker-compose.yml b/docker-compose.yml
index 18645efb85..627d1472b0 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -63,7 +63,6 @@ services:
- DB_HOST=db
- CACHE_DEFAULT=redis:6379/0
- CACHE_AXES=redis:6379/0
- - CACHE_OIDC=redis:6379/0
- CACHE_PORTALOCKER=redis:6379/0
- ALLOWED_HOSTS=*
- CELERY_BROKER_URL=redis://redis:6379/0
@@ -76,6 +75,11 @@ services:
# settings used by workers and beat containers.
- TZ=Europe/Amsterdam
- CSP_REPORT_ONLY=yes
+ # Legacy endpoints are deprecated, new installs should opt-out of using legacy
+ # settings (the default is to use legacy endpoints).
+ - USE_LEGACY_OIDC_ENDPOINTS=no
+ - USE_LEGACY_DIGID_EH_OIDC_ENDPOINTS=no
+ - USE_LEGACY_ORG_OIDC_ENDPOINTS=no
volumes: &web_volumes
- media:/app/media
- private_media:/app/private_media
diff --git a/docker/docker-compose.keycloak.yml b/docker/docker-compose.keycloak.yml
index ef88755e24..c8426bc57e 100644
--- a/docker/docker-compose.keycloak.yml
+++ b/docker/docker-compose.keycloak.yml
@@ -1,14 +1,25 @@
-version: '3.4'
+# Config taken from https://stackoverflow.com/a/77257732
+#
+# This docker-compose is for development and test purposes. Tests are recorded with
+# VCR against this instance.
+#
+# Log in to http://localhost:8080/admin/master/console/ with `admin`/`admin`
+# credentials.
+#
+# DO NOT USE THIS IN PRODUCTION.
+#
+
+version: '3.8'
services:
keycloak:
- image: jboss/keycloak
+ image: quay.io/keycloak/keycloak:23.0
+ command: start-dev --import-realm
environment:
- - KEYCLOAK_USER=demo
- - KEYCLOAK_PASSWORD=demo
- - KEYCLOAK_IMPORT=/realm.json
+ - KEYCLOAK_ADMIN=admin
+ - KEYCLOAK_ADMIN_PASSWORD=admin
volumes:
- - ./keycloak/fixtures/realm.json:/realm.json
+ - ./keycloak/import:/opt/keycloak/data/import
ports:
- 8080:8080
networks:
diff --git a/docker/keycloak/README.md b/docker/keycloak/README.md
index aab284c2d5..e769d2ae17 100644
--- a/docker/keycloak/README.md
+++ b/docker/keycloak/README.md
@@ -1,10 +1,10 @@
# Keycloak infrastructure
-Open Forms supports OpenID Connect as an authentication protocol. Keycloak is
-an example of an Identity Provider that supports OIDC.
+Open Forms supports OpenID Connect as an authentication protocol. Keycloak is an example of an
+Identity Provider that supports OIDC.
-We include a compose stack for development and CI purposes. This is **NOT** suitable
-for production usage.
+We include a compose stack for development and testing/CI purposes. This is **NOT** suitable for
+production usage.
## docker compose
@@ -14,34 +14,63 @@ Start a Keycloak instance in your local environment from the parent directory:
docker compose -f docker-compose.keycloak.yml up -d
```
-This brings up Keycloak, the admin interface is accessible at http://localhost:8080/.
-You can log in with `demo:demo`.
+This brings up Keycloak, the admin interface is accessible at http://localhost:8080/. You can now
+log in with the `admin`/`admin` credentials.
-In order to allow access to Keycloak via the same hostname via the Open Forms backend
-container and the browser, add the following entry to your `/etc/hosts` file:
+In order to allow access to Keycloak via the same hostname via the Open Forms backend container and
+the browser, add the following entry to your `/etc/hosts` file:
```
127.0.0.1 keycloak.open-forms.local
```
+## Testing
-## Load fixtures
+This realm is used in the integration tests. We re-record the network traffic periodically (using
+VCR.py). The primary reason this setup exists, is for automated testing reasons.
-Before the DigiD login via OIDC can be tested, a fixture needs to be loaded.
-Assuming the docker containers specified in `docker-compose.yml` in the root directory
-are running, run the following commands:
+### Test data
-```bash
-cat docker/keycloak/fixtures/oidc.json | docker-compose exec web src/manage.py loaddata --format=json -
-```
+**Clients**
+
+- Client ID: `test-userinfo-jwt`, secret `ktGlGUELd1FR7dTXc84L7dJzUTjCtw9S`
+
+ Configured to return the user info as a JWT rather than JSON response.
+
+- Client ID: `testid`, secret: `7DB3KUAAizYCcmZufpHRVOcD0TOkNO3I`
+
+**Users**
+
+- `testuser` / `testuser`, has the `bsn`, `kvk`, `name_qualifier`, `legalSubjectID` and
+ `actingSubjectID` attributes (authentication plugins: DigiD, eHerkenning)
+- `digid-machtigen` / `digid-machtigen`, has the `aanvrager.bsn`, `gemachtigde.bsn` and
+ `service_id` attributes (for DigiD machtigen)
+- `eherkenning-bewindvoering` / `eherkenning-bewindvoering`, has the `legalSubjectID`
+ (kvk), `actingSubjectID` (pseudo ID), `representeeBSN`, `service_id`, `service_uuid`,
+ and `name_qualifier` attributes (for eHerkenning bewindvoering)
+- `admin` / `admin`, intended to create as django user (can be made staff). The email
+ address is `admin@example.com`.
-This loads an example form configured to use DigiD via OIDC for authentication and
-it loads a configuration to connect to our Keycloak instance.
+## Exporting the Realm
-## Test login flow
+In short - exporting through the admin UI (rightfully) obfuscates client secrets and user
+credentials. However, for reproducible builds/environments, we want to include this data in the
+Realm export.
-To test the login flow, navigate to `http://127.0.0.1:8000/digid-oidc/`
-(not `localhost`, because this domain is not on the allowlist in the Keycloak config).
+Ensure the service is up and running through docker-compose.
-Click `Inloggen met DigiD` and fill in `testuser` for both username and password
-in the Keycloak login screen. If everything succeeded, you are now redirected back to the form.
+Ensure that UID `1000` can write to `./keycloak/import/`:
+
+```bash
+chmod o+rwx ./keycloak/import/
+```
+
+Then open another terminal and run:
+
+```bash
+docker-compose -f docker-compose.keycloak.yml exec keycloak \
+ /opt/keycloak/bin/kc.sh \
+ export \
+ --file /opt/keycloak/data/import/test-realm.json \
+ --realm test
+```
diff --git a/docker/keycloak/fixtures/oidc.json b/docker/keycloak/fixtures/oidc.json
deleted file mode 100644
index 376392f0c9..0000000000
--- a/docker/keycloak/fixtures/oidc.json
+++ /dev/null
@@ -1,377 +0,0 @@
-[
- {
- "model": "digid_eherkenning_oidc_generics.openidconnectpublicconfig",
- "pk": 1,
- "fields": {
- "enabled": true,
- "identifier_claim_name": "bsn",
- "oidc_rp_client_id": "testid_public",
- "oidc_rp_client_secret": "23a12032-e080-4f65-b733-ad2567ec1605",
- "oidc_rp_sign_algo": "RS256",
- "oidc_rp_scopes_list": "[\"openid\", \"bsn\"]",
- "oidc_op_discovery_endpoint": "http://keycloak.open-forms.local:8080/auth/realms/test/",
- "oidc_op_jwks_endpoint": "http://keycloak.open-forms.local:8080/auth/realms/test/protocol/openid-connect/certs",
- "oidc_op_authorization_endpoint": "http://keycloak.open-forms.local:8080/auth/realms/test/protocol/openid-connect/auth",
- "oidc_op_token_endpoint": "http://keycloak.open-forms.local:8080/auth/realms/test/protocol/openid-connect/token",
- "oidc_op_user_endpoint": "http://keycloak.open-forms.local:8080/auth/realms/test/protocol/openid-connect/userinfo",
- "oidc_op_logout_endpoint": "http://keycloak.open-forms.local:8080/auth/realms/test/protocol/openid-connect/logout",
- "oidc_rp_idp_sign_key": "",
- "oidc_keycloak_idp_hint": ""
- }
- },
- {
- "model": "digid_eherkenning_oidc_generics.openidconnecteherkenningconfig",
- "pk": 1,
- "fields": {
- "enabled": true,
- "identifier_claim_name": "kvk",
- "oidc_rp_client_id": "testid_public",
- "oidc_rp_client_secret": "23a12032-e080-4f65-b733-ad2567ec1605",
- "oidc_rp_sign_algo": "RS256",
- "oidc_rp_scopes_list": "[\"openid\", \"kvk\"]",
- "oidc_op_discovery_endpoint": "http://keycloak.open-forms.local:8080/auth/realms/test/",
- "oidc_op_jwks_endpoint": "http://keycloak.open-forms.local:8080/auth/realms/test/protocol/openid-connect/certs",
- "oidc_op_authorization_endpoint": "http://keycloak.open-forms.local:8080/auth/realms/test/protocol/openid-connect/auth",
- "oidc_op_token_endpoint": "http://keycloak.open-forms.local:8080/auth/realms/test/protocol/openid-connect/token",
- "oidc_op_user_endpoint": "http://keycloak.open-forms.local:8080/auth/realms/test/protocol/openid-connect/userinfo",
- "oidc_op_logout_endpoint": "http://keycloak.open-forms.local:8080/auth/realms/test/protocol/openid-connect/logout",
- "oidc_rp_idp_sign_key": "",
- "oidc_keycloak_idp_hint": ""
- }
- },
- {
- "model": "mozilla_django_oidc_db.openidconnectconfig",
- "pk": 1,
- "fields": {
- "enabled": true,
- "oidc_rp_client_id": "testid",
- "oidc_rp_client_secret": "23a12032-e080-4f65-b733-ad2567ec1605",
- "oidc_rp_sign_algo": "RS256",
- "oidc_rp_scopes_list": "[\"openid\", \"email\", \"profile\"]",
- "oidc_op_discovery_endpoint": "http://keycloak.open-forms.local:8080/auth/realms/test/",
- "oidc_op_jwks_endpoint": "http://keycloak.open-forms.local:8080/auth/realms/test/protocol/openid-connect/certs",
- "oidc_op_authorization_endpoint": "http://keycloak.open-forms.local:8080/auth/realms/test/protocol/openid-connect/auth",
- "oidc_op_token_endpoint": "http://keycloak.open-forms.local:8080/auth/realms/test/protocol/openid-connect/token",
- "oidc_op_user_endpoint": "http://keycloak.open-forms.local:8080/auth/realms/test/protocol/openid-connect/userinfo",
- "oidc_rp_idp_sign_key": "",
- "username_claim": "sub",
- "claim_mapping": {
- "email": "email",
- "last_name": "family_name",
- "first_name": "given_name"
- },
- "groups_claim": "roles",
- "sync_groups": true,
- "sync_groups_glob_pattern": "*",
- "make_users_staff": true
- }
- },
- {
- "model": "forms.form",
- "pk": 1,
- "fields": {
- "uuid": "3ea9541f-f863-445d-ba89-a0d089578c3b",
- "name": "Digid via OIDC",
- "internal_name": "",
- "slug": "digid-oidc",
- "product": null,
- "registration_backend": "",
- "registration_backend_options": {},
- "payment_backend": "",
- "payment_backend_options": {},
- "authentication_backends": "[\"digid_oidc\"]",
- "submission_confirmation_template": "",
- "submission_allowed": "yes",
- "show_progress_indicator": true,
- "confirmation_email_option": "global_email",
- "begin_text": "",
- "previous_text": "",
- "change_text": "",
- "confirm_text": "",
- "explanation_template": "",
- "active": true,
- "maintenance_mode": false,
- "_is_deleted": false,
- "successful_submissions_removal_limit": null,
- "successful_submissions_removal_method": "",
- "incomplete_submissions_removal_limit": null,
- "incomplete_submissions_removal_method": "",
- "errored_submissions_removal_limit": null,
- "errored_submissions_removal_method": "",
- "all_submissions_removal_limit": null
- }
- },
- {
- "model": "forms.formdefinition",
- "pk": 1,
- "fields": {
- "uuid": "5f28e130-e5c3-4a3a-abe3-2f51e88b8e2a",
- "name": "Stap 1",
- "internal_name": "",
- "slug": "oidc-step1",
- "configuration": {
- "display": "form",
- "components": [
- {
- "id": "eki8hix",
- "key": "textField",
- "mask": false,
- "type": "textfield",
- "input": true,
- "label": "Text Field",
- "hidden": false,
- "prefix": "",
- "suffix": "",
- "unique": false,
- "widget": {
- "type": "input"
- },
- "dbIndex": false,
- "overlay": {
- "top": "",
- "left": "",
- "style": "",
- "width": "",
- "height": ""
- },
- "prefill": {
- "plugin": "",
- "attribute": ""
- },
- "tooltip": "",
- "disabled": false,
- "multiple": false,
- "redrawOn": "",
- "tabindex": "",
- "validate": {
- "custom": "",
- "unique": false,
- "pattern": "",
- "plugins": [],
- "multiple": false,
- "required": false,
- "maxLength": "",
- "minLength": "",
- "customPrivate": false,
- "strictDateValidation": false
- },
- "autofocus": false,
- "encrypted": false,
- "hideLabel": false,
- "inputMask": "",
- "inputType": "text",
- "modalEdit": false,
- "protected": false,
- "refreshOn": "",
- "tableView": true,
- "attributes": {},
- "deriveCity": false,
- "errorLabel": "",
- "persistent": true,
- "properties": {},
- "spellcheck": true,
- "validateOn": "change",
- "clearOnHide": true,
- "conditional": {
- "eq": "",
- "show": null,
- "when": null
- },
- "customClass": "",
- "description": "",
- "inputFormat": "plain",
- "placeholder": "",
- "showInEmail": false,
- "defaultValue": null,
- "registration": {
- "attribute": ""
- },
- "dataGridLabel": false,
- "labelPosition": "top",
- "showCharCount": false,
- "showWordCount": false,
- "calculateValue": "",
- "derivePostcode": "",
- "calculateServer": false,
- "isSensitiveData": false,
- "deriveStreetName": false,
- "deriveHouseNumber": "",
- "allowMultipleMasks": false,
- "customDefaultValue": "",
- "allowCalculateOverride": false
- }
- ]
- },
- "login_required": true,
- "is_reusable": false
- }
- },
- {
- "model": "forms.formstep",
- "pk": 1,
- "fields": {
- "order": 0,
- "uuid": "1c8ef0a8-2353-4e86-828b-5c02d7766d13",
- "form": 1,
- "form_definition": 1,
- "optional": false,
- "previous_text": "",
- "save_text": "",
- "next_text": ""
- }
- },
- {
- "model": "forms.form",
- "pk": 2,
- "fields": {
- "uuid": "5344e0fe-ab54-49e6-8942-bdafc4ca423d",
- "name": "eHerkenning via OIDC",
- "internal_name": "",
- "slug": "eherkenning-oidc",
- "product": null,
- "registration_backend": "",
- "registration_backend_options": {},
- "payment_backend": "",
- "payment_backend_options": {},
- "authentication_backends": "[\"eherkenning_oidc\"]",
- "submission_confirmation_template": "",
- "submission_allowed": "yes",
- "show_progress_indicator": true,
- "confirmation_email_option": "global_email",
- "begin_text": "",
- "previous_text": "",
- "change_text": "",
- "confirm_text": "",
- "explanation_template": "",
- "active": true,
- "maintenance_mode": false,
- "_is_deleted": false,
- "successful_submissions_removal_limit": null,
- "successful_submissions_removal_method": "",
- "incomplete_submissions_removal_limit": null,
- "incomplete_submissions_removal_method": "",
- "errored_submissions_removal_limit": null,
- "errored_submissions_removal_method": "",
- "all_submissions_removal_limit": null
- }
- },
- {
- "model": "forms.formdefinition",
- "pk": 2,
- "fields": {
- "uuid": "adee513d-6ea9-4497-b501-c10db7eebd10",
- "name": "Stap 1",
- "internal_name": "",
- "slug": "eherkenning-oidc-step1",
- "configuration": {
- "display": "form",
- "components": [
- {
- "id": "sdw2jdf",
- "key": "textField",
- "mask": false,
- "type": "textfield",
- "input": true,
- "label": "Text Field",
- "hidden": false,
- "prefix": "",
- "suffix": "",
- "unique": false,
- "widget": {
- "type": "input"
- },
- "dbIndex": false,
- "overlay": {
- "top": "",
- "left": "",
- "style": "",
- "width": "",
- "height": ""
- },
- "prefill": {
- "plugin": "",
- "attribute": ""
- },
- "tooltip": "",
- "disabled": false,
- "multiple": false,
- "redrawOn": "",
- "tabindex": "",
- "validate": {
- "custom": "",
- "unique": false,
- "pattern": "",
- "plugins": [],
- "multiple": false,
- "required": false,
- "maxLength": "",
- "minLength": "",
- "customPrivate": false,
- "strictDateValidation": false
- },
- "autofocus": false,
- "encrypted": false,
- "hideLabel": false,
- "inputMask": "",
- "inputType": "text",
- "modalEdit": false,
- "protected": false,
- "refreshOn": "",
- "tableView": true,
- "attributes": {},
- "deriveCity": false,
- "errorLabel": "",
- "persistent": true,
- "properties": {},
- "spellcheck": true,
- "validateOn": "change",
- "clearOnHide": true,
- "conditional": {
- "eq": "",
- "show": null,
- "when": null
- },
- "customClass": "",
- "description": "",
- "inputFormat": "plain",
- "placeholder": "",
- "showInEmail": false,
- "defaultValue": null,
- "registration": {
- "attribute": ""
- },
- "dataGridLabel": false,
- "labelPosition": "top",
- "showCharCount": false,
- "showWordCount": false,
- "calculateValue": "",
- "derivePostcode": "",
- "calculateServer": false,
- "isSensitiveData": false,
- "deriveStreetName": false,
- "deriveHouseNumber": "",
- "allowMultipleMasks": false,
- "customDefaultValue": "",
- "allowCalculateOverride": false
- }
- ]
- },
- "login_required": true,
- "is_reusable": false
- }
- },
- {
- "model": "forms.formstep",
- "pk": 2,
- "fields": {
- "order": 0,
- "uuid": "65ce6093-0a85-48a1-807f-8f5eb3981399",
- "form": 2,
- "form_definition": 2,
- "optional": false,
- "previous_text": "",
- "save_text": "",
- "next_text": ""
- }
- }
-]
diff --git a/docker/keycloak/fixtures/realm.json b/docker/keycloak/fixtures/realm.json
deleted file mode 100644
index f5cab7ec01..0000000000
--- a/docker/keycloak/fixtures/realm.json
+++ /dev/null
@@ -1,2680 +0,0 @@
-{
- "id": "test",
- "realm": "test",
- "displayName": "Keycloak",
- "displayNameHtml": "
Keycloak
",
- "notBefore": 0,
- "defaultSignatureAlgorithm": "RS256",
- "revokeRefreshToken": false,
- "refreshTokenMaxReuse": 0,
- "accessTokenLifespan": 60,
- "accessTokenLifespanForImplicitFlow": 900,
- "ssoSessionIdleTimeout": 1800,
- "ssoSessionMaxLifespan": 36000,
- "ssoSessionIdleTimeoutRememberMe": 0,
- "ssoSessionMaxLifespanRememberMe": 0,
- "offlineSessionIdleTimeout": 2592000,
- "offlineSessionMaxLifespanEnabled": false,
- "offlineSessionMaxLifespan": 5184000,
- "clientSessionIdleTimeout": 0,
- "clientSessionMaxLifespan": 0,
- "clientOfflineSessionIdleTimeout": 0,
- "clientOfflineSessionMaxLifespan": 0,
- "accessCodeLifespan": 60,
- "accessCodeLifespanUserAction": 300,
- "accessCodeLifespanLogin": 1800,
- "actionTokenGeneratedByAdminLifespan": 43200,
- "actionTokenGeneratedByUserLifespan": 300,
- "oauth2DeviceCodeLifespan": 600,
- "oauth2DevicePollingInterval": 600,
- "enabled": true,
- "sslRequired": "external",
- "registrationAllowed": false,
- "registrationEmailAsUsername": false,
- "rememberMe": false,
- "verifyEmail": false,
- "loginWithEmailAllowed": true,
- "duplicateEmailsAllowed": false,
- "resetPasswordAllowed": false,
- "editUsernameAllowed": false,
- "bruteForceProtected": false,
- "permanentLockout": false,
- "maxFailureWaitSeconds": 900,
- "minimumQuickLoginWaitSeconds": 60,
- "waitIncrementSeconds": 60,
- "quickLoginCheckMilliSeconds": 1000,
- "maxDeltaTimeSeconds": 43200,
- "failureFactor": 30,
- "roles": {
- "realm": [
- {
- "id": "0a58bc72-3b61-446d-9686-680dac2d7837",
- "name": "bsn_role",
- "composite": false,
- "clientRole": false,
- "containerId": "test",
- "attributes": {
- "bsn": [
- "000000000"
- ]
- }
- },
- {
- "id": "136f9153-1b58-4925-a8d9-6cd3b5b14460",
- "name": "offline_access",
- "description": "${role_offline-access}",
- "composite": false,
- "clientRole": false,
- "containerId": "test",
- "attributes": {}
- },
- {
- "id": "dfb35e47-58b6-4080-a666-e3855f80dae0",
- "name": "uma_authorization",
- "description": "${role_uma_authorization}",
- "composite": false,
- "clientRole": false,
- "containerId": "test",
- "attributes": {}
- },
- {
- "id": "0b34dd0e-fba9-48a1-a139-6400f32d1361",
- "name": "default-roles-master",
- "description": "${role_default-roles}",
- "composite": true,
- "composites": {
- "realm": [
- "offline_access",
- "uma_authorization"
- ],
- "client": {
- "account": [
- "manage-account",
- "view-profile"
- ]
- }
- },
- "clientRole": false,
- "containerId": "test",
- "attributes": {}
- },
- {
- "id": "2815411c-85c2-494c-b0dd-7ba1765c20eb",
- "name": "admin",
- "description": "${role_admin}",
- "composite": true,
- "composites": {
- "realm": [
- "create-realm"
- ],
- "client": {
- "master-realm": [
- "view-realm",
- "manage-authorization",
- "query-clients",
- "view-clients",
- "manage-users",
- "impersonation",
- "view-authorization",
- "manage-events",
- "query-realms",
- "view-users",
- "manage-clients",
- "view-identity-providers",
- "manage-identity-providers",
- "query-groups",
- "query-users",
- "create-client",
- "manage-realm",
- "view-events"
- ]
- }
- },
- "clientRole": false,
- "containerId": "test",
- "attributes": {}
- },
- {
- "id": "868ad5f4-6f71-48aa-a66b-baa9463e0384",
- "name": "create-realm",
- "description": "${role_create-realm}",
- "composite": false,
- "clientRole": false,
- "containerId": "test",
- "attributes": {}
- }
- ],
- "client": {
- "realm-management": [
- {
- "id": "2a00dbed-f906-45c7-944b-ac36c122a447",
- "name": "query-groups",
- "description": "${role_query-groups}",
- "composite": false,
- "clientRole": true,
- "containerId": "245fcb6a-6484-401c-97b1-ed1c9c4e383f",
- "attributes": {}
- },
- {
- "id": "cada1b50-0393-4671-a22f-4f64fdb6750f",
- "name": "manage-events",
- "description": "${role_manage-events}",
- "composite": false,
- "clientRole": true,
- "containerId": "245fcb6a-6484-401c-97b1-ed1c9c4e383f",
- "attributes": {}
- },
- {
- "id": "c84f8fc0-92ff-45b8-ae20-361153e027e3",
- "name": "manage-authorization",
- "description": "${role_manage-authorization}",
- "composite": false,
- "clientRole": true,
- "containerId": "245fcb6a-6484-401c-97b1-ed1c9c4e383f",
- "attributes": {}
- },
- {
- "id": "7438cf5c-c406-423e-a87c-282da2643a23",
- "name": "view-authorization",
- "description": "${role_view-authorization}",
- "composite": false,
- "clientRole": true,
- "containerId": "245fcb6a-6484-401c-97b1-ed1c9c4e383f",
- "attributes": {}
- },
- {
- "id": "a3ba4f3c-5a68-4546-9d0c-d347a01a0f80",
- "name": "view-users",
- "description": "${role_view-users}",
- "composite": true,
- "composites": {
- "client": {
- "realm-management": [
- "query-groups",
- "query-users"
- ]
- }
- },
- "clientRole": true,
- "containerId": "245fcb6a-6484-401c-97b1-ed1c9c4e383f",
- "attributes": {}
- },
- {
- "id": "f5af997b-0200-493c-833a-f29922393c36",
- "name": "manage-clients",
- "description": "${role_manage-clients}",
- "composite": false,
- "clientRole": true,
- "containerId": "245fcb6a-6484-401c-97b1-ed1c9c4e383f",
- "attributes": {}
- },
- {
- "id": "bb1ea04a-1455-436b-a9ce-a52ddf63080b",
- "name": "impersonation",
- "description": "${role_impersonation}",
- "composite": false,
- "clientRole": true,
- "containerId": "245fcb6a-6484-401c-97b1-ed1c9c4e383f",
- "attributes": {}
- },
- {
- "id": "73ecfaa2-7321-47d0-b0da-b502d63e8a38",
- "name": "view-identity-providers",
- "description": "${role_view-identity-providers}",
- "composite": false,
- "clientRole": true,
- "containerId": "245fcb6a-6484-401c-97b1-ed1c9c4e383f",
- "attributes": {}
- },
- {
- "id": "371d40bd-5c2d-4883-8f39-fee31929e8ff",
- "name": "view-clients",
- "description": "${role_view-clients}",
- "composite": true,
- "composites": {
- "client": {
- "realm-management": [
- "query-clients"
- ]
- }
- },
- "clientRole": true,
- "containerId": "245fcb6a-6484-401c-97b1-ed1c9c4e383f",
- "attributes": {}
- },
- {
- "id": "9806ccc3-9c5d-4cd4-8703-a3fb2578d33e",
- "name": "query-clients",
- "description": "${role_query-clients}",
- "composite": false,
- "clientRole": true,
- "containerId": "245fcb6a-6484-401c-97b1-ed1c9c4e383f",
- "attributes": {}
- },
- {
- "id": "4d15db11-54e1-440a-ada0-54eb2cfba916",
- "name": "query-realms",
- "description": "${role_query-realms}",
- "composite": false,
- "clientRole": true,
- "containerId": "245fcb6a-6484-401c-97b1-ed1c9c4e383f",
- "attributes": {}
- },
- {
- "id": "b0abae85-2f7a-41a1-9e94-6fcc1c0cffc9",
- "name": "view-realm",
- "description": "${role_view-realm}",
- "composite": false,
- "clientRole": true,
- "containerId": "245fcb6a-6484-401c-97b1-ed1c9c4e383f",
- "attributes": {}
- },
- {
- "id": "981a0138-1eb5-4bb0-9435-707d86e8ea15",
- "name": "manage-users",
- "description": "${role_manage-users}",
- "composite": false,
- "clientRole": true,
- "containerId": "245fcb6a-6484-401c-97b1-ed1c9c4e383f",
- "attributes": {}
- },
- {
- "id": "f20ca9de-e050-4db4-bc78-a7d594198371",
- "name": "manage-realm",
- "description": "${role_manage-realm}",
- "composite": false,
- "clientRole": true,
- "containerId": "245fcb6a-6484-401c-97b1-ed1c9c4e383f",
- "attributes": {}
- },
- {
- "id": "6f7ba22f-13b9-488b-bdc6-cf30bd69045c",
- "name": "realm-admin",
- "description": "${role_realm-admin}",
- "composite": true,
- "composites": {
- "client": {
- "realm-management": [
- "query-groups",
- "manage-events",
- "manage-authorization",
- "view-authorization",
- "view-users",
- "manage-clients",
- "impersonation",
- "view-identity-providers",
- "view-clients",
- "query-realms",
- "query-clients",
- "view-realm",
- "manage-users",
- "manage-realm",
- "view-events",
- "manage-identity-providers",
- "create-client",
- "query-users"
- ]
- }
- },
- "clientRole": true,
- "containerId": "245fcb6a-6484-401c-97b1-ed1c9c4e383f",
- "attributes": {}
- },
- {
- "id": "c82f77bf-ca5d-493b-937c-a1b95cfcc02c",
- "name": "view-events",
- "description": "${role_view-events}",
- "composite": false,
- "clientRole": true,
- "containerId": "245fcb6a-6484-401c-97b1-ed1c9c4e383f",
- "attributes": {}
- },
- {
- "id": "afe6ce5b-60ed-4cc3-a522-689f3356000d",
- "name": "manage-identity-providers",
- "description": "${role_manage-identity-providers}",
- "composite": false,
- "clientRole": true,
- "containerId": "245fcb6a-6484-401c-97b1-ed1c9c4e383f",
- "attributes": {}
- },
- {
- "id": "6b9787d5-1172-4c55-901b-24d1d8dc2211",
- "name": "create-client",
- "description": "${role_create-client}",
- "composite": false,
- "clientRole": true,
- "containerId": "245fcb6a-6484-401c-97b1-ed1c9c4e383f",
- "attributes": {}
- },
- {
- "id": "eadd571c-5634-4dbd-b8d3-9a3f41755c0b",
- "name": "query-users",
- "description": "${role_query-users}",
- "composite": false,
- "clientRole": true,
- "containerId": "245fcb6a-6484-401c-97b1-ed1c9c4e383f",
- "attributes": {}
- }
- ],
- "security-admin-console": [],
- "testid_public": [],
- "admin-cli": [],
- "testid": [],
- "account-console": [],
- "broker": [
- {
- "id": "7e86123e-f54c-4479-b61a-dab28c62cbd4",
- "name": "read-token",
- "description": "${role_read-token}",
- "composite": false,
- "clientRole": true,
- "containerId": "1a9e1f8f-3ab0-4df4-a94b-f7907a241edf",
- "attributes": {}
- }
- ],
- "master-realm": [
- {
- "id": "96ee1616-5a21-41f0-a6b3-ab9fca3211db",
- "name": "manage-authorization",
- "description": "${role_manage-authorization}",
- "composite": false,
- "clientRole": true,
- "containerId": "6eab5916-d431-4c7d-9bc5-9516e338da37",
- "attributes": {}
- },
- {
- "id": "43c2379c-939f-48ad-b911-fa4f81bcd05d",
- "name": "view-realm",
- "description": "${role_view-realm}",
- "composite": false,
- "clientRole": true,
- "containerId": "6eab5916-d431-4c7d-9bc5-9516e338da37",
- "attributes": {}
- },
- {
- "id": "2f3dc289-3f71-4cd0-abc6-71c130a5ecc4",
- "name": "query-clients",
- "description": "${role_query-clients}",
- "composite": false,
- "clientRole": true,
- "containerId": "6eab5916-d431-4c7d-9bc5-9516e338da37",
- "attributes": {}
- },
- {
- "id": "d67707ff-cfd2-48c8-8afd-9aa036328a1c",
- "name": "view-clients",
- "description": "${role_view-clients}",
- "composite": true,
- "composites": {
- "client": {
- "master-realm": [
- "query-clients"
- ]
- }
- },
- "clientRole": true,
- "containerId": "6eab5916-d431-4c7d-9bc5-9516e338da37",
- "attributes": {}
- },
- {
- "id": "dfb95d8e-c7f6-4946-a826-aeeb704c00a0",
- "name": "impersonation",
- "description": "${role_impersonation}",
- "composite": false,
- "clientRole": true,
- "containerId": "6eab5916-d431-4c7d-9bc5-9516e338da37",
- "attributes": {}
- },
- {
- "id": "0b5ce3df-1ada-4367-98c4-cfb49a2fb453",
- "name": "manage-users",
- "description": "${role_manage-users}",
- "composite": false,
- "clientRole": true,
- "containerId": "6eab5916-d431-4c7d-9bc5-9516e338da37",
- "attributes": {}
- },
- {
- "id": "09426dfa-97e4-4b2f-9ac4-1e4c257c7d40",
- "name": "view-authorization",
- "description": "${role_view-authorization}",
- "composite": false,
- "clientRole": true,
- "containerId": "6eab5916-d431-4c7d-9bc5-9516e338da37",
- "attributes": {}
- },
- {
- "id": "6a72e26e-18d8-4e7d-b2b9-0bdf4f4cf1b0",
- "name": "manage-events",
- "description": "${role_manage-events}",
- "composite": false,
- "clientRole": true,
- "containerId": "6eab5916-d431-4c7d-9bc5-9516e338da37",
- "attributes": {}
- },
- {
- "id": "2c0e9ccf-9f72-4c24-b47a-e223d0862725",
- "name": "query-realms",
- "description": "${role_query-realms}",
- "composite": false,
- "clientRole": true,
- "containerId": "6eab5916-d431-4c7d-9bc5-9516e338da37",
- "attributes": {}
- },
- {
- "id": "f26d3f41-90ed-4c6d-9165-76d7693fda37",
- "name": "view-users",
- "description": "${role_view-users}",
- "composite": true,
- "composites": {
- "client": {
- "master-realm": [
- "query-groups",
- "query-users"
- ]
- }
- },
- "clientRole": true,
- "containerId": "6eab5916-d431-4c7d-9bc5-9516e338da37",
- "attributes": {}
- },
- {
- "id": "86af1267-c64d-48c9-809b-240135e3d5a5",
- "name": "manage-clients",
- "description": "${role_manage-clients}",
- "composite": false,
- "clientRole": true,
- "containerId": "6eab5916-d431-4c7d-9bc5-9516e338da37",
- "attributes": {}
- },
- {
- "id": "e9694609-410b-4d4e-b784-e29a3caf14f5",
- "name": "manage-identity-providers",
- "description": "${role_manage-identity-providers}",
- "composite": false,
- "clientRole": true,
- "containerId": "6eab5916-d431-4c7d-9bc5-9516e338da37",
- "attributes": {}
- },
- {
- "id": "575d54ae-8947-44a6-9d3f-0e64f60cc6dc",
- "name": "view-identity-providers",
- "description": "${role_view-identity-providers}",
- "composite": false,
- "clientRole": true,
- "containerId": "6eab5916-d431-4c7d-9bc5-9516e338da37",
- "attributes": {}
- },
- {
- "id": "28a8f941-bb0f-4cfd-bc5e-40a5c3720fd6",
- "name": "query-groups",
- "description": "${role_query-groups}",
- "composite": false,
- "clientRole": true,
- "containerId": "6eab5916-d431-4c7d-9bc5-9516e338da37",
- "attributes": {}
- },
- {
- "id": "915a433b-6f77-4dc4-9dfe-d9939440db51",
- "name": "query-users",
- "description": "${role_query-users}",
- "composite": false,
- "clientRole": true,
- "containerId": "6eab5916-d431-4c7d-9bc5-9516e338da37",
- "attributes": {}
- },
- {
- "id": "9eb57526-c7da-4949-97d6-1bf168f5612b",
- "name": "create-client",
- "description": "${role_create-client}",
- "composite": false,
- "clientRole": true,
- "containerId": "6eab5916-d431-4c7d-9bc5-9516e338da37",
- "attributes": {}
- },
- {
- "id": "7d99c4d1-9f93-44ba-a735-b08c06a43a2c",
- "name": "manage-realm",
- "description": "${role_manage-realm}",
- "composite": false,
- "clientRole": true,
- "containerId": "6eab5916-d431-4c7d-9bc5-9516e338da37",
- "attributes": {}
- },
- {
- "id": "0a993f3b-96d2-4f41-a139-b03a1758e0eb",
- "name": "view-events",
- "description": "${role_view-events}",
- "composite": false,
- "clientRole": true,
- "containerId": "6eab5916-d431-4c7d-9bc5-9516e338da37",
- "attributes": {}
- }
- ],
- "account": [
- {
- "id": "004da97f-4333-41bd-bc60-7ea8c0a1e9ed",
- "name": "manage-account-links",
- "description": "${role_manage-account-links}",
- "composite": false,
- "clientRole": true,
- "containerId": "95d9ea1e-5614-405d-ab24-fa705bbd4088",
- "attributes": {}
- },
- {
- "id": "4aad4492-cf74-4a17-86b4-61e5ab7ed61f",
- "name": "view-applications",
- "description": "${role_view-applications}",
- "composite": false,
- "clientRole": true,
- "containerId": "95d9ea1e-5614-405d-ab24-fa705bbd4088",
- "attributes": {}
- },
- {
- "id": "680ca61c-ab20-49a8-ad6f-335b594b0ae1",
- "name": "manage-account",
- "description": "${role_manage-account}",
- "composite": true,
- "composites": {
- "client": {
- "account": [
- "manage-account-links"
- ]
- }
- },
- "clientRole": true,
- "containerId": "95d9ea1e-5614-405d-ab24-fa705bbd4088",
- "attributes": {}
- },
- {
- "id": "a0f0c00d-b4fc-49e5-9a62-3ca1f1ec6878",
- "name": "view-consent",
- "description": "${role_view-consent}",
- "composite": false,
- "clientRole": true,
- "containerId": "95d9ea1e-5614-405d-ab24-fa705bbd4088",
- "attributes": {}
- },
- {
- "id": "befbedad-59dd-49f6-b053-c6573e57d08b",
- "name": "manage-consent",
- "description": "${role_manage-consent}",
- "composite": true,
- "composites": {
- "client": {
- "account": [
- "view-consent"
- ]
- }
- },
- "clientRole": true,
- "containerId": "95d9ea1e-5614-405d-ab24-fa705bbd4088",
- "attributes": {}
- },
- {
- "id": "ae77a205-70f6-4d71-b07d-0c3c9d5c941a",
- "name": "delete-account",
- "description": "${role_delete-account}",
- "composite": false,
- "clientRole": true,
- "containerId": "95d9ea1e-5614-405d-ab24-fa705bbd4088",
- "attributes": {}
- },
- {
- "id": "ac7e6cdd-fe6e-4adc-9d90-59e385e96aab",
- "name": "view-profile",
- "description": "${role_view-profile}",
- "composite": false,
- "clientRole": true,
- "containerId": "95d9ea1e-5614-405d-ab24-fa705bbd4088",
- "attributes": {}
- }
- ]
- }
- },
- "groups": [],
- "defaultRole": {
- "id": "0b34dd0e-fba9-48a1-a139-6400f32d1361",
- "name": "default-roles-master",
- "description": "${role_default-roles}",
- "composite": true,
- "clientRole": false,
- "containerId": "test"
- },
- "requiredCredentials": [
- "password"
- ],
- "otpPolicyType": "totp",
- "otpPolicyAlgorithm": "HmacSHA1",
- "otpPolicyInitialCounter": 0,
- "otpPolicyDigits": 6,
- "otpPolicyLookAheadWindow": 1,
- "otpPolicyPeriod": 30,
- "otpSupportedApplications": [
- "FreeOTP",
- "Google Authenticator"
- ],
- "webAuthnPolicyRpEntityName": "keycloak",
- "webAuthnPolicySignatureAlgorithms": [
- "ES256"
- ],
- "webAuthnPolicyRpId": "",
- "webAuthnPolicyAttestationConveyancePreference": "not specified",
- "webAuthnPolicyAuthenticatorAttachment": "not specified",
- "webAuthnPolicyRequireResidentKey": "not specified",
- "webAuthnPolicyUserVerificationRequirement": "not specified",
- "webAuthnPolicyCreateTimeout": 0,
- "webAuthnPolicyAvoidSameAuthenticatorRegister": false,
- "webAuthnPolicyAcceptableAaguids": [],
- "webAuthnPolicyPasswordlessRpEntityName": "keycloak",
- "webAuthnPolicyPasswordlessSignatureAlgorithms": [
- "ES256"
- ],
- "webAuthnPolicyPasswordlessRpId": "",
- "webAuthnPolicyPasswordlessAttestationConveyancePreference": "not specified",
- "webAuthnPolicyPasswordlessAuthenticatorAttachment": "not specified",
- "webAuthnPolicyPasswordlessRequireResidentKey": "not specified",
- "webAuthnPolicyPasswordlessUserVerificationRequirement": "not specified",
- "webAuthnPolicyPasswordlessCreateTimeout": 0,
- "webAuthnPolicyPasswordlessAvoidSameAuthenticatorRegister": false,
- "webAuthnPolicyPasswordlessAcceptableAaguids": [],
- "users": [
- {
- "id": "d35f482f-0717-475e-9cc9-b02f18b24df9",
- "createdTimestamp": 1624867127533,
- "username": "service-account-testid",
- "enabled": true,
- "totp": false,
- "emailVerified": false,
- "serviceAccountClientId": "testid",
- "disableableCredentialTypes": [],
- "requiredActions": [],
- "realmRoles": [
- "default-roles-master"
- ],
- "notBefore": 0,
- "groups": []
- },
- {
- "id": "3e1b7b99-f368-41b9-8149-ef80d0e8c636",
- "createdTimestamp": 1624867127533,
- "username": "service-account-testid_public",
- "enabled": true,
- "totp": false,
- "emailVerified": false,
- "serviceAccountClientId": "testid_public",
- "disableableCredentialTypes": [],
- "requiredActions": [],
- "notBefore": 0,
- "groups": []
- },
- {
- "username": "testuser",
- "enabled": true,
- "attributes": {
- "bsn": [
- "000000000"
- ],
- "kvk": [
- "012345678"
- ]
- },
- "credentials": [
- {
- "type": "password",
- "value": "testuser"
- }
- ],
- "realmRoles": [],
- "groups": []
- }
- ],
- "scopeMappings": [
- {
- "clientScope": "offline_access",
- "roles": [
- "offline_access"
- ]
- }
- ],
- "clientScopeMappings": {
- "account": [
- {
- "client": "account-console",
- "roles": [
- "manage-account"
- ]
- }
- ]
- },
- "clients": [
- {
- "id": "95d9ea1e-5614-405d-ab24-fa705bbd4088",
- "clientId": "account",
- "name": "${client_account}",
- "rootUrl": "${authBaseUrl}",
- "baseUrl": "/realms/master/account/",
- "surrogateAuthRequired": false,
- "enabled": true,
- "alwaysDisplayInConsole": false,
- "clientAuthenticatorType": "client-secret",
- "redirectUris": [
- "/realms/master/account/*"
- ],
- "webOrigins": [],
- "notBefore": 0,
- "bearerOnly": false,
- "consentRequired": false,
- "standardFlowEnabled": true,
- "implicitFlowEnabled": false,
- "directAccessGrantsEnabled": false,
- "serviceAccountsEnabled": false,
- "publicClient": true,
- "frontchannelLogout": false,
- "protocol": "openid-connect",
- "attributes": {},
- "authenticationFlowBindingOverrides": {},
- "fullScopeAllowed": false,
- "nodeReRegistrationTimeout": 0,
- "defaultClientScopes": [
- "web-origins",
- "roles",
- "profile",
- "email"
- ],
- "optionalClientScopes": [
- "address",
- "phone",
- "offline_access",
- "microprofile-jwt"
- ]
- },
- {
- "id": "e369bc52-f2f5-4589-ae85-6edda9d65a30",
- "clientId": "account-console",
- "name": "${client_account-console}",
- "rootUrl": "${authBaseUrl}",
- "baseUrl": "/realms/master/account/",
- "surrogateAuthRequired": false,
- "enabled": true,
- "alwaysDisplayInConsole": false,
- "clientAuthenticatorType": "client-secret",
- "redirectUris": [
- "/realms/master/account/*"
- ],
- "webOrigins": [],
- "notBefore": 0,
- "bearerOnly": false,
- "consentRequired": false,
- "standardFlowEnabled": true,
- "implicitFlowEnabled": false,
- "directAccessGrantsEnabled": false,
- "serviceAccountsEnabled": false,
- "publicClient": true,
- "frontchannelLogout": false,
- "protocol": "openid-connect",
- "attributes": {
- "pkce.code.challenge.method": "S256"
- },
- "authenticationFlowBindingOverrides": {},
- "fullScopeAllowed": false,
- "nodeReRegistrationTimeout": 0,
- "protocolMappers": [
- {
- "id": "800daeff-beec-444f-87d7-4683fab13c6b",
- "name": "audience resolve",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-audience-resolve-mapper",
- "consentRequired": false,
- "config": {}
- }
- ],
- "defaultClientScopes": [
- "web-origins",
- "roles",
- "profile",
- "email"
- ],
- "optionalClientScopes": [
- "address",
- "phone",
- "offline_access",
- "microprofile-jwt"
- ]
- },
- {
- "id": "d19332b1-d21f-4386-93d6-786b00946d3a",
- "clientId": "admin-cli",
- "name": "${client_admin-cli}",
- "surrogateAuthRequired": false,
- "enabled": true,
- "alwaysDisplayInConsole": false,
- "clientAuthenticatorType": "client-secret",
- "redirectUris": [],
- "webOrigins": [],
- "notBefore": 0,
- "bearerOnly": false,
- "consentRequired": false,
- "standardFlowEnabled": false,
- "implicitFlowEnabled": false,
- "directAccessGrantsEnabled": true,
- "serviceAccountsEnabled": false,
- "publicClient": true,
- "frontchannelLogout": false,
- "protocol": "openid-connect",
- "attributes": {},
- "authenticationFlowBindingOverrides": {},
- "fullScopeAllowed": false,
- "nodeReRegistrationTimeout": 0,
- "defaultClientScopes": [
- "web-origins",
- "roles",
- "profile",
- "email"
- ],
- "optionalClientScopes": [
- "address",
- "phone",
- "offline_access",
- "microprofile-jwt"
- ]
- },
- {
- "id": "1a9e1f8f-3ab0-4df4-a94b-f7907a241edf",
- "clientId": "broker",
- "name": "${client_broker}",
- "surrogateAuthRequired": false,
- "enabled": true,
- "alwaysDisplayInConsole": false,
- "clientAuthenticatorType": "client-secret",
- "redirectUris": [],
- "webOrigins": [],
- "notBefore": 0,
- "bearerOnly": true,
- "consentRequired": false,
- "standardFlowEnabled": true,
- "implicitFlowEnabled": false,
- "directAccessGrantsEnabled": false,
- "serviceAccountsEnabled": false,
- "publicClient": false,
- "frontchannelLogout": false,
- "protocol": "openid-connect",
- "attributes": {},
- "authenticationFlowBindingOverrides": {},
- "fullScopeAllowed": false,
- "nodeReRegistrationTimeout": 0,
- "defaultClientScopes": [
- "web-origins",
- "roles",
- "profile",
- "email"
- ],
- "optionalClientScopes": [
- "address",
- "phone",
- "offline_access",
- "microprofile-jwt"
- ]
- },
- {
- "id": "6eab5916-d431-4c7d-9bc5-9516e338da37",
- "clientId": "master-realm",
- "name": "master Realm",
- "surrogateAuthRequired": false,
- "enabled": true,
- "alwaysDisplayInConsole": false,
- "clientAuthenticatorType": "client-secret",
- "redirectUris": [],
- "webOrigins": [],
- "notBefore": 0,
- "bearerOnly": true,
- "consentRequired": false,
- "standardFlowEnabled": true,
- "implicitFlowEnabled": false,
- "directAccessGrantsEnabled": false,
- "serviceAccountsEnabled": false,
- "publicClient": false,
- "frontchannelLogout": false,
- "protocol": "openid-connect",
- "attributes": {},
- "authenticationFlowBindingOverrides": {},
- "fullScopeAllowed": false,
- "nodeReRegistrationTimeout": 0,
- "defaultClientScopes": [
- "web-origins",
- "roles",
- "profile",
- "email"
- ],
- "optionalClientScopes": [
- "address",
- "phone",
- "offline_access",
- "microprofile-jwt"
- ]
- },
- {
- "id": "245fcb6a-6484-401c-97b1-ed1c9c4e383f",
- "clientId": "realm-management",
- "name": "${client_realm-management}",
- "surrogateAuthRequired": false,
- "enabled": true,
- "alwaysDisplayInConsole": false,
- "clientAuthenticatorType": "client-secret",
- "redirectUris": [],
- "webOrigins": [],
- "notBefore": 0,
- "bearerOnly": true,
- "consentRequired": false,
- "standardFlowEnabled": true,
- "implicitFlowEnabled": false,
- "directAccessGrantsEnabled": false,
- "serviceAccountsEnabled": false,
- "publicClient": false,
- "frontchannelLogout": false,
- "protocol": "openid-connect",
- "attributes": {},
- "authenticationFlowBindingOverrides": {},
- "fullScopeAllowed": false,
- "nodeReRegistrationTimeout": 0,
- "defaultClientScopes": [],
- "optionalClientScopes": []
- },
- {
- "id": "08fb476c-6150-43b3-a43b-2e5504e88e98",
- "clientId": "security-admin-console",
- "name": "${client_security-admin-console}",
- "rootUrl": "${authAdminUrl}",
- "baseUrl": "/admin/master/console/",
- "surrogateAuthRequired": false,
- "enabled": true,
- "alwaysDisplayInConsole": false,
- "clientAuthenticatorType": "client-secret",
- "redirectUris": [
- "/admin/master/console/*"
- ],
- "webOrigins": [
- "+"
- ],
- "notBefore": 0,
- "bearerOnly": false,
- "consentRequired": false,
- "standardFlowEnabled": true,
- "implicitFlowEnabled": false,
- "directAccessGrantsEnabled": false,
- "serviceAccountsEnabled": false,
- "publicClient": true,
- "frontchannelLogout": false,
- "protocol": "openid-connect",
- "attributes": {
- "pkce.code.challenge.method": "S256"
- },
- "authenticationFlowBindingOverrides": {},
- "fullScopeAllowed": false,
- "nodeReRegistrationTimeout": 0,
- "protocolMappers": [
- {
- "id": "0cb070a6-c2c3-4828-bd18-8b1e40791325",
- "name": "locale",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-usermodel-attribute-mapper",
- "consentRequired": false,
- "config": {
- "userinfo.token.claim": "true",
- "user.attribute": "locale",
- "id.token.claim": "true",
- "access.token.claim": "true",
- "claim.name": "locale",
- "jsonType.label": "String"
- }
- }
- ],
- "defaultClientScopes": [
- "web-origins",
- "roles",
- "profile",
- "email"
- ],
- "optionalClientScopes": [
- "address",
- "phone",
- "offline_access",
- "microprofile-jwt"
- ]
- },
- {
- "id": "34345dc9-af96-404f-9d24-9b40adc8cd0a",
- "clientId": "testid",
- "rootUrl": "http://127.0.0.1:8000",
- "adminUrl": "http://127.0.0.1:8000/oidc/connect",
- "surrogateAuthRequired": false,
- "enabled": true,
- "alwaysDisplayInConsole": false,
- "clientAuthenticatorType": "client-secret",
- "secret": "23a12032-e080-4f65-b733-ad2567ec1605",
- "redirectUris": [
- "http://localhost:8000/*",
- "http://127.0.0.1:8000/*"
- ],
- "webOrigins": [
- "http://127.0.0.1:8000"
- ],
- "notBefore": 0,
- "bearerOnly": false,
- "consentRequired": false,
- "standardFlowEnabled": true,
- "implicitFlowEnabled": false,
- "directAccessGrantsEnabled": true,
- "serviceAccountsEnabled": true,
- "publicClient": false,
- "frontchannelLogout": false,
- "protocol": "openid-connect",
- "attributes": {
- "id.token.as.detached.signature": "false",
- "saml.assertion.signature": "false",
- "saml.force.post.binding": "false",
- "saml.multivalued.roles": "false",
- "saml.encrypt": "false",
- "oauth2.device.authorization.grant.enabled": "false",
- "backchannel.logout.revoke.offline.tokens": "false",
- "saml.server.signature": "false",
- "saml.server.signature.keyinfo.ext": "false",
- "use.refresh.tokens": "true",
- "exclude.session.state.from.auth.response": "false",
- "oidc.ciba.grant.enabled": "false",
- "saml.artifact.binding": "false",
- "backchannel.logout.session.required": "true",
- "client_credentials.use_refresh_token": "false",
- "saml_force_name_id_format": "false",
- "saml.client.signature": "false",
- "tls.client.certificate.bound.access.tokens": "false",
- "saml.authnstatement": "false",
- "display.on.consent.screen": "false",
- "saml.onetimeuse.condition": "false"
- },
- "authenticationFlowBindingOverrides": {},
- "fullScopeAllowed": true,
- "nodeReRegistrationTimeout": -1,
- "protocolMappers": [
- {
- "id": "0ff0a187-8ff8-45ea-8803-bbc2308f806b",
- "name": "Client ID",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-usersessionmodel-note-mapper",
- "consentRequired": false,
- "config": {
- "user.session.note": "clientId",
- "userinfo.token.claim": "true",
- "id.token.claim": "true",
- "access.token.claim": "true",
- "claim.name": "clientId",
- "jsonType.label": "String"
- }
- },
- {
- "id": "7a3d9a9e-88ee-4b52-9d05-46e08ea4cf60",
- "name": "Client IP Address",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-usersessionmodel-note-mapper",
- "consentRequired": false,
- "config": {
- "user.session.note": "clientAddress",
- "userinfo.token.claim": "true",
- "id.token.claim": "true",
- "access.token.claim": "true",
- "claim.name": "clientAddress",
- "jsonType.label": "String"
- }
- },
- {
- "id": "55db54cf-3cd1-4846-91bb-27080ba78981",
- "name": "Client Host",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-usersessionmodel-note-mapper",
- "consentRequired": false,
- "config": {
- "user.session.note": "clientHost",
- "userinfo.token.claim": "true",
- "id.token.claim": "true",
- "access.token.claim": "true",
- "claim.name": "clientHost",
- "jsonType.label": "String"
- }
- }
- ],
- "defaultClientScopes": [
- "web-origins",
- "roles",
- "profile",
- "email"
- ],
- "optionalClientScopes": [
- "address",
- "phone",
- "offline_access",
- "microprofile-jwt"
- ]
- },
- {
- "id": "f9b0c49c-3e26-47fd-956b-1edf4038fb1f",
- "clientId": "testid_public",
- "rootUrl": "http://127.0.0.1:8000",
- "adminUrl": "http://127.0.0.1:8000/digid-oidc/connect",
- "surrogateAuthRequired": false,
- "enabled": true,
- "alwaysDisplayInConsole": false,
- "clientAuthenticatorType": "client-secret",
- "secret": "23a12032-e080-4f65-b733-ad2567ec1605",
- "redirectUris": [
- "http://localhost:8000/*",
- "http://127.0.0.1:8000/*"
- ],
- "webOrigins": [
- "http://127.0.0.1:8000"
- ],
- "notBefore": 0,
- "bearerOnly": false,
- "consentRequired": false,
- "standardFlowEnabled": true,
- "implicitFlowEnabled": false,
- "directAccessGrantsEnabled": true,
- "serviceAccountsEnabled": true,
- "publicClient": false,
- "frontchannelLogout": false,
- "protocol": "openid-connect",
- "attributes": {
- "id.token.as.detached.signature": "false",
- "saml.assertion.signature": "false",
- "saml.force.post.binding": "false",
- "saml.multivalued.roles": "false",
- "saml.encrypt": "false",
- "oauth2.device.authorization.grant.enabled": "false",
- "backchannel.logout.revoke.offline.tokens": "false",
- "saml.server.signature": "false",
- "saml.server.signature.keyinfo.ext": "false",
- "use.refresh.tokens": "true",
- "exclude.session.state.from.auth.response": "false",
- "oidc.ciba.grant.enabled": "false",
- "saml.artifact.binding": "false",
- "backchannel.logout.session.required": "true",
- "client_credentials.use_refresh_token": "false",
- "saml_force_name_id_format": "false",
- "saml.client.signature": "false",
- "tls.client.certificate.bound.access.tokens": "false",
- "saml.authnstatement": "false",
- "display.on.consent.screen": "false",
- "saml.onetimeuse.condition": "false"
- },
- "authenticationFlowBindingOverrides": {},
- "fullScopeAllowed": true,
- "nodeReRegistrationTimeout": -1,
- "protocolMappers": [
- {
- "id": "67f46369-2fbd-454c-a973-a85b4994c6c3",
- "name": "Client Host",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-usersessionmodel-note-mapper",
- "consentRequired": false,
- "config": {
- "user.session.note": "clientHost",
- "userinfo.token.claim": "true",
- "id.token.claim": "true",
- "access.token.claim": "true",
- "claim.name": "clientHost",
- "jsonType.label": "String"
- }
- },
- {
- "id": "70b51643-0cd4-4fd8-9263-2d8b16424506",
- "name": "Client IP Address",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-usersessionmodel-note-mapper",
- "consentRequired": false,
- "config": {
- "user.session.note": "clientAddress",
- "userinfo.token.claim": "true",
- "id.token.claim": "true",
- "access.token.claim": "true",
- "claim.name": "clientAddress",
- "jsonType.label": "String"
- }
- },
- {
- "id": "1b3787f7-8849-4d3c-b939-3f81a962cc17",
- "name": "Client ID",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-usersessionmodel-note-mapper",
- "consentRequired": false,
- "config": {
- "user.session.note": "clientId",
- "userinfo.token.claim": "true",
- "id.token.claim": "true",
- "access.token.claim": "true",
- "claim.name": "clientId",
- "jsonType.label": "String"
- }
- }
- ],
- "defaultClientScopes": [
- "web-origins",
- "roles",
- "profile",
- "bsn",
- "kvk",
- "email"
- ],
- "optionalClientScopes": [
- "address",
- "phone",
- "offline_access",
- "microprofile-jwt"
- ]
- }
- ],
- "clientScopes": [
- {
- "id": "37417998-812b-4b5f-844d-41fc3687dc99",
- "name": "email",
- "description": "OpenID Connect built-in scope: email",
- "protocol": "openid-connect",
- "attributes": {
- "include.in.token.scope": "true",
- "display.on.consent.screen": "true",
- "consent.screen.text": "${emailScopeConsentText}"
- },
- "protocolMappers": [
- {
- "id": "9db2b90e-d681-43d3-94b8-9be904bbddef",
- "name": "email verified",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-usermodel-property-mapper",
- "consentRequired": false,
- "config": {
- "userinfo.token.claim": "true",
- "user.attribute": "emailVerified",
- "id.token.claim": "true",
- "access.token.claim": "true",
- "claim.name": "email_verified",
- "jsonType.label": "boolean"
- }
- },
- {
- "id": "716c0fe5-aaa2-4b78-899f-06634b7075cd",
- "name": "email",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-usermodel-property-mapper",
- "consentRequired": false,
- "config": {
- "userinfo.token.claim": "true",
- "user.attribute": "email",
- "id.token.claim": "true",
- "access.token.claim": "true",
- "claim.name": "email",
- "jsonType.label": "String"
- }
- }
- ]
- },
- {
- "id": "0e2b1301-058e-4b8c-b45a-3136d8271ef9",
- "name": "roles",
- "description": "OpenID Connect scope for add user roles to the access token",
- "protocol": "openid-connect",
- "attributes": {
- "include.in.token.scope": "false",
- "display.on.consent.screen": "true",
- "consent.screen.text": "${rolesScopeConsentText}"
- },
- "protocolMappers": [
- {
- "id": "a165541d-1ae6-46ca-ab75-63ce49a7cb91",
- "name": "client roles",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-usermodel-client-role-mapper",
- "consentRequired": false,
- "config": {
- "user.attribute": "foo",
- "access.token.claim": "true",
- "claim.name": "resource_access.${client_id}.roles",
- "jsonType.label": "String",
- "multivalued": "true"
- }
- },
- {
- "id": "a91f862d-c949-4083-9987-cd77aeee5c5f",
- "name": "realm roles",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-usermodel-realm-role-mapper",
- "consentRequired": false,
- "config": {
- "user.attribute": "foo",
- "access.token.claim": "true",
- "claim.name": "realm_access.roles",
- "jsonType.label": "String",
- "multivalued": "true"
- }
- },
- {
- "id": "9a6cded0-dd1f-4083-bb19-bdf11eb339af",
- "name": "audience resolve",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-audience-resolve-mapper",
- "consentRequired": false,
- "config": {}
- }
- ]
- },
- {
- "id": "3bd6b791-56a1-4529-bfbd-cbd1c7fbb5a0",
- "name": "profile",
- "description": "OpenID Connect built-in scope: profile",
- "protocol": "openid-connect",
- "attributes": {
- "include.in.token.scope": "true",
- "display.on.consent.screen": "true",
- "consent.screen.text": "${profileScopeConsentText}"
- },
- "protocolMappers": [
- {
- "id": "57c9a639-c2aa-4ddd-a7e1-72be379873f4",
- "name": "picture",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-usermodel-attribute-mapper",
- "consentRequired": false,
- "config": {
- "userinfo.token.claim": "true",
- "user.attribute": "picture",
- "id.token.claim": "true",
- "access.token.claim": "true",
- "claim.name": "picture",
- "jsonType.label": "String"
- }
- },
- {
- "id": "e210a123-5fde-49a7-9ea4-ce6eee7a7be5",
- "name": "updated at",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-usermodel-attribute-mapper",
- "consentRequired": false,
- "config": {
- "userinfo.token.claim": "true",
- "user.attribute": "updatedAt",
- "id.token.claim": "true",
- "access.token.claim": "true",
- "claim.name": "updated_at",
- "jsonType.label": "String"
- }
- },
- {
- "id": "01466ea2-8cdd-49bc-ab14-15369d2909a7",
- "name": "profile",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-usermodel-attribute-mapper",
- "consentRequired": false,
- "config": {
- "userinfo.token.claim": "true",
- "user.attribute": "profile",
- "id.token.claim": "true",
- "access.token.claim": "true",
- "claim.name": "profile",
- "jsonType.label": "String"
- }
- },
- {
- "id": "87d08d97-095a-4cfd-a3ed-3db9da9650d3",
- "name": "full name",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-full-name-mapper",
- "consentRequired": false,
- "config": {
- "id.token.claim": "true",
- "access.token.claim": "true",
- "userinfo.token.claim": "true"
- }
- },
- {
- "id": "875850b9-6772-4304-9eed-52f671ee71c7",
- "name": "locale",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-usermodel-attribute-mapper",
- "consentRequired": false,
- "config": {
- "userinfo.token.claim": "true",
- "user.attribute": "locale",
- "id.token.claim": "true",
- "access.token.claim": "true",
- "claim.name": "locale",
- "jsonType.label": "String"
- }
- },
- {
- "id": "aa67db2e-be2e-456b-bea1-8bfa0536a8bb",
- "name": "birthdate",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-usermodel-attribute-mapper",
- "consentRequired": false,
- "config": {
- "userinfo.token.claim": "true",
- "user.attribute": "birthdate",
- "id.token.claim": "true",
- "access.token.claim": "true",
- "claim.name": "birthdate",
- "jsonType.label": "String"
- }
- },
- {
- "id": "fb4e5425-2561-43c8-b724-8c757e0f5dd7",
- "name": "given name",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-usermodel-property-mapper",
- "consentRequired": false,
- "config": {
- "userinfo.token.claim": "true",
- "user.attribute": "firstName",
- "id.token.claim": "true",
- "access.token.claim": "true",
- "claim.name": "given_name",
- "jsonType.label": "String"
- }
- },
- {
- "id": "04ccd4c8-c818-4536-9867-d36c18c8927a",
- "name": "middle name",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-usermodel-attribute-mapper",
- "consentRequired": false,
- "config": {
- "userinfo.token.claim": "true",
- "user.attribute": "middleName",
- "id.token.claim": "true",
- "access.token.claim": "true",
- "claim.name": "middle_name",
- "jsonType.label": "String"
- }
- },
- {
- "id": "ea264046-b77f-4960-ba07-c5111f972e61",
- "name": "username",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-usermodel-property-mapper",
- "consentRequired": false,
- "config": {
- "userinfo.token.claim": "true",
- "user.attribute": "username",
- "id.token.claim": "true",
- "access.token.claim": "true",
- "claim.name": "preferred_username",
- "jsonType.label": "String"
- }
- },
- {
- "id": "1c552d93-9e4f-46d2-ae7c-82c2bc41b00f",
- "name": "nickname",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-usermodel-attribute-mapper",
- "consentRequired": false,
- "config": {
- "userinfo.token.claim": "true",
- "user.attribute": "nickname",
- "id.token.claim": "true",
- "access.token.claim": "true",
- "claim.name": "nickname",
- "jsonType.label": "String"
- }
- },
- {
- "id": "e5373652-4aaf-4231-989f-d49add353a17",
- "name": "gender",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-usermodel-attribute-mapper",
- "consentRequired": false,
- "config": {
- "userinfo.token.claim": "true",
- "user.attribute": "gender",
- "id.token.claim": "true",
- "access.token.claim": "true",
- "claim.name": "gender",
- "jsonType.label": "String"
- }
- },
- {
- "id": "ce98d4b9-09ab-40f6-a798-7381f9c42c13",
- "name": "family name",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-usermodel-property-mapper",
- "consentRequired": false,
- "config": {
- "userinfo.token.claim": "true",
- "user.attribute": "lastName",
- "id.token.claim": "true",
- "access.token.claim": "true",
- "claim.name": "family_name",
- "jsonType.label": "String"
- }
- },
- {
- "id": "b27d0913-efc4-4a8a-b24b-d92370d7d07e",
- "name": "zoneinfo",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-usermodel-attribute-mapper",
- "consentRequired": false,
- "config": {
- "userinfo.token.claim": "true",
- "user.attribute": "zoneinfo",
- "id.token.claim": "true",
- "access.token.claim": "true",
- "claim.name": "zoneinfo",
- "jsonType.label": "String"
- }
- },
- {
- "id": "76451df0-06ef-4e91-993e-9f950b2f0925",
- "name": "website",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-usermodel-attribute-mapper",
- "consentRequired": false,
- "config": {
- "userinfo.token.claim": "true",
- "user.attribute": "website",
- "id.token.claim": "true",
- "access.token.claim": "true",
- "claim.name": "website",
- "jsonType.label": "String"
- }
- }
- ]
- },
- {
- "id": "2df5fd48-50fd-4433-b997-5786588e3976",
- "name": "offline_access",
- "description": "OpenID Connect built-in scope: offline_access",
- "protocol": "openid-connect",
- "attributes": {
- "consent.screen.text": "${offlineAccessScopeConsentText}",
- "display.on.consent.screen": "true"
- }
- },
- {
- "id": "bf1f2630-1990-48d7-bbe4-e7e3cd1f3850",
- "name": "microprofile-jwt",
- "description": "Microprofile - JWT built-in scope",
- "protocol": "openid-connect",
- "attributes": {
- "include.in.token.scope": "true",
- "display.on.consent.screen": "false"
- },
- "protocolMappers": [
- {
- "id": "bf3a3e65-2616-4b82-a9dd-665b74c038ee",
- "name": "upn",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-usermodel-property-mapper",
- "consentRequired": false,
- "config": {
- "userinfo.token.claim": "true",
- "user.attribute": "username",
- "id.token.claim": "true",
- "access.token.claim": "true",
- "claim.name": "upn",
- "jsonType.label": "String"
- }
- },
- {
- "id": "064c7bf7-4692-4a1d-bd2d-7cd3a6ec9634",
- "name": "groups",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-usermodel-realm-role-mapper",
- "consentRequired": false,
- "config": {
- "multivalued": "true",
- "userinfo.token.claim": "true",
- "user.attribute": "foo",
- "id.token.claim": "true",
- "access.token.claim": "true",
- "claim.name": "groups",
- "jsonType.label": "String"
- }
- }
- ]
- },
- {
- "id": "1d40dfd8-671e-484d-a322-25852822a251",
- "name": "bsn",
- "protocol": "openid-connect",
- "attributes": {
- "include.in.token.scope": "true",
- "display.on.consent.screen": "true"
- },
- "protocolMappers": [
- {
- "id": "4d62841a-f294-4286-aa2a-dab05a0a0fed",
- "name": "bsn",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-usermodel-attribute-mapper",
- "consentRequired": false,
- "config": {
- "user.attribute": "bsn",
- "id.token.claim": "true",
- "access.token.claim": "true",
- "claim.name": "bsn",
- "userinfo.token.claim": "true"
- }
- }
- ]
- },
- {
- "id": "ed28ea90-164d-4ff1-9faf-4ba349f08127",
- "name": "role_list",
- "description": "SAML role list",
- "protocol": "saml",
- "attributes": {
- "consent.screen.text": "${samlRoleListScopeConsentText}",
- "display.on.consent.screen": "true"
- },
- "protocolMappers": [
- {
- "id": "fc60ef39-3fc1-4b74-957a-55df0b831a68",
- "name": "role list",
- "protocol": "saml",
- "protocolMapper": "saml-role-list-mapper",
- "consentRequired": false,
- "config": {
- "single": "false",
- "attribute.nameformat": "Basic",
- "attribute.name": "Role"
- }
- }
- ]
- },
- {
- "id": "1d40dfd8-611e-484d-a322-25852822a251",
- "name": "kvk",
- "protocol": "openid-connect",
- "attributes": {
- "include.in.token.scope": "true",
- "display.on.consent.screen": "true"
- },
- "protocolMappers": [
- {
- "id": "4d62141a-f294-4286-aa2a-dab05a0a0fed",
- "name": "kvk",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-usermodel-attribute-mapper",
- "consentRequired": false,
- "config": {
- "user.attribute": "kvk",
- "id.token.claim": "true",
- "access.token.claim": "true",
- "claim.name": "kvk",
- "userinfo.token.claim": "true"
- }
- }
- ]
- },
- {
- "id": "ea6085b0-e2d8-4f17-8145-4d5537bc5cd7",
- "name": "address",
- "description": "OpenID Connect built-in scope: address",
- "protocol": "openid-connect",
- "attributes": {
- "include.in.token.scope": "true",
- "display.on.consent.screen": "true",
- "consent.screen.text": "${addressScopeConsentText}"
- },
- "protocolMappers": [
- {
- "id": "845444c7-18c3-42e7-8c74-93e007dd0fe2",
- "name": "address",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-address-mapper",
- "consentRequired": false,
- "config": {
- "user.attribute.formatted": "formatted",
- "user.attribute.country": "country",
- "user.attribute.postal_code": "postal_code",
- "userinfo.token.claim": "true",
- "user.attribute.street": "street",
- "id.token.claim": "true",
- "user.attribute.region": "region",
- "access.token.claim": "true",
- "user.attribute.locality": "locality"
- }
- }
- ]
- },
- {
- "id": "3bb4a654-e283-4184-bf05-d7b4010f2a1a",
- "name": "web-origins",
- "description": "OpenID Connect scope for add allowed web origins to the access token",
- "protocol": "openid-connect",
- "attributes": {
- "include.in.token.scope": "false",
- "display.on.consent.screen": "false",
- "consent.screen.text": ""
- },
- "protocolMappers": [
- {
- "id": "e0b8a1ee-5a77-49b6-8cf0-21520b1c23ca",
- "name": "allowed web origins",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-allowed-origins-mapper",
- "consentRequired": false,
- "config": {}
- }
- ]
- },
- {
- "id": "427929bf-edf0-4f3a-ae71-34276186f623",
- "name": "phone",
- "description": "OpenID Connect built-in scope: phone",
- "protocol": "openid-connect",
- "attributes": {
- "include.in.token.scope": "true",
- "display.on.consent.screen": "true",
- "consent.screen.text": "${phoneScopeConsentText}"
- },
- "protocolMappers": [
- {
- "id": "fdcf1a6a-c113-47b7-9cca-a84e6f14813a",
- "name": "phone number verified",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-usermodel-attribute-mapper",
- "consentRequired": false,
- "config": {
- "userinfo.token.claim": "true",
- "user.attribute": "phoneNumberVerified",
- "id.token.claim": "true",
- "access.token.claim": "true",
- "claim.name": "phone_number_verified",
- "jsonType.label": "boolean"
- }
- },
- {
- "id": "a447cc62-b731-47f9-9d6f-05325b89283b",
- "name": "phone number",
- "protocol": "openid-connect",
- "protocolMapper": "oidc-usermodel-attribute-mapper",
- "consentRequired": false,
- "config": {
- "userinfo.token.claim": "true",
- "user.attribute": "phoneNumber",
- "id.token.claim": "true",
- "access.token.claim": "true",
- "claim.name": "phone_number",
- "jsonType.label": "String"
- }
- }
- ]
- }
- ],
- "defaultDefaultClientScopes": [
- "roles",
- "email",
- "web-origins",
- "profile",
- "role_list"
- ],
- "defaultOptionalClientScopes": [
- "offline_access",
- "phone",
- "microprofile-jwt",
- "address"
- ],
- "browserSecurityHeaders": {
- "contentSecurityPolicyReportOnly": "",
- "xContentTypeOptions": "nosniff",
- "xRobotsTag": "none",
- "xFrameOptions": "SAMEORIGIN",
- "contentSecurityPolicy": "frame-src 'self'; frame-ancestors 'self'; object-src 'none';",
- "xXSSProtection": "1; mode=block",
- "strictTransportSecurity": "max-age=31536000; includeSubDomains"
- },
- "smtpServer": {},
- "eventsEnabled": false,
- "eventsListeners": [
- "jboss-logging"
- ],
- "enabledEventTypes": [],
- "adminEventsEnabled": false,
- "adminEventsDetailsEnabled": false,
- "identityProviders": [],
- "identityProviderMappers": [],
- "components": {
- "org.keycloak.services.clientregistration.policy.ClientRegistrationPolicy": [
- {
- "id": "8977dcfb-2206-4216-a274-ce00b88c1553",
- "name": "Allowed Client Scopes",
- "providerId": "allowed-client-templates",
- "subType": "authenticated",
- "subComponents": {},
- "config": {
- "allow-default-scopes": [
- "true"
- ]
- }
- },
- {
- "id": "19b1cffd-debb-4411-bd32-a62c06950b78",
- "name": "Consent Required",
- "providerId": "consent-required",
- "subType": "anonymous",
- "subComponents": {},
- "config": {}
- },
- {
- "id": "f7f43ebc-b362-4edf-8561-a2a76da62d0f",
- "name": "Allowed Protocol Mapper Types",
- "providerId": "allowed-protocol-mappers",
- "subType": "authenticated",
- "subComponents": {},
- "config": {
- "allowed-protocol-mapper-types": [
- "oidc-usermodel-property-mapper",
- "oidc-sha256-pairwise-sub-mapper",
- "saml-user-property-mapper",
- "saml-user-attribute-mapper",
- "oidc-address-mapper",
- "saml-role-list-mapper",
- "oidc-usermodel-attribute-mapper",
- "oidc-full-name-mapper"
- ]
- }
- },
- {
- "id": "e9385552-310b-43a4-9692-e34fe6e8c119",
- "name": "Full Scope Disabled",
- "providerId": "scope",
- "subType": "anonymous",
- "subComponents": {},
- "config": {}
- },
- {
- "id": "bcaf8044-0491-4b43-b3f2-cb2a72750d34",
- "name": "Allowed Client Scopes",
- "providerId": "allowed-client-templates",
- "subType": "anonymous",
- "subComponents": {},
- "config": {
- "allow-default-scopes": [
- "true"
- ]
- }
- },
- {
- "id": "778b4d6b-9b2b-4da3-b790-719dd93e57cf",
- "name": "Trusted Hosts",
- "providerId": "trusted-hosts",
- "subType": "anonymous",
- "subComponents": {},
- "config": {
- "host-sending-registration-request-must-match": [
- "true"
- ],
- "client-uris-must-match": [
- "true"
- ]
- }
- },
- {
- "id": "60b88614-4521-47cb-a944-7586dc9d91ff",
- "name": "Max Clients Limit",
- "providerId": "max-clients",
- "subType": "anonymous",
- "subComponents": {},
- "config": {
- "max-clients": [
- "200"
- ]
- }
- },
- {
- "id": "c1338f65-08a5-492b-a9fc-bbe38f73f5ca",
- "name": "Allowed Protocol Mapper Types",
- "providerId": "allowed-protocol-mappers",
- "subType": "anonymous",
- "subComponents": {},
- "config": {
- "allowed-protocol-mapper-types": [
- "oidc-usermodel-attribute-mapper",
- "oidc-sha256-pairwise-sub-mapper",
- "saml-role-list-mapper",
- "saml-user-property-mapper",
- "oidc-address-mapper",
- "saml-user-attribute-mapper",
- "oidc-usermodel-property-mapper",
- "oidc-full-name-mapper"
- ]
- }
- }
- ],
- "org.keycloak.keys.KeyProvider": [
- {
- "id": "5e8b1c64-f2f3-4e9a-b35b-9ac294561e63",
- "name": "rsa-generated",
- "providerId": "rsa-generated",
- "subComponents": {},
- "config": {
- "priority": [
- "100"
- ]
- }
- },
- {
- "id": "59f6c9f5-917a-4dcb-86b4-65483afe4965",
- "name": "hmac-generated",
- "providerId": "hmac-generated",
- "subComponents": {},
- "config": {
- "priority": [
- "100"
- ],
- "algorithm": [
- "HS256"
- ]
- }
- },
- {
- "id": "75866248-ab2f-4477-a1a1-6d201f5b3f6d",
- "name": "aes-generated",
- "providerId": "aes-generated",
- "subComponents": {},
- "config": {
- "priority": [
- "100"
- ]
- }
- }
- ]
- },
- "internationalizationEnabled": false,
- "supportedLocales": [],
- "authenticationFlows": [
- {
- "id": "c4442b16-2ff2-423f-ad5b-0fa17b425d96",
- "alias": "Account verification options",
- "description": "Method with which to verity the existing account",
- "providerId": "basic-flow",
- "topLevel": false,
- "builtIn": true,
- "authenticationExecutions": [
- {
- "authenticator": "idp-email-verification",
- "authenticatorFlow": false,
- "requirement": "ALTERNATIVE",
- "priority": 10,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- },
- {
- "authenticatorFlow": true,
- "requirement": "ALTERNATIVE",
- "priority": 20,
- "flowAlias": "Verify Existing Account by Re-authentication",
- "userSetupAllowed": false,
- "autheticatorFlow": true
- }
- ]
- },
- {
- "id": "5cc93375-b9c6-47e3-9eb7-c248a374dae6",
- "alias": "Authentication Options",
- "description": "Authentication options.",
- "providerId": "basic-flow",
- "topLevel": false,
- "builtIn": true,
- "authenticationExecutions": [
- {
- "authenticator": "basic-auth",
- "authenticatorFlow": false,
- "requirement": "REQUIRED",
- "priority": 10,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- },
- {
- "authenticator": "basic-auth-otp",
- "authenticatorFlow": false,
- "requirement": "DISABLED",
- "priority": 20,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- },
- {
- "authenticator": "auth-spnego",
- "authenticatorFlow": false,
- "requirement": "DISABLED",
- "priority": 30,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- }
- ]
- },
- {
- "id": "930178d8-3c25-480e-9d99-4370851af843",
- "alias": "Browser - Conditional OTP",
- "description": "Flow to determine if the OTP is required for the authentication",
- "providerId": "basic-flow",
- "topLevel": false,
- "builtIn": true,
- "authenticationExecutions": [
- {
- "authenticator": "conditional-user-configured",
- "authenticatorFlow": false,
- "requirement": "REQUIRED",
- "priority": 10,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- },
- {
- "authenticator": "auth-otp-form",
- "authenticatorFlow": false,
- "requirement": "REQUIRED",
- "priority": 20,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- }
- ]
- },
- {
- "id": "650c9131-d97c-45de-9fec-703590c5dea7",
- "alias": "Direct Grant - Conditional OTP",
- "description": "Flow to determine if the OTP is required for the authentication",
- "providerId": "basic-flow",
- "topLevel": false,
- "builtIn": true,
- "authenticationExecutions": [
- {
- "authenticator": "conditional-user-configured",
- "authenticatorFlow": false,
- "requirement": "REQUIRED",
- "priority": 10,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- },
- {
- "authenticator": "direct-grant-validate-otp",
- "authenticatorFlow": false,
- "requirement": "REQUIRED",
- "priority": 20,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- }
- ]
- },
- {
- "id": "2c8c1327-b0d9-444d-8232-1fa51dde4f9b",
- "alias": "First broker login - Conditional OTP",
- "description": "Flow to determine if the OTP is required for the authentication",
- "providerId": "basic-flow",
- "topLevel": false,
- "builtIn": true,
- "authenticationExecutions": [
- {
- "authenticator": "conditional-user-configured",
- "authenticatorFlow": false,
- "requirement": "REQUIRED",
- "priority": 10,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- },
- {
- "authenticator": "auth-otp-form",
- "authenticatorFlow": false,
- "requirement": "REQUIRED",
- "priority": 20,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- }
- ]
- },
- {
- "id": "4af88e1f-ccb0-4a7b-8ee0-b34e48566059",
- "alias": "Handle Existing Account",
- "description": "Handle what to do if there is existing account with same email/username like authenticated identity provider",
- "providerId": "basic-flow",
- "topLevel": false,
- "builtIn": true,
- "authenticationExecutions": [
- {
- "authenticator": "idp-confirm-link",
- "authenticatorFlow": false,
- "requirement": "REQUIRED",
- "priority": 10,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- },
- {
- "authenticatorFlow": true,
- "requirement": "REQUIRED",
- "priority": 20,
- "flowAlias": "Account verification options",
- "userSetupAllowed": false,
- "autheticatorFlow": true
- }
- ]
- },
- {
- "id": "b9bd0bef-cdff-4995-ac13-d900c29f7683",
- "alias": "Reset - Conditional OTP",
- "description": "Flow to determine if the OTP should be reset or not. Set to REQUIRED to force.",
- "providerId": "basic-flow",
- "topLevel": false,
- "builtIn": true,
- "authenticationExecutions": [
- {
- "authenticator": "conditional-user-configured",
- "authenticatorFlow": false,
- "requirement": "REQUIRED",
- "priority": 10,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- },
- {
- "authenticator": "reset-otp",
- "authenticatorFlow": false,
- "requirement": "REQUIRED",
- "priority": 20,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- }
- ]
- },
- {
- "id": "0817adee-9170-40a9-a690-6906f0ef7dad",
- "alias": "User creation or linking",
- "description": "Flow for the existing/non-existing user alternatives",
- "providerId": "basic-flow",
- "topLevel": false,
- "builtIn": true,
- "authenticationExecutions": [
- {
- "authenticatorConfig": "create unique user config",
- "authenticator": "idp-create-user-if-unique",
- "authenticatorFlow": false,
- "requirement": "ALTERNATIVE",
- "priority": 10,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- },
- {
- "authenticatorFlow": true,
- "requirement": "ALTERNATIVE",
- "priority": 20,
- "flowAlias": "Handle Existing Account",
- "userSetupAllowed": false,
- "autheticatorFlow": true
- }
- ]
- },
- {
- "id": "6d2e00ce-9a40-4e2b-989e-7bffce97c760",
- "alias": "Verify Existing Account by Re-authentication",
- "description": "Reauthentication of existing account",
- "providerId": "basic-flow",
- "topLevel": false,
- "builtIn": true,
- "authenticationExecutions": [
- {
- "authenticator": "idp-username-password-form",
- "authenticatorFlow": false,
- "requirement": "REQUIRED",
- "priority": 10,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- },
- {
- "authenticatorFlow": true,
- "requirement": "CONDITIONAL",
- "priority": 20,
- "flowAlias": "First broker login - Conditional OTP",
- "userSetupAllowed": false,
- "autheticatorFlow": true
- }
- ]
- },
- {
- "id": "dfca197a-4f38-4fa8-bc14-d9f5a4fc4585",
- "alias": "browser",
- "description": "browser based authentication",
- "providerId": "basic-flow",
- "topLevel": true,
- "builtIn": true,
- "authenticationExecutions": [
- {
- "authenticator": "auth-cookie",
- "authenticatorFlow": false,
- "requirement": "ALTERNATIVE",
- "priority": 10,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- },
- {
- "authenticator": "auth-spnego",
- "authenticatorFlow": false,
- "requirement": "DISABLED",
- "priority": 20,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- },
- {
- "authenticator": "identity-provider-redirector",
- "authenticatorFlow": false,
- "requirement": "ALTERNATIVE",
- "priority": 25,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- },
- {
- "authenticatorFlow": true,
- "requirement": "ALTERNATIVE",
- "priority": 30,
- "flowAlias": "forms",
- "userSetupAllowed": false,
- "autheticatorFlow": true
- }
- ]
- },
- {
- "id": "9d216f18-8227-4549-b975-028941902565",
- "alias": "clients",
- "description": "Base authentication for clients",
- "providerId": "client-flow",
- "topLevel": true,
- "builtIn": true,
- "authenticationExecutions": [
- {
- "authenticator": "client-secret",
- "authenticatorFlow": false,
- "requirement": "ALTERNATIVE",
- "priority": 10,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- },
- {
- "authenticator": "client-jwt",
- "authenticatorFlow": false,
- "requirement": "ALTERNATIVE",
- "priority": 20,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- },
- {
- "authenticator": "client-secret-jwt",
- "authenticatorFlow": false,
- "requirement": "ALTERNATIVE",
- "priority": 30,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- },
- {
- "authenticator": "client-x509",
- "authenticatorFlow": false,
- "requirement": "ALTERNATIVE",
- "priority": 40,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- }
- ]
- },
- {
- "id": "59656dfb-75a1-4932-8efc-55110dde6a2a",
- "alias": "direct grant",
- "description": "OpenID Connect Resource Owner Grant",
- "providerId": "basic-flow",
- "topLevel": true,
- "builtIn": true,
- "authenticationExecutions": [
- {
- "authenticator": "direct-grant-validate-username",
- "authenticatorFlow": false,
- "requirement": "REQUIRED",
- "priority": 10,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- },
- {
- "authenticator": "direct-grant-validate-password",
- "authenticatorFlow": false,
- "requirement": "REQUIRED",
- "priority": 20,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- },
- {
- "authenticatorFlow": true,
- "requirement": "CONDITIONAL",
- "priority": 30,
- "flowAlias": "Direct Grant - Conditional OTP",
- "userSetupAllowed": false,
- "autheticatorFlow": true
- }
- ]
- },
- {
- "id": "f9ee35b4-8d66-47aa-90fd-e1bd32bfbfe9",
- "alias": "docker auth",
- "description": "Used by Docker clients to authenticate against the IDP",
- "providerId": "basic-flow",
- "topLevel": true,
- "builtIn": true,
- "authenticationExecutions": [
- {
- "authenticator": "docker-http-basic-authenticator",
- "authenticatorFlow": false,
- "requirement": "REQUIRED",
- "priority": 10,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- }
- ]
- },
- {
- "id": "678ff104-d570-40ec-8a3d-a9aa8cdb2656",
- "alias": "first broker login",
- "description": "Actions taken after first broker login with identity provider account, which is not yet linked to any Keycloak account",
- "providerId": "basic-flow",
- "topLevel": true,
- "builtIn": true,
- "authenticationExecutions": [
- {
- "authenticatorConfig": "review profile config",
- "authenticator": "idp-review-profile",
- "authenticatorFlow": false,
- "requirement": "REQUIRED",
- "priority": 10,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- },
- {
- "authenticatorFlow": true,
- "requirement": "REQUIRED",
- "priority": 20,
- "flowAlias": "User creation or linking",
- "userSetupAllowed": false,
- "autheticatorFlow": true
- }
- ]
- },
- {
- "id": "81a95ef6-1840-4690-aa01-3966075fec3e",
- "alias": "forms",
- "description": "Username, password, otp and other auth forms.",
- "providerId": "basic-flow",
- "topLevel": false,
- "builtIn": true,
- "authenticationExecutions": [
- {
- "authenticator": "auth-username-password-form",
- "authenticatorFlow": false,
- "requirement": "REQUIRED",
- "priority": 10,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- },
- {
- "authenticatorFlow": true,
- "requirement": "CONDITIONAL",
- "priority": 20,
- "flowAlias": "Browser - Conditional OTP",
- "userSetupAllowed": false,
- "autheticatorFlow": true
- }
- ]
- },
- {
- "id": "21a3f527-5ee0-4e0f-923b-d61e3eddfe31",
- "alias": "http challenge",
- "description": "An authentication flow based on challenge-response HTTP Authentication Schemes",
- "providerId": "basic-flow",
- "topLevel": true,
- "builtIn": true,
- "authenticationExecutions": [
- {
- "authenticator": "no-cookie-redirect",
- "authenticatorFlow": false,
- "requirement": "REQUIRED",
- "priority": 10,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- },
- {
- "authenticatorFlow": true,
- "requirement": "REQUIRED",
- "priority": 20,
- "flowAlias": "Authentication Options",
- "userSetupAllowed": false,
- "autheticatorFlow": true
- }
- ]
- },
- {
- "id": "6cedbdfd-318a-4d30-b251-f0a884b167fb",
- "alias": "registration",
- "description": "registration flow",
- "providerId": "basic-flow",
- "topLevel": true,
- "builtIn": true,
- "authenticationExecutions": [
- {
- "authenticator": "registration-page-form",
- "authenticatorFlow": true,
- "requirement": "REQUIRED",
- "priority": 10,
- "flowAlias": "registration form",
- "userSetupAllowed": false,
- "autheticatorFlow": true
- }
- ]
- },
- {
- "id": "abdb0e32-9902-4859-ba25-329b26bac777",
- "alias": "registration form",
- "description": "registration form",
- "providerId": "form-flow",
- "topLevel": false,
- "builtIn": true,
- "authenticationExecutions": [
- {
- "authenticator": "registration-user-creation",
- "authenticatorFlow": false,
- "requirement": "REQUIRED",
- "priority": 20,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- },
- {
- "authenticator": "registration-profile-action",
- "authenticatorFlow": false,
- "requirement": "REQUIRED",
- "priority": 40,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- },
- {
- "authenticator": "registration-password-action",
- "authenticatorFlow": false,
- "requirement": "REQUIRED",
- "priority": 50,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- },
- {
- "authenticator": "registration-recaptcha-action",
- "authenticatorFlow": false,
- "requirement": "DISABLED",
- "priority": 60,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- }
- ]
- },
- {
- "id": "3a5f896c-9b3e-4133-aac6-cf5ce5a19c5e",
- "alias": "reset credentials",
- "description": "Reset credentials for a user if they forgot their password or something",
- "providerId": "basic-flow",
- "topLevel": true,
- "builtIn": true,
- "authenticationExecutions": [
- {
- "authenticator": "reset-credentials-choose-user",
- "authenticatorFlow": false,
- "requirement": "REQUIRED",
- "priority": 10,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- },
- {
- "authenticator": "reset-credential-email",
- "authenticatorFlow": false,
- "requirement": "REQUIRED",
- "priority": 20,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- },
- {
- "authenticator": "reset-password",
- "authenticatorFlow": false,
- "requirement": "REQUIRED",
- "priority": 30,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- },
- {
- "authenticatorFlow": true,
- "requirement": "CONDITIONAL",
- "priority": 40,
- "flowAlias": "Reset - Conditional OTP",
- "userSetupAllowed": false,
- "autheticatorFlow": true
- }
- ]
- },
- {
- "id": "7c997de8-300e-4fbd-a68a-94fb0207fad9",
- "alias": "saml ecp",
- "description": "SAML ECP Profile Authentication Flow",
- "providerId": "basic-flow",
- "topLevel": true,
- "builtIn": true,
- "authenticationExecutions": [
- {
- "authenticator": "http-basic-authenticator",
- "authenticatorFlow": false,
- "requirement": "REQUIRED",
- "priority": 10,
- "userSetupAllowed": false,
- "autheticatorFlow": false
- }
- ]
- }
- ],
- "authenticatorConfig": [
- {
- "id": "e44a784d-8366-45d5-bb73-8f8fa3163434",
- "alias": "create unique user config",
- "config": {
- "require.password.update.after.registration": "false"
- }
- },
- {
- "id": "32e37929-8a7d-433f-86fb-7208f5193ed9",
- "alias": "review profile config",
- "config": {
- "update.profile.on.first.login": "missing"
- }
- }
- ],
- "requiredActions": [
- {
- "alias": "CONFIGURE_TOTP",
- "name": "Configure OTP",
- "providerId": "CONFIGURE_TOTP",
- "enabled": true,
- "defaultAction": false,
- "priority": 10,
- "config": {}
- },
- {
- "alias": "terms_and_conditions",
- "name": "Terms and Conditions",
- "providerId": "terms_and_conditions",
- "enabled": false,
- "defaultAction": false,
- "priority": 20,
- "config": {}
- },
- {
- "alias": "UPDATE_PASSWORD",
- "name": "Update Password",
- "providerId": "UPDATE_PASSWORD",
- "enabled": true,
- "defaultAction": false,
- "priority": 30,
- "config": {}
- },
- {
- "alias": "UPDATE_PROFILE",
- "name": "Update Profile",
- "providerId": "UPDATE_PROFILE",
- "enabled": true,
- "defaultAction": false,
- "priority": 40,
- "config": {}
- },
- {
- "alias": "VERIFY_EMAIL",
- "name": "Verify Email",
- "providerId": "VERIFY_EMAIL",
- "enabled": true,
- "defaultAction": false,
- "priority": 50,
- "config": {}
- },
- {
- "alias": "delete_account",
- "name": "Delete Account",
- "providerId": "delete_account",
- "enabled": false,
- "defaultAction": false,
- "priority": 60,
- "config": {}
- },
- {
- "alias": "update_user_locale",
- "name": "Update User Locale",
- "providerId": "update_user_locale",
- "enabled": true,
- "defaultAction": false,
- "priority": 1000,
- "config": {}
- }
- ],
- "browserFlow": "browser",
- "registrationFlow": "registration",
- "directGrantFlow": "direct grant",
- "resetCredentialsFlow": "reset credentials",
- "clientAuthenticationFlow": "clients",
- "dockerAuthenticationFlow": "docker auth",
- "attributes": {
- "cibaBackchannelTokenDeliveryMode": "poll",
- "cibaExpiresIn": "120",
- "cibaAuthRequestedUserHint": "login_hint",
- "oauth2DeviceCodeLifespan": "600",
- "clientOfflineSessionMaxLifespan": "0",
- "oauth2DevicePollingInterval": "600",
- "clientSessionIdleTimeout": "0",
- "clientSessionMaxLifespan": "0",
- "clientOfflineSessionIdleTimeout": "0",
- "cibaInterval": "5"
- },
- "keycloakVersion": "14.0.0",
- "userManagedAccessAllowed": false,
- "clientProfiles": {
- "profiles": []
- },
- "clientPolicies": {
- "policies": []
- }
-}
diff --git a/docker/keycloak/import/test-realm.json b/docker/keycloak/import/test-realm.json
new file mode 100644
index 0000000000..d7ee99e1ad
--- /dev/null
+++ b/docker/keycloak/import/test-realm.json
@@ -0,0 +1,2284 @@
+{
+ "id" : "f74c917b-fd69-4c6d-9afa-d9f6774e9d7d",
+ "realm" : "test",
+ "notBefore" : 0,
+ "defaultSignatureAlgorithm" : "RS256",
+ "revokeRefreshToken" : false,
+ "refreshTokenMaxReuse" : 0,
+ "accessTokenLifespan" : 300,
+ "accessTokenLifespanForImplicitFlow" : 900,
+ "ssoSessionIdleTimeout" : 1800,
+ "ssoSessionMaxLifespan" : 36000,
+ "ssoSessionIdleTimeoutRememberMe" : 0,
+ "ssoSessionMaxLifespanRememberMe" : 0,
+ "offlineSessionIdleTimeout" : 2592000,
+ "offlineSessionMaxLifespanEnabled" : false,
+ "offlineSessionMaxLifespan" : 5184000,
+ "clientSessionIdleTimeout" : 0,
+ "clientSessionMaxLifespan" : 0,
+ "clientOfflineSessionIdleTimeout" : 0,
+ "clientOfflineSessionMaxLifespan" : 0,
+ "accessCodeLifespan" : 60,
+ "accessCodeLifespanUserAction" : 300,
+ "accessCodeLifespanLogin" : 1800,
+ "actionTokenGeneratedByAdminLifespan" : 43200,
+ "actionTokenGeneratedByUserLifespan" : 300,
+ "oauth2DeviceCodeLifespan" : 600,
+ "oauth2DevicePollingInterval" : 5,
+ "enabled" : true,
+ "sslRequired" : "external",
+ "registrationAllowed" : false,
+ "registrationEmailAsUsername" : false,
+ "rememberMe" : false,
+ "verifyEmail" : false,
+ "loginWithEmailAllowed" : true,
+ "duplicateEmailsAllowed" : false,
+ "resetPasswordAllowed" : false,
+ "editUsernameAllowed" : false,
+ "bruteForceProtected" : false,
+ "permanentLockout" : false,
+ "maxFailureWaitSeconds" : 900,
+ "minimumQuickLoginWaitSeconds" : 60,
+ "waitIncrementSeconds" : 60,
+ "quickLoginCheckMilliSeconds" : 1000,
+ "maxDeltaTimeSeconds" : 43200,
+ "failureFactor" : 30,
+ "roles" : {
+ "realm" : [ {
+ "id" : "28c07910-21e3-460d-98f3-18bdb430ffe1",
+ "name" : "default-roles-test",
+ "description" : "${role_default-roles}",
+ "composite" : true,
+ "composites" : {
+ "realm" : [ "offline_access", "uma_authorization" ],
+ "client" : {
+ "account" : [ "view-profile", "manage-account" ]
+ }
+ },
+ "clientRole" : false,
+ "containerId" : "f74c917b-fd69-4c6d-9afa-d9f6774e9d7d",
+ "attributes" : { }
+ }, {
+ "id" : "a3d84717-84c9-4d08-a90c-01b4d913b919",
+ "name" : "offline_access",
+ "description" : "${role_offline-access}",
+ "composite" : false,
+ "clientRole" : false,
+ "containerId" : "f74c917b-fd69-4c6d-9afa-d9f6774e9d7d",
+ "attributes" : { }
+ }, {
+ "id" : "50173816-9726-4655-8a65-13b0d0c23729",
+ "name" : "uma_authorization",
+ "description" : "${role_uma_authorization}",
+ "composite" : false,
+ "clientRole" : false,
+ "containerId" : "f74c917b-fd69-4c6d-9afa-d9f6774e9d7d",
+ "attributes" : { }
+ } ],
+ "client" : {
+ "realm-management" : [ {
+ "id" : "0c16a480-bbf3-49ad-8843-d4055cc83100",
+ "name" : "query-groups",
+ "description" : "${role_query-groups}",
+ "composite" : false,
+ "clientRole" : true,
+ "containerId" : "b61c6592-3036-4e48-8c90-b0818f63576c",
+ "attributes" : { }
+ }, {
+ "id" : "e2fa2cdd-feb7-42b1-a0f9-c6653e62d578",
+ "name" : "manage-clients",
+ "description" : "${role_manage-clients}",
+ "composite" : false,
+ "clientRole" : true,
+ "containerId" : "b61c6592-3036-4e48-8c90-b0818f63576c",
+ "attributes" : { }
+ }, {
+ "id" : "6d0c5def-b4d0-43b6-87c6-9cf6d6f9f2fb",
+ "name" : "realm-admin",
+ "description" : "${role_realm-admin}",
+ "composite" : true,
+ "composites" : {
+ "client" : {
+ "realm-management" : [ "query-groups", "manage-clients", "view-identity-providers", "query-clients", "view-authorization", "view-clients", "manage-events", "manage-users", "manage-identity-providers", "query-users", "create-client", "impersonation", "query-realms", "manage-authorization", "view-events", "manage-realm", "view-realm", "view-users" ]
+ }
+ },
+ "clientRole" : true,
+ "containerId" : "b61c6592-3036-4e48-8c90-b0818f63576c",
+ "attributes" : { }
+ }, {
+ "id" : "7d602068-73ae-4d83-bd9a-994a8dbf24b6",
+ "name" : "view-identity-providers",
+ "description" : "${role_view-identity-providers}",
+ "composite" : false,
+ "clientRole" : true,
+ "containerId" : "b61c6592-3036-4e48-8c90-b0818f63576c",
+ "attributes" : { }
+ }, {
+ "id" : "670970ae-e6b0-44f8-bd0e-c6945d41cacf",
+ "name" : "query-clients",
+ "description" : "${role_query-clients}",
+ "composite" : false,
+ "clientRole" : true,
+ "containerId" : "b61c6592-3036-4e48-8c90-b0818f63576c",
+ "attributes" : { }
+ }, {
+ "id" : "931ad9f0-c8ad-456a-a69d-d6c08abbe42a",
+ "name" : "view-authorization",
+ "description" : "${role_view-authorization}",
+ "composite" : false,
+ "clientRole" : true,
+ "containerId" : "b61c6592-3036-4e48-8c90-b0818f63576c",
+ "attributes" : { }
+ }, {
+ "id" : "3015f5e3-f9b4-4938-bae2-c2e1415b01c3",
+ "name" : "view-clients",
+ "description" : "${role_view-clients}",
+ "composite" : true,
+ "composites" : {
+ "client" : {
+ "realm-management" : [ "query-clients" ]
+ }
+ },
+ "clientRole" : true,
+ "containerId" : "b61c6592-3036-4e48-8c90-b0818f63576c",
+ "attributes" : { }
+ }, {
+ "id" : "9648682e-3b89-4fa7-83e0-bd673d4d3119",
+ "name" : "manage-events",
+ "description" : "${role_manage-events}",
+ "composite" : false,
+ "clientRole" : true,
+ "containerId" : "b61c6592-3036-4e48-8c90-b0818f63576c",
+ "attributes" : { }
+ }, {
+ "id" : "baa8f313-386c-4ade-832f-0d2a7da6a2bc",
+ "name" : "manage-users",
+ "description" : "${role_manage-users}",
+ "composite" : false,
+ "clientRole" : true,
+ "containerId" : "b61c6592-3036-4e48-8c90-b0818f63576c",
+ "attributes" : { }
+ }, {
+ "id" : "f59ed8c2-772a-4faf-87a8-04e9e1f0a032",
+ "name" : "manage-identity-providers",
+ "description" : "${role_manage-identity-providers}",
+ "composite" : false,
+ "clientRole" : true,
+ "containerId" : "b61c6592-3036-4e48-8c90-b0818f63576c",
+ "attributes" : { }
+ }, {
+ "id" : "3a950e7f-4762-4306-8d42-63fdd90aa212",
+ "name" : "query-users",
+ "description" : "${role_query-users}",
+ "composite" : false,
+ "clientRole" : true,
+ "containerId" : "b61c6592-3036-4e48-8c90-b0818f63576c",
+ "attributes" : { }
+ }, {
+ "id" : "ab1e85d0-4e35-42ac-acc3-4fde650a1b9f",
+ "name" : "create-client",
+ "description" : "${role_create-client}",
+ "composite" : false,
+ "clientRole" : true,
+ "containerId" : "b61c6592-3036-4e48-8c90-b0818f63576c",
+ "attributes" : { }
+ }, {
+ "id" : "f517cd55-5d1e-4baa-bedb-35fbb7135b24",
+ "name" : "impersonation",
+ "description" : "${role_impersonation}",
+ "composite" : false,
+ "clientRole" : true,
+ "containerId" : "b61c6592-3036-4e48-8c90-b0818f63576c",
+ "attributes" : { }
+ }, {
+ "id" : "7c437eed-ebd0-41fe-a5f2-c569724b71e9",
+ "name" : "query-realms",
+ "description" : "${role_query-realms}",
+ "composite" : false,
+ "clientRole" : true,
+ "containerId" : "b61c6592-3036-4e48-8c90-b0818f63576c",
+ "attributes" : { }
+ }, {
+ "id" : "8ec7b657-c507-4548-9a88-0c018350bdb9",
+ "name" : "manage-authorization",
+ "description" : "${role_manage-authorization}",
+ "composite" : false,
+ "clientRole" : true,
+ "containerId" : "b61c6592-3036-4e48-8c90-b0818f63576c",
+ "attributes" : { }
+ }, {
+ "id" : "bfec4ce4-563a-4f9c-a678-f5cda9f554c4",
+ "name" : "view-events",
+ "description" : "${role_view-events}",
+ "composite" : false,
+ "clientRole" : true,
+ "containerId" : "b61c6592-3036-4e48-8c90-b0818f63576c",
+ "attributes" : { }
+ }, {
+ "id" : "08ab5b1c-0d0c-4789-a595-81dcac9d4b5a",
+ "name" : "manage-realm",
+ "description" : "${role_manage-realm}",
+ "composite" : false,
+ "clientRole" : true,
+ "containerId" : "b61c6592-3036-4e48-8c90-b0818f63576c",
+ "attributes" : { }
+ }, {
+ "id" : "fbfe356d-f049-475c-a7f3-35276f12173b",
+ "name" : "view-realm",
+ "description" : "${role_view-realm}",
+ "composite" : false,
+ "clientRole" : true,
+ "containerId" : "b61c6592-3036-4e48-8c90-b0818f63576c",
+ "attributes" : { }
+ }, {
+ "id" : "42c2f2c5-eb42-49e3-93a0-a6c352af85c5",
+ "name" : "view-users",
+ "description" : "${role_view-users}",
+ "composite" : true,
+ "composites" : {
+ "client" : {
+ "realm-management" : [ "query-users", "query-groups" ]
+ }
+ },
+ "clientRole" : true,
+ "containerId" : "b61c6592-3036-4e48-8c90-b0818f63576c",
+ "attributes" : { }
+ } ],
+ "security-admin-console" : [ ],
+ "test-userinfo-jwt" : [ ],
+ "admin-cli" : [ ],
+ "testid" : [ ],
+ "account-console" : [ ],
+ "broker" : [ {
+ "id" : "b740a3c9-82ad-4b74-8a83-46c7d1d69441",
+ "name" : "read-token",
+ "description" : "${role_read-token}",
+ "composite" : false,
+ "clientRole" : true,
+ "containerId" : "0263ec51-8f33-4f73-952b-8cdb1712028c",
+ "attributes" : { }
+ } ],
+ "account" : [ {
+ "id" : "70072e4f-0600-42d1-b490-92de314f63bb",
+ "name" : "view-groups",
+ "description" : "${role_view-groups}",
+ "composite" : false,
+ "clientRole" : true,
+ "containerId" : "89fbc9e2-7a6c-4600-8ee8-f028644297fa",
+ "attributes" : { }
+ }, {
+ "id" : "87ffa29a-0a89-443b-bcf9-d26350bf74f8",
+ "name" : "view-applications",
+ "description" : "${role_view-applications}",
+ "composite" : false,
+ "clientRole" : true,
+ "containerId" : "89fbc9e2-7a6c-4600-8ee8-f028644297fa",
+ "attributes" : { }
+ }, {
+ "id" : "f6d0fe38-c146-4aab-924e-24b2d63ed95f",
+ "name" : "view-profile",
+ "description" : "${role_view-profile}",
+ "composite" : false,
+ "clientRole" : true,
+ "containerId" : "89fbc9e2-7a6c-4600-8ee8-f028644297fa",
+ "attributes" : { }
+ }, {
+ "id" : "0a6283c0-8c43-41e6-b6be-de81d6927b35",
+ "name" : "delete-account",
+ "description" : "${role_delete-account}",
+ "composite" : false,
+ "clientRole" : true,
+ "containerId" : "89fbc9e2-7a6c-4600-8ee8-f028644297fa",
+ "attributes" : { }
+ }, {
+ "id" : "f45f95f0-6a9e-4e98-ae9b-75e9b41023a6",
+ "name" : "view-consent",
+ "description" : "${role_view-consent}",
+ "composite" : false,
+ "clientRole" : true,
+ "containerId" : "89fbc9e2-7a6c-4600-8ee8-f028644297fa",
+ "attributes" : { }
+ }, {
+ "id" : "c21366ff-5003-4a3d-936d-925de4c347ae",
+ "name" : "manage-account-links",
+ "description" : "${role_manage-account-links}",
+ "composite" : false,
+ "clientRole" : true,
+ "containerId" : "89fbc9e2-7a6c-4600-8ee8-f028644297fa",
+ "attributes" : { }
+ }, {
+ "id" : "79e03b78-c3b2-4bcc-a04f-a58bba9a67a7",
+ "name" : "manage-account",
+ "description" : "${role_manage-account}",
+ "composite" : true,
+ "composites" : {
+ "client" : {
+ "account" : [ "manage-account-links" ]
+ }
+ },
+ "clientRole" : true,
+ "containerId" : "89fbc9e2-7a6c-4600-8ee8-f028644297fa",
+ "attributes" : { }
+ }, {
+ "id" : "9fd80770-e9cc-4393-aded-ce9969067b35",
+ "name" : "manage-consent",
+ "description" : "${role_manage-consent}",
+ "composite" : true,
+ "composites" : {
+ "client" : {
+ "account" : [ "view-consent" ]
+ }
+ },
+ "clientRole" : true,
+ "containerId" : "89fbc9e2-7a6c-4600-8ee8-f028644297fa",
+ "attributes" : { }
+ } ]
+ }
+ },
+ "groups" : [ {
+ "id" : "54b1af7e-173d-4319-85e0-d0848a106095",
+ "name" : "Registreerders",
+ "path" : "/Registreerders",
+ "subGroups" : [ ],
+ "attributes" : { },
+ "realmRoles" : [ ],
+ "clientRoles" : { }
+ } ],
+ "defaultRole" : {
+ "id" : "28c07910-21e3-460d-98f3-18bdb430ffe1",
+ "name" : "default-roles-test",
+ "description" : "${role_default-roles}",
+ "composite" : true,
+ "clientRole" : false,
+ "containerId" : "f74c917b-fd69-4c6d-9afa-d9f6774e9d7d"
+ },
+ "requiredCredentials" : [ "password" ],
+ "otpPolicyType" : "totp",
+ "otpPolicyAlgorithm" : "HmacSHA1",
+ "otpPolicyInitialCounter" : 0,
+ "otpPolicyDigits" : 6,
+ "otpPolicyLookAheadWindow" : 1,
+ "otpPolicyPeriod" : 30,
+ "otpPolicyCodeReusable" : false,
+ "otpSupportedApplications" : [ "totpAppFreeOTPName", "totpAppGoogleName", "totpAppMicrosoftAuthenticatorName" ],
+ "localizationTexts" : { },
+ "webAuthnPolicyRpEntityName" : "keycloak",
+ "webAuthnPolicySignatureAlgorithms" : [ "ES256" ],
+ "webAuthnPolicyRpId" : "",
+ "webAuthnPolicyAttestationConveyancePreference" : "not specified",
+ "webAuthnPolicyAuthenticatorAttachment" : "not specified",
+ "webAuthnPolicyRequireResidentKey" : "not specified",
+ "webAuthnPolicyUserVerificationRequirement" : "not specified",
+ "webAuthnPolicyCreateTimeout" : 0,
+ "webAuthnPolicyAvoidSameAuthenticatorRegister" : false,
+ "webAuthnPolicyAcceptableAaguids" : [ ],
+ "webAuthnPolicyExtraOrigins" : [ ],
+ "webAuthnPolicyPasswordlessRpEntityName" : "keycloak",
+ "webAuthnPolicyPasswordlessSignatureAlgorithms" : [ "ES256" ],
+ "webAuthnPolicyPasswordlessRpId" : "",
+ "webAuthnPolicyPasswordlessAttestationConveyancePreference" : "not specified",
+ "webAuthnPolicyPasswordlessAuthenticatorAttachment" : "not specified",
+ "webAuthnPolicyPasswordlessRequireResidentKey" : "not specified",
+ "webAuthnPolicyPasswordlessUserVerificationRequirement" : "not specified",
+ "webAuthnPolicyPasswordlessCreateTimeout" : 0,
+ "webAuthnPolicyPasswordlessAvoidSameAuthenticatorRegister" : false,
+ "webAuthnPolicyPasswordlessAcceptableAaguids" : [ ],
+ "webAuthnPolicyPasswordlessExtraOrigins" : [ ],
+ "users" : [ {
+ "id" : "6db2db87-de31-4e30-9f25-cefe5da8b154",
+ "createdTimestamp" : 1716466774675,
+ "username" : "admin",
+ "enabled" : true,
+ "totp" : false,
+ "emailVerified" : true,
+ "email" : "admin@example.com",
+ "credentials" : [ {
+ "id" : "3f77857f-70ba-43d2-9333-c996ba0f7f25",
+ "type" : "password",
+ "userLabel" : "My password",
+ "createdDate" : 1716466894356,
+ "secretData" : "{\"value\":\"kxBJkhnwzRk2nb9aLM026KH+53AoV9Jv3vbW0KM/k1E=\",\"salt\":\"mbXY7a8/tk0m9xKflh+ZhA==\",\"additionalParameters\":{}}",
+ "credentialData" : "{\"hashIterations\":27500,\"algorithm\":\"pbkdf2-sha256\",\"additionalParameters\":{}}"
+ } ],
+ "disableableCredentialTypes" : [ ],
+ "requiredActions" : [ ],
+ "realmRoles" : [ "default-roles-test" ],
+ "notBefore" : 0,
+ "groups" : [ "/Registreerders" ]
+ }, {
+ "id" : "ec5a1f70-3d10-48a8-a18b-2d13c925cd92",
+ "createdTimestamp" : 1716388011747,
+ "username" : "digid-machtigen",
+ "enabled" : true,
+ "totp" : false,
+ "emailVerified" : false,
+ "attributes" : {
+ "gemachtigde.bsn" : [ "999999999" ],
+ "aanvrager.bsn" : [ "000000000" ],
+ "service_id" : [ "b18dd73f-3dca-4b67-a4fb-06cb4ebbe2eb" ]
+ },
+ "credentials" : [ {
+ "id" : "5dde1609-96d7-44e0-be78-ac32b9d55736",
+ "type" : "password",
+ "userLabel" : "My password",
+ "createdDate" : 1716388020934,
+ "secretData" : "{\"value\":\"fCYy0OCCW1dVleqekfMpt7hkrQg+e2AeY3pJ14eLKdU=\",\"salt\":\"+TVXeVVZ4RudZj0nUVZsYA==\",\"additionalParameters\":{}}",
+ "credentialData" : "{\"hashIterations\":27500,\"algorithm\":\"pbkdf2-sha256\",\"additionalParameters\":{}}"
+ } ],
+ "disableableCredentialTypes" : [ ],
+ "requiredActions" : [ ],
+ "realmRoles" : [ "default-roles-test" ],
+ "notBefore" : 0,
+ "groups" : [ ]
+ }, {
+ "id" : "646e27c6-1b42-4e11-a5c6-d9fae4c3cea6",
+ "createdTimestamp" : 1716392361705,
+ "username" : "eherkenning-bewindvoering",
+ "enabled" : true,
+ "totp" : false,
+ "emailVerified" : false,
+ "attributes" : {
+ "service_uuid" : [ "81216fa4-80a1-4686-a8ac-5c8e5c030c93" ],
+ "representeeBSN" : [ "000000000" ],
+ "legalSubjectID" : [ "12345678" ],
+ "actingSubjectID" : [ "4B75A0EA107B3D36" ],
+ "service_id" : [ "urn:etoegang:DV:00000001002308836000:services:9113" ],
+ "aanvrager.kvk" : [ "12345678" ],
+ "name_qualifier" : [ "urn:etoegang:1.9:EntityConcernedID:KvKnr" ],
+ "gemachtigde.pseudoID" : [ "4B75A0EA107B3D36" ]
+ },
+ "credentials" : [ {
+ "id" : "8d284b91-21db-4bc7-8163-b35fac289108",
+ "type" : "password",
+ "userLabel" : "My password",
+ "createdDate" : 1716393311799,
+ "secretData" : "{\"value\":\"c7ugclHPaUkxdiBzUaUKQscFGSp2ioE3z6Ipvcmwfag=\",\"salt\":\"UHMZypw/YcFH0m0/4YnnjA==\",\"additionalParameters\":{}}",
+ "credentialData" : "{\"hashIterations\":27500,\"algorithm\":\"pbkdf2-sha256\",\"additionalParameters\":{}}"
+ } ],
+ "disableableCredentialTypes" : [ ],
+ "requiredActions" : [ ],
+ "realmRoles" : [ "default-roles-test" ],
+ "notBefore" : 0,
+ "groups" : [ ]
+ }, {
+ "id" : "a28aac19-6ac5-4ce5-bbe3-b6c24051914a",
+ "createdTimestamp" : 1707141299906,
+ "username" : "service-account-testid",
+ "enabled" : true,
+ "totp" : false,
+ "emailVerified" : false,
+ "serviceAccountClientId" : "testid",
+ "credentials" : [ ],
+ "disableableCredentialTypes" : [ ],
+ "requiredActions" : [ ],
+ "realmRoles" : [ "default-roles-test" ],
+ "notBefore" : 0,
+ "groups" : [ ]
+ }, {
+ "id" : "aa10cfc7-2c4d-41f6-8fac-7bf405c572c4",
+ "createdTimestamp" : 1707141446005,
+ "username" : "testuser",
+ "enabled" : true,
+ "totp" : false,
+ "emailVerified" : false,
+ "attributes" : {
+ "name_qualifier" : [ "urn:etoegang:1.9:EntityConcernedID:KvKnr" ],
+ "kvk" : [ "012345678" ],
+ "bsn" : [ "000000000" ],
+ "legalSubjectID" : [ "12345678" ],
+ "actingSubjectID" : [ "4B75A0EA107B3D36" ]
+ },
+ "credentials" : [ {
+ "id" : "7592b843-a7ab-4372-a133-d4d984ae687c",
+ "type" : "password",
+ "userLabel" : "My password",
+ "createdDate" : 1707141485838,
+ "secretData" : "{\"value\":\"s9LcIc++9CRM7/wgifxyz0jUFYfmn2VuNpLP3NwUcDw=\",\"salt\":\"JReLfJs5YgTCeB+7u0tgfA==\",\"additionalParameters\":{}}",
+ "credentialData" : "{\"hashIterations\":27500,\"algorithm\":\"pbkdf2-sha256\",\"additionalParameters\":{}}"
+ } ],
+ "disableableCredentialTypes" : [ ],
+ "requiredActions" : [ ],
+ "realmRoles" : [ "default-roles-test" ],
+ "notBefore" : 0,
+ "groups" : [ ]
+ } ],
+ "scopeMappings" : [ {
+ "clientScope" : "offline_access",
+ "roles" : [ "offline_access" ]
+ } ],
+ "clientScopeMappings" : {
+ "account" : [ {
+ "client" : "account-console",
+ "roles" : [ "manage-account", "view-groups" ]
+ } ]
+ },
+ "clients" : [ {
+ "id" : "89fbc9e2-7a6c-4600-8ee8-f028644297fa",
+ "clientId" : "account",
+ "name" : "${client_account}",
+ "rootUrl" : "${authBaseUrl}",
+ "baseUrl" : "/realms/test/account/",
+ "surrogateAuthRequired" : false,
+ "enabled" : true,
+ "alwaysDisplayInConsole" : false,
+ "clientAuthenticatorType" : "client-secret",
+ "redirectUris" : [ "/realms/test/account/*" ],
+ "webOrigins" : [ ],
+ "notBefore" : 0,
+ "bearerOnly" : false,
+ "consentRequired" : false,
+ "standardFlowEnabled" : true,
+ "implicitFlowEnabled" : false,
+ "directAccessGrantsEnabled" : false,
+ "serviceAccountsEnabled" : false,
+ "publicClient" : true,
+ "frontchannelLogout" : false,
+ "protocol" : "openid-connect",
+ "attributes" : {
+ "post.logout.redirect.uris" : "+"
+ },
+ "authenticationFlowBindingOverrides" : { },
+ "fullScopeAllowed" : false,
+ "nodeReRegistrationTimeout" : 0,
+ "defaultClientScopes" : [ "web-origins", "acr", "roles", "profile", "email" ],
+ "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ]
+ }, {
+ "id" : "6030fa07-5521-4c89-ad5f-0055bac6a47f",
+ "clientId" : "account-console",
+ "name" : "${client_account-console}",
+ "rootUrl" : "${authBaseUrl}",
+ "baseUrl" : "/realms/test/account/",
+ "surrogateAuthRequired" : false,
+ "enabled" : true,
+ "alwaysDisplayInConsole" : false,
+ "clientAuthenticatorType" : "client-secret",
+ "redirectUris" : [ "/realms/test/account/*" ],
+ "webOrigins" : [ ],
+ "notBefore" : 0,
+ "bearerOnly" : false,
+ "consentRequired" : false,
+ "standardFlowEnabled" : true,
+ "implicitFlowEnabled" : false,
+ "directAccessGrantsEnabled" : false,
+ "serviceAccountsEnabled" : false,
+ "publicClient" : true,
+ "frontchannelLogout" : false,
+ "protocol" : "openid-connect",
+ "attributes" : {
+ "post.logout.redirect.uris" : "+",
+ "pkce.code.challenge.method" : "S256"
+ },
+ "authenticationFlowBindingOverrides" : { },
+ "fullScopeAllowed" : false,
+ "nodeReRegistrationTimeout" : 0,
+ "protocolMappers" : [ {
+ "id" : "675a1d8e-030c-4be6-bc22-bbcff46771b4",
+ "name" : "audience resolve",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-audience-resolve-mapper",
+ "consentRequired" : false,
+ "config" : { }
+ } ],
+ "defaultClientScopes" : [ "web-origins", "acr", "roles", "profile", "email" ],
+ "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ]
+ }, {
+ "id" : "0ba5f086-39ea-4545-a237-639bcfbb6d20",
+ "clientId" : "admin-cli",
+ "name" : "${client_admin-cli}",
+ "surrogateAuthRequired" : false,
+ "enabled" : true,
+ "alwaysDisplayInConsole" : false,
+ "clientAuthenticatorType" : "client-secret",
+ "redirectUris" : [ ],
+ "webOrigins" : [ ],
+ "notBefore" : 0,
+ "bearerOnly" : false,
+ "consentRequired" : false,
+ "standardFlowEnabled" : false,
+ "implicitFlowEnabled" : false,
+ "directAccessGrantsEnabled" : true,
+ "serviceAccountsEnabled" : false,
+ "publicClient" : true,
+ "frontchannelLogout" : false,
+ "protocol" : "openid-connect",
+ "attributes" : {
+ "post.logout.redirect.uris" : "+"
+ },
+ "authenticationFlowBindingOverrides" : { },
+ "fullScopeAllowed" : false,
+ "nodeReRegistrationTimeout" : 0,
+ "defaultClientScopes" : [ "web-origins", "acr", "roles", "profile", "email" ],
+ "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ]
+ }, {
+ "id" : "0263ec51-8f33-4f73-952b-8cdb1712028c",
+ "clientId" : "broker",
+ "name" : "${client_broker}",
+ "surrogateAuthRequired" : false,
+ "enabled" : true,
+ "alwaysDisplayInConsole" : false,
+ "clientAuthenticatorType" : "client-secret",
+ "redirectUris" : [ ],
+ "webOrigins" : [ ],
+ "notBefore" : 0,
+ "bearerOnly" : true,
+ "consentRequired" : false,
+ "standardFlowEnabled" : true,
+ "implicitFlowEnabled" : false,
+ "directAccessGrantsEnabled" : false,
+ "serviceAccountsEnabled" : false,
+ "publicClient" : false,
+ "frontchannelLogout" : false,
+ "protocol" : "openid-connect",
+ "attributes" : {
+ "post.logout.redirect.uris" : "+"
+ },
+ "authenticationFlowBindingOverrides" : { },
+ "fullScopeAllowed" : false,
+ "nodeReRegistrationTimeout" : 0,
+ "defaultClientScopes" : [ "web-origins", "acr", "roles", "profile", "email" ],
+ "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ]
+ }, {
+ "id" : "b61c6592-3036-4e48-8c90-b0818f63576c",
+ "clientId" : "realm-management",
+ "name" : "${client_realm-management}",
+ "surrogateAuthRequired" : false,
+ "enabled" : true,
+ "alwaysDisplayInConsole" : false,
+ "clientAuthenticatorType" : "client-secret",
+ "redirectUris" : [ ],
+ "webOrigins" : [ ],
+ "notBefore" : 0,
+ "bearerOnly" : true,
+ "consentRequired" : false,
+ "standardFlowEnabled" : true,
+ "implicitFlowEnabled" : false,
+ "directAccessGrantsEnabled" : false,
+ "serviceAccountsEnabled" : false,
+ "publicClient" : false,
+ "frontchannelLogout" : false,
+ "protocol" : "openid-connect",
+ "attributes" : {
+ "post.logout.redirect.uris" : "+"
+ },
+ "authenticationFlowBindingOverrides" : { },
+ "fullScopeAllowed" : false,
+ "nodeReRegistrationTimeout" : 0,
+ "defaultClientScopes" : [ "web-origins", "acr", "roles", "profile", "email" ],
+ "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ]
+ }, {
+ "id" : "d20d5fd5-e7aa-4641-8c83-c6a2fa0acfe2",
+ "clientId" : "security-admin-console",
+ "name" : "${client_security-admin-console}",
+ "rootUrl" : "${authAdminUrl}",
+ "baseUrl" : "/admin/test/console/",
+ "surrogateAuthRequired" : false,
+ "enabled" : true,
+ "alwaysDisplayInConsole" : false,
+ "clientAuthenticatorType" : "client-secret",
+ "redirectUris" : [ "/admin/test/console/*" ],
+ "webOrigins" : [ "+" ],
+ "notBefore" : 0,
+ "bearerOnly" : false,
+ "consentRequired" : false,
+ "standardFlowEnabled" : true,
+ "implicitFlowEnabled" : false,
+ "directAccessGrantsEnabled" : false,
+ "serviceAccountsEnabled" : false,
+ "publicClient" : true,
+ "frontchannelLogout" : false,
+ "protocol" : "openid-connect",
+ "attributes" : {
+ "post.logout.redirect.uris" : "+",
+ "pkce.code.challenge.method" : "S256"
+ },
+ "authenticationFlowBindingOverrides" : { },
+ "fullScopeAllowed" : false,
+ "nodeReRegistrationTimeout" : 0,
+ "protocolMappers" : [ {
+ "id" : "2c68a174-10c2-464e-bbc4-d8d414053fd6",
+ "name" : "locale",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-attribute-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "introspection.token.claim" : "true",
+ "userinfo.token.claim" : "true",
+ "user.attribute" : "locale",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "locale",
+ "jsonType.label" : "String"
+ }
+ } ],
+ "defaultClientScopes" : [ "web-origins", "acr", "roles", "profile", "email" ],
+ "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ]
+ }, {
+ "id" : "42a22604-c3d9-48a7-9186-e8ef84e05223",
+ "clientId" : "test-userinfo-jwt",
+ "name" : "",
+ "description" : "",
+ "rootUrl" : "",
+ "adminUrl" : "",
+ "baseUrl" : "",
+ "surrogateAuthRequired" : false,
+ "enabled" : true,
+ "alwaysDisplayInConsole" : false,
+ "clientAuthenticatorType" : "client-secret",
+ "secret" : "ktGlGUELd1FR7dTXc84L7dJzUTjCtw9S",
+ "redirectUris" : [ "http://testserver/*", "http://127.0.0.1:8000/*", "http://localhost:8000/*" ],
+ "webOrigins" : [ "http://127.0.0.1:8000" ],
+ "notBefore" : 0,
+ "bearerOnly" : false,
+ "consentRequired" : false,
+ "standardFlowEnabled" : true,
+ "implicitFlowEnabled" : false,
+ "directAccessGrantsEnabled" : true,
+ "serviceAccountsEnabled" : false,
+ "publicClient" : false,
+ "frontchannelLogout" : true,
+ "protocol" : "openid-connect",
+ "attributes" : {
+ "client.secret.creation.time" : "1707218309",
+ "user.info.response.signature.alg" : "RS256",
+ "post.logout.redirect.uris" : "+",
+ "oauth2.device.authorization.grant.enabled" : "false",
+ "backchannel.logout.revoke.offline.tokens" : "false",
+ "use.refresh.tokens" : "true",
+ "oidc.ciba.grant.enabled" : "false",
+ "backchannel.logout.session.required" : "true",
+ "client_credentials.use_refresh_token" : "false",
+ "tls.client.certificate.bound.access.tokens" : "false",
+ "require.pushed.authorization.requests" : "false",
+ "acr.loa.map" : "{}",
+ "display.on.consent.screen" : "false",
+ "token.response.type.bearer.lower-case" : "false"
+ },
+ "authenticationFlowBindingOverrides" : { },
+ "fullScopeAllowed" : true,
+ "nodeReRegistrationTimeout" : -1,
+ "defaultClientScopes" : [ "web-origins", "kvk", "acr", "roles", "profile", "bsn", "email" ],
+ "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ]
+ }, {
+ "id" : "adf4ad83-4550-4619-9231-73bd8d700f45",
+ "clientId" : "testid",
+ "name" : "",
+ "description" : "",
+ "rootUrl" : "",
+ "adminUrl" : "",
+ "baseUrl" : "",
+ "surrogateAuthRequired" : false,
+ "enabled" : true,
+ "alwaysDisplayInConsole" : false,
+ "clientAuthenticatorType" : "client-secret",
+ "secret" : "7DB3KUAAizYCcmZufpHRVOcD0TOkNO3I",
+ "redirectUris" : [ "http://testserver/*", "http://127.0.0.1:8000/*", "http://example.com/*", "http://localhost:8000/*" ],
+ "webOrigins" : [ "http://127.0.0.1:8000" ],
+ "notBefore" : 0,
+ "bearerOnly" : false,
+ "consentRequired" : false,
+ "standardFlowEnabled" : true,
+ "implicitFlowEnabled" : false,
+ "directAccessGrantsEnabled" : true,
+ "serviceAccountsEnabled" : true,
+ "publicClient" : false,
+ "frontchannelLogout" : true,
+ "protocol" : "openid-connect",
+ "attributes" : {
+ "client.secret.creation.time" : "1707141299",
+ "user.info.response.signature.alg" : "RS256",
+ "post.logout.redirect.uris" : "+",
+ "oauth2.device.authorization.grant.enabled" : "false",
+ "backchannel.logout.revoke.offline.tokens" : "false",
+ "use.refresh.tokens" : "true",
+ "oidc.ciba.grant.enabled" : "false",
+ "backchannel.logout.session.required" : "true",
+ "client_credentials.use_refresh_token" : "false",
+ "tls.client.certificate.bound.access.tokens" : "false",
+ "require.pushed.authorization.requests" : "false",
+ "acr.loa.map" : "{}",
+ "display.on.consent.screen" : "false",
+ "token.response.type.bearer.lower-case" : "false"
+ },
+ "authenticationFlowBindingOverrides" : { },
+ "fullScopeAllowed" : true,
+ "nodeReRegistrationTimeout" : -1,
+ "protocolMappers" : [ {
+ "id" : "e62c9c9b-3a85-41a3-8529-42483cc285f1",
+ "name" : "Client ID",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usersessionmodel-note-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "user.session.note" : "client_id",
+ "introspection.token.claim" : "true",
+ "userinfo.token.claim" : "true",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "client_id",
+ "jsonType.label" : "String"
+ }
+ }, {
+ "id" : "c283ef6b-0be7-4ce0-a5dc-622b6ca88dc9",
+ "name" : "Client IP Address",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usersessionmodel-note-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "user.session.note" : "clientAddress",
+ "introspection.token.claim" : "true",
+ "userinfo.token.claim" : "true",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "clientAddress",
+ "jsonType.label" : "String"
+ }
+ }, {
+ "id" : "68d1ac80-7066-45c3-af1b-48fd1bb52f25",
+ "name" : "Client Host",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usersessionmodel-note-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "user.session.note" : "clientHost",
+ "introspection.token.claim" : "true",
+ "userinfo.token.claim" : "true",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "clientHost",
+ "jsonType.label" : "String"
+ }
+ } ],
+ "defaultClientScopes" : [ "web-origins", "kvk", "acr", "roles", "profile", "groups", "bsn", "email" ],
+ "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ]
+ } ],
+ "clientScopes" : [ {
+ "id" : "cbee953a-f6cc-47d0-9417-bde0ade67c28",
+ "name" : "roles",
+ "description" : "OpenID Connect scope for add user roles to the access token",
+ "protocol" : "openid-connect",
+ "attributes" : {
+ "include.in.token.scope" : "false",
+ "display.on.consent.screen" : "true",
+ "consent.screen.text" : "${rolesScopeConsentText}"
+ },
+ "protocolMappers" : [ {
+ "id" : "895028b7-75e6-4d1e-ab98-74e8fd83688c",
+ "name" : "realm roles",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-realm-role-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "introspection.token.claim" : "true",
+ "multivalued" : "true",
+ "user.attribute" : "foo",
+ "access.token.claim" : "true",
+ "claim.name" : "realm_access.roles",
+ "jsonType.label" : "String"
+ }
+ }, {
+ "id" : "7a9b8a8d-b221-4748-941a-5b465036b01e",
+ "name" : "client roles",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-client-role-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "introspection.token.claim" : "true",
+ "multivalued" : "true",
+ "user.attribute" : "foo",
+ "access.token.claim" : "true",
+ "claim.name" : "resource_access.${client_id}.roles",
+ "jsonType.label" : "String"
+ }
+ }, {
+ "id" : "0066ba3c-8feb-40ae-a8c4-f82e556b7001",
+ "name" : "audience resolve",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-audience-resolve-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "introspection.token.claim" : "true",
+ "access.token.claim" : "true"
+ }
+ } ]
+ }, {
+ "id" : "626b8bbf-e0f7-4b59-93c7-80e875d48f75",
+ "name" : "phone",
+ "description" : "OpenID Connect built-in scope: phone",
+ "protocol" : "openid-connect",
+ "attributes" : {
+ "include.in.token.scope" : "true",
+ "display.on.consent.screen" : "true",
+ "consent.screen.text" : "${phoneScopeConsentText}"
+ },
+ "protocolMappers" : [ {
+ "id" : "f153d49f-b2eb-4631-b5d4-d994b1a5c1b1",
+ "name" : "phone number",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-attribute-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "introspection.token.claim" : "true",
+ "userinfo.token.claim" : "true",
+ "user.attribute" : "phoneNumber",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "phone_number",
+ "jsonType.label" : "String"
+ }
+ }, {
+ "id" : "d225930c-582f-456e-b286-b95d8c4dd916",
+ "name" : "phone number verified",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-attribute-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "introspection.token.claim" : "true",
+ "userinfo.token.claim" : "true",
+ "user.attribute" : "phoneNumberVerified",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "phone_number_verified",
+ "jsonType.label" : "boolean"
+ }
+ } ]
+ }, {
+ "id" : "593033e2-5011-46b1-be8f-df036dee32b2",
+ "name" : "profile",
+ "description" : "OpenID Connect built-in scope: profile",
+ "protocol" : "openid-connect",
+ "attributes" : {
+ "include.in.token.scope" : "true",
+ "display.on.consent.screen" : "true",
+ "consent.screen.text" : "${profileScopeConsentText}"
+ },
+ "protocolMappers" : [ {
+ "id" : "ab90bd48-a6c3-4b47-bab6-1d993c010404",
+ "name" : "gender",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-attribute-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "introspection.token.claim" : "true",
+ "userinfo.token.claim" : "true",
+ "user.attribute" : "gender",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "gender",
+ "jsonType.label" : "String"
+ }
+ }, {
+ "id" : "33f67e40-80d4-4e10-951c-0c08d1051969",
+ "name" : "username",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-attribute-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "introspection.token.claim" : "true",
+ "userinfo.token.claim" : "true",
+ "user.attribute" : "username",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "preferred_username",
+ "jsonType.label" : "String"
+ }
+ }, {
+ "id" : "56f353fd-546e-48e4-8344-73332df31d3a",
+ "name" : "picture",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-attribute-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "introspection.token.claim" : "true",
+ "userinfo.token.claim" : "true",
+ "user.attribute" : "picture",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "picture",
+ "jsonType.label" : "String"
+ }
+ }, {
+ "id" : "f78c250d-df76-4e1e-904f-c8d2d60aeb04",
+ "name" : "family name",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-attribute-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "introspection.token.claim" : "true",
+ "userinfo.token.claim" : "true",
+ "user.attribute" : "lastName",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "family_name",
+ "jsonType.label" : "String"
+ }
+ }, {
+ "id" : "ab97273d-18bd-426f-a3f7-61e45309500d",
+ "name" : "full name",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-full-name-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "id.token.claim" : "true",
+ "introspection.token.claim" : "true",
+ "access.token.claim" : "true",
+ "userinfo.token.claim" : "true"
+ }
+ }, {
+ "id" : "82effad5-1147-4b1d-bcc7-bda7e9c61760",
+ "name" : "middle name",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-attribute-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "introspection.token.claim" : "true",
+ "userinfo.token.claim" : "true",
+ "user.attribute" : "middleName",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "middle_name",
+ "jsonType.label" : "String"
+ }
+ }, {
+ "id" : "40d6f0ed-f41e-4a3c-acce-5f536fe91fcd",
+ "name" : "profile",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-attribute-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "introspection.token.claim" : "true",
+ "userinfo.token.claim" : "true",
+ "user.attribute" : "profile",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "profile",
+ "jsonType.label" : "String"
+ }
+ }, {
+ "id" : "c4d1ee91-ce3c-4f75-ba38-3a9c8def5b04",
+ "name" : "groups",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-realm-role-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "introspection.token.claim" : "true",
+ "multivalued" : "true",
+ "user.attribute" : "foo",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "groups",
+ "jsonType.label" : "String"
+ }
+ }, {
+ "id" : "07c6a4b7-4a27-4d1b-872d-4a726169c641",
+ "name" : "website",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-attribute-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "introspection.token.claim" : "true",
+ "userinfo.token.claim" : "true",
+ "user.attribute" : "website",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "website",
+ "jsonType.label" : "String"
+ }
+ }, {
+ "id" : "df1e7c2d-e8e8-4176-8da9-628985e9cb51",
+ "name" : "nickname",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-attribute-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "introspection.token.claim" : "true",
+ "userinfo.token.claim" : "true",
+ "user.attribute" : "nickname",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "nickname",
+ "jsonType.label" : "String"
+ }
+ }, {
+ "id" : "20e3fa91-8afc-4735-977c-5de3d486a50d",
+ "name" : "updated at",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-attribute-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "introspection.token.claim" : "true",
+ "userinfo.token.claim" : "true",
+ "user.attribute" : "updatedAt",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "updated_at",
+ "jsonType.label" : "long"
+ }
+ }, {
+ "id" : "3e525255-568d-40df-9c46-a4f25823ff7e",
+ "name" : "locale",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-attribute-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "introspection.token.claim" : "true",
+ "userinfo.token.claim" : "true",
+ "user.attribute" : "locale",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "locale",
+ "jsonType.label" : "String"
+ }
+ }, {
+ "id" : "b7cc3936-ca28-4aa5-9eed-7811ed2d6215",
+ "name" : "given name",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-attribute-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "introspection.token.claim" : "true",
+ "userinfo.token.claim" : "true",
+ "user.attribute" : "firstName",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "given_name",
+ "jsonType.label" : "String"
+ }
+ }, {
+ "id" : "4ef08463-2a21-44bf-8e5e-6f4783aacf95",
+ "name" : "birthdate",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-attribute-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "introspection.token.claim" : "true",
+ "userinfo.token.claim" : "true",
+ "user.attribute" : "birthdate",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "birthdate",
+ "jsonType.label" : "String"
+ }
+ }, {
+ "id" : "15a35ab1-e602-445d-81bb-5a5a997a83dc",
+ "name" : "zoneinfo",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-attribute-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "introspection.token.claim" : "true",
+ "userinfo.token.claim" : "true",
+ "user.attribute" : "zoneinfo",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "zoneinfo",
+ "jsonType.label" : "String"
+ }
+ } ]
+ }, {
+ "id" : "cdf790bc-c9d4-450c-9088-ef0435d0c7fb",
+ "name" : "acr",
+ "description" : "OpenID Connect scope for add acr (authentication context class reference) to the token",
+ "protocol" : "openid-connect",
+ "attributes" : {
+ "include.in.token.scope" : "false",
+ "display.on.consent.screen" : "false"
+ },
+ "protocolMappers" : [ {
+ "id" : "3d18951b-0124-4daf-aad5-c8f6bebbb54b",
+ "name" : "acr loa level",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-acr-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "id.token.claim" : "true",
+ "introspection.token.claim" : "true",
+ "access.token.claim" : "true",
+ "userinfo.token.claim" : "true"
+ }
+ } ]
+ }, {
+ "id" : "9071e077-8fe3-4ea4-a2a8-51d8c8929329",
+ "name" : "bsn",
+ "description" : "",
+ "protocol" : "openid-connect",
+ "attributes" : {
+ "include.in.token.scope" : "true",
+ "display.on.consent.screen" : "true",
+ "gui.order" : "",
+ "consent.screen.text" : ""
+ },
+ "protocolMappers" : [ {
+ "id" : "65bb02a6-160e-4cd0-9cc8-41123b1f8207",
+ "name" : "aanvrager.bsn",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-attribute-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "aggregate.attrs" : "false",
+ "introspection.token.claim" : "true",
+ "userinfo.token.claim" : "true",
+ "multivalued" : "false",
+ "user.attribute" : "aanvrager.bsn",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "aanvrager\\.bsn",
+ "jsonType.label" : "String"
+ }
+ }, {
+ "id" : "e9a645fb-f731-43a0-bcca-c0a40070727a",
+ "name" : "bsn",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-attribute-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "introspection.token.claim" : "true",
+ "userinfo.token.claim" : "true",
+ "user.attribute" : "bsn",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "bsn",
+ "jsonType.label" : "String"
+ }
+ }, {
+ "id" : "a4c9d555-0beb-44da-9356-b417f37fd7a8",
+ "name" : "aanvrager.kvk",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-attribute-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "introspection.token.claim" : "true",
+ "userinfo.token.claim" : "true",
+ "user.attribute" : "aanvrager.kvk",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "aanvrager\\.kvk",
+ "jsonType.label" : "String"
+ }
+ }, {
+ "id" : "edd8c9d6-d4f0-43a5-b7ff-747d12007856",
+ "name" : "service_uuid",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-attribute-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "introspection.token.claim" : "true",
+ "userinfo.token.claim" : "true",
+ "user.attribute" : "service_uuid",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "service_uuid",
+ "jsonType.label" : "String"
+ }
+ }, {
+ "id" : "c6e49a67-cdbe-436b-ad47-c6dc3a8bf5be",
+ "name" : "representeeBSN",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-attribute-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "introspection.token.claim" : "true",
+ "userinfo.token.claim" : "true",
+ "user.attribute" : "representeeBSN",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "representeeBSN",
+ "jsonType.label" : "String"
+ }
+ }, {
+ "id" : "2bc83ef0-a719-48e4-8142-6bfdcbe77ab2",
+ "name" : "gemachtigde.bsn",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-attribute-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "aggregate.attrs" : "false",
+ "introspection.token.claim" : "true",
+ "userinfo.token.claim" : "true",
+ "multivalued" : "false",
+ "user.attribute" : "gemachtigde.bsn",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "gemachtigde\\.bsn",
+ "jsonType.label" : "String"
+ }
+ }, {
+ "id" : "5cca44aa-84b0-45f3-9381-7239cf37d04e",
+ "name" : "gemachtigde.pseudoID",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-attribute-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "introspection.token.claim" : "true",
+ "userinfo.token.claim" : "true",
+ "user.attribute" : "gemachtigde.pseudoID",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "gemachtigde\\.pseudoID",
+ "jsonType.label" : "String"
+ }
+ }, {
+ "id" : "a815d8d5-48c5-4dad-bb2f-1fba89582fcf",
+ "name" : "actingSubjectID",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-attribute-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "introspection.token.claim" : "true",
+ "userinfo.token.claim" : "true",
+ "user.attribute" : "actingSubjectID",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "actingSubjectID",
+ "jsonType.label" : "String"
+ }
+ }, {
+ "id" : "cb90396c-deea-4d38-bf2b-117a3ce2b194",
+ "name" : "service_id",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-attribute-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "introspection.token.claim" : "true",
+ "userinfo.token.claim" : "true",
+ "user.attribute" : "service_id",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "service_id",
+ "jsonType.label" : "String"
+ }
+ }, {
+ "id" : "e12f9cee-121e-4b29-be63-0eda4cc0e8ba",
+ "name" : "legalSubjectID",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-attribute-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "introspection.token.claim" : "true",
+ "userinfo.token.claim" : "true",
+ "user.attribute" : "legalSubjectID",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "legalSubjectID",
+ "jsonType.label" : "String"
+ }
+ }, {
+ "id" : "ebef48ea-cf2d-4865-9a3b-0589fd00f486",
+ "name" : "name_qualifier",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-attribute-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "introspection.token.claim" : "true",
+ "userinfo.token.claim" : "true",
+ "user.attribute" : "name_qualifier",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "name_qualifier",
+ "jsonType.label" : "String"
+ }
+ } ]
+ }, {
+ "id" : "f32301bc-3922-491a-89c3-9764356d9d17",
+ "name" : "email",
+ "description" : "OpenID Connect built-in scope: email",
+ "protocol" : "openid-connect",
+ "attributes" : {
+ "include.in.token.scope" : "true",
+ "display.on.consent.screen" : "true",
+ "consent.screen.text" : "${emailScopeConsentText}"
+ },
+ "protocolMappers" : [ {
+ "id" : "7d845a9b-b76e-4b9f-890b-ef313f9c2e5d",
+ "name" : "email verified",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-property-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "introspection.token.claim" : "true",
+ "userinfo.token.claim" : "true",
+ "user.attribute" : "emailVerified",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "email_verified",
+ "jsonType.label" : "boolean"
+ }
+ }, {
+ "id" : "e939e96f-9eec-4cc3-9a8e-137760c65b7a",
+ "name" : "email",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-attribute-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "introspection.token.claim" : "true",
+ "userinfo.token.claim" : "true",
+ "user.attribute" : "email",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "email",
+ "jsonType.label" : "String"
+ }
+ } ]
+ }, {
+ "id" : "68c885a8-6cc4-4e18-8213-d69e80f9deef",
+ "name" : "address",
+ "description" : "OpenID Connect built-in scope: address",
+ "protocol" : "openid-connect",
+ "attributes" : {
+ "include.in.token.scope" : "true",
+ "display.on.consent.screen" : "true",
+ "consent.screen.text" : "${addressScopeConsentText}"
+ },
+ "protocolMappers" : [ {
+ "id" : "f328d8ca-8da7-4d0c-a8d4-35a8e0912649",
+ "name" : "address",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-address-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "user.attribute.formatted" : "formatted",
+ "user.attribute.country" : "country",
+ "introspection.token.claim" : "true",
+ "user.attribute.postal_code" : "postal_code",
+ "userinfo.token.claim" : "true",
+ "user.attribute.street" : "street",
+ "id.token.claim" : "true",
+ "user.attribute.region" : "region",
+ "access.token.claim" : "true",
+ "user.attribute.locality" : "locality"
+ }
+ } ]
+ }, {
+ "id" : "2a595631-0f05-4e03-9bf7-d0a86743f246",
+ "name" : "role_list",
+ "description" : "SAML role list",
+ "protocol" : "saml",
+ "attributes" : {
+ "consent.screen.text" : "${samlRoleListScopeConsentText}",
+ "display.on.consent.screen" : "true"
+ },
+ "protocolMappers" : [ {
+ "id" : "7e2ae83b-388d-4f10-ab1f-37b84ebde9d6",
+ "name" : "role list",
+ "protocol" : "saml",
+ "protocolMapper" : "saml-role-list-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "single" : "false",
+ "attribute.nameformat" : "Basic",
+ "attribute.name" : "Role"
+ }
+ } ]
+ }, {
+ "id" : "036a72a9-c46f-40e8-8324-c30ba3ea671c",
+ "name" : "kvk",
+ "description" : "",
+ "protocol" : "openid-connect",
+ "attributes" : {
+ "include.in.token.scope" : "true",
+ "display.on.consent.screen" : "true",
+ "gui.order" : "",
+ "consent.screen.text" : ""
+ },
+ "protocolMappers" : [ {
+ "id" : "8cbdcd7a-239f-4f8c-ae19-6896a04bb680",
+ "name" : "kvk",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-attribute-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "introspection.token.claim" : "true",
+ "userinfo.token.claim" : "true",
+ "user.attribute" : "kvk",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "kvk",
+ "jsonType.label" : "String"
+ }
+ } ]
+ }, {
+ "id" : "b906f0fd-71de-43e6-959d-201c9a0d8cef",
+ "name" : "web-origins",
+ "description" : "OpenID Connect scope for add allowed web origins to the access token",
+ "protocol" : "openid-connect",
+ "attributes" : {
+ "include.in.token.scope" : "false",
+ "display.on.consent.screen" : "false",
+ "consent.screen.text" : ""
+ },
+ "protocolMappers" : [ {
+ "id" : "11c0d4eb-482e-4b8a-946d-63b268bf7fc9",
+ "name" : "allowed web origins",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-allowed-origins-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "introspection.token.claim" : "true",
+ "access.token.claim" : "true"
+ }
+ } ]
+ }, {
+ "id" : "89a1f6aa-a02f-48b6-b6ed-13d7521427d5",
+ "name" : "groups",
+ "description" : "Keycloak user groups",
+ "protocol" : "openid-connect",
+ "attributes" : {
+ "include.in.token.scope" : "true",
+ "display.on.consent.screen" : "false",
+ "gui.order" : "",
+ "consent.screen.text" : ""
+ },
+ "protocolMappers" : [ {
+ "id" : "4436cbb5-1460-447e-b0a8-ebe80ef7e873",
+ "name" : "groups",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-group-membership-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "full.path" : "false",
+ "introspection.token.claim" : "true",
+ "userinfo.token.claim" : "true",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "groups"
+ }
+ } ]
+ }, {
+ "id" : "0a26b3ef-c0eb-418c-85ca-6030c13e4182",
+ "name" : "microprofile-jwt",
+ "description" : "Microprofile - JWT built-in scope",
+ "protocol" : "openid-connect",
+ "attributes" : {
+ "include.in.token.scope" : "true",
+ "display.on.consent.screen" : "false"
+ },
+ "protocolMappers" : [ {
+ "id" : "13f9f62d-8be7-40bb-9507-f4fd9dd4168f",
+ "name" : "groups",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-realm-role-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "introspection.token.claim" : "true",
+ "multivalued" : "true",
+ "userinfo.token.claim" : "true",
+ "user.attribute" : "foo",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "groups",
+ "jsonType.label" : "String"
+ }
+ }, {
+ "id" : "51caccb7-1d50-4347-94d4-41ae1af2cea6",
+ "name" : "upn",
+ "protocol" : "openid-connect",
+ "protocolMapper" : "oidc-usermodel-attribute-mapper",
+ "consentRequired" : false,
+ "config" : {
+ "introspection.token.claim" : "true",
+ "userinfo.token.claim" : "true",
+ "user.attribute" : "username",
+ "id.token.claim" : "true",
+ "access.token.claim" : "true",
+ "claim.name" : "upn",
+ "jsonType.label" : "String"
+ }
+ } ]
+ }, {
+ "id" : "a1de3cd0-4499-4b82-86da-45c2f1c2eb5e",
+ "name" : "offline_access",
+ "description" : "OpenID Connect built-in scope: offline_access",
+ "protocol" : "openid-connect",
+ "attributes" : {
+ "consent.screen.text" : "${offlineAccessScopeConsentText}",
+ "display.on.consent.screen" : "true"
+ }
+ } ],
+ "defaultDefaultClientScopes" : [ "role_list", "profile", "email", "roles", "web-origins", "acr" ],
+ "defaultOptionalClientScopes" : [ "offline_access", "address", "phone", "microprofile-jwt" ],
+ "browserSecurityHeaders" : {
+ "contentSecurityPolicyReportOnly" : "",
+ "xContentTypeOptions" : "nosniff",
+ "referrerPolicy" : "no-referrer",
+ "xRobotsTag" : "none",
+ "xFrameOptions" : "SAMEORIGIN",
+ "contentSecurityPolicy" : "frame-src 'self'; frame-ancestors 'self'; object-src 'none';",
+ "xXSSProtection" : "1; mode=block",
+ "strictTransportSecurity" : "max-age=31536000; includeSubDomains"
+ },
+ "smtpServer" : { },
+ "eventsEnabled" : false,
+ "eventsListeners" : [ "jboss-logging" ],
+ "enabledEventTypes" : [ ],
+ "adminEventsEnabled" : false,
+ "adminEventsDetailsEnabled" : false,
+ "identityProviders" : [ ],
+ "identityProviderMappers" : [ ],
+ "components" : {
+ "org.keycloak.services.clientregistration.policy.ClientRegistrationPolicy" : [ {
+ "id" : "c47d8d87-0dda-4a91-a778-1ff4953d0c72",
+ "name" : "Max Clients Limit",
+ "providerId" : "max-clients",
+ "subType" : "anonymous",
+ "subComponents" : { },
+ "config" : {
+ "max-clients" : [ "200" ]
+ }
+ }, {
+ "id" : "2e42c404-90e4-4d4f-aae9-5de838dcf012",
+ "name" : "Trusted Hosts",
+ "providerId" : "trusted-hosts",
+ "subType" : "anonymous",
+ "subComponents" : { },
+ "config" : {
+ "host-sending-registration-request-must-match" : [ "true" ],
+ "client-uris-must-match" : [ "true" ]
+ }
+ }, {
+ "id" : "9545949f-87fd-4416-8f3b-a2be3203b43b",
+ "name" : "Full Scope Disabled",
+ "providerId" : "scope",
+ "subType" : "anonymous",
+ "subComponents" : { },
+ "config" : { }
+ }, {
+ "id" : "d7ed32b7-9bc0-4c22-af63-95e605fa571c",
+ "name" : "Allowed Protocol Mapper Types",
+ "providerId" : "allowed-protocol-mappers",
+ "subType" : "anonymous",
+ "subComponents" : { },
+ "config" : {
+ "allowed-protocol-mapper-types" : [ "saml-user-property-mapper", "oidc-address-mapper", "saml-role-list-mapper", "oidc-usermodel-attribute-mapper", "oidc-usermodel-property-mapper", "saml-user-attribute-mapper", "oidc-full-name-mapper", "oidc-sha256-pairwise-sub-mapper" ]
+ }
+ }, {
+ "id" : "c6b13ddf-1676-4e33-85d7-c778891156b3",
+ "name" : "Consent Required",
+ "providerId" : "consent-required",
+ "subType" : "anonymous",
+ "subComponents" : { },
+ "config" : { }
+ }, {
+ "id" : "28c52629-450d-4e79-a7ba-c4a28d1f9e7c",
+ "name" : "Allowed Client Scopes",
+ "providerId" : "allowed-client-templates",
+ "subType" : "authenticated",
+ "subComponents" : { },
+ "config" : {
+ "allow-default-scopes" : [ "true" ]
+ }
+ }, {
+ "id" : "1e4a85fd-6412-470d-9edf-562a8b8021b2",
+ "name" : "Allowed Protocol Mapper Types",
+ "providerId" : "allowed-protocol-mappers",
+ "subType" : "authenticated",
+ "subComponents" : { },
+ "config" : {
+ "allowed-protocol-mapper-types" : [ "saml-user-attribute-mapper", "oidc-usermodel-attribute-mapper", "saml-user-property-mapper", "oidc-sha256-pairwise-sub-mapper", "oidc-usermodel-property-mapper", "oidc-full-name-mapper", "saml-role-list-mapper", "oidc-address-mapper" ]
+ }
+ }, {
+ "id" : "9557d357-cc12-443e-bba6-a89e89b22c2e",
+ "name" : "Allowed Client Scopes",
+ "providerId" : "allowed-client-templates",
+ "subType" : "anonymous",
+ "subComponents" : { },
+ "config" : {
+ "allow-default-scopes" : [ "true" ]
+ }
+ } ],
+ "org.keycloak.keys.KeyProvider" : [ {
+ "id" : "8b83b45b-d80d-49c7-ae04-c3f4618c7514",
+ "name" : "aes-generated",
+ "providerId" : "aes-generated",
+ "subComponents" : { },
+ "config" : {
+ "kid" : [ "d993f461-f278-47ef-8c93-70488711ebfd" ],
+ "secret" : [ "o3i6s9I3iiVzLyDPxclUkg" ],
+ "priority" : [ "100" ]
+ }
+ }, {
+ "id" : "4a08d0a0-4d74-4b42-b18a-e06e27fc062b",
+ "name" : "hmac-generated",
+ "providerId" : "hmac-generated",
+ "subComponents" : { },
+ "config" : {
+ "kid" : [ "e715e051-6cdb-48cc-b4f4-f0722c81f9d3" ],
+ "secret" : [ "sR5n-Ep98RcqFydPbvUYTqdnwIB7742D09yUYMiB-OTsqTzoH5op0_KkVqNy9EYg-ibOR3QkvtcauTyjhaK7uw" ],
+ "priority" : [ "100" ],
+ "algorithm" : [ "HS256" ]
+ }
+ }, {
+ "id" : "4d6e8de3-aecf-4209-9922-a890eafa9691",
+ "name" : "rsa-generated",
+ "providerId" : "rsa-generated",
+ "subComponents" : { },
+ "config" : {
+ "privateKey" : [ "MIIEpAIBAAKCAQEA2DOZ0qHie73SuFVR7civrl6r82YUiAghfzaMowjCg0o06AF++2lIS7vNV/PbsVVznPAAMqVrNG+8CcevEzvVZMQD9nH4DI7xlOxK0lrYu8rmMeSfOvXVbBVsWBZe0jnGNukZqjwmRE5//ttJdxPfIBT5+2L6mguQbDfhSUEEdIW7y7UfOXvqLqEcBtoIEB+ORKDTUIQwGZM5mSCy+cY3cHvvZfZVgaUUy5NvujPRXTMje4n/hG0KfEV+40G9qC2/Xvx4EooJzBZ6FSThiWhCpwhIvzcQqB6M9lHW7nU6wADhYPNCa2OKWvphwZ/zbrF4B9dmS6Zli5rBvbox9Hh45wIDAQABAoIBAGshgp7zVbFgWdq6eGr9z0P1qHnnAtR3RvXs91pQHGaHLlkqaJw2yrqwWCu1bA7e23eQG2D9Q/aLSV+FQZUjyHVyhc4oIjRC3qWfQuIiXxQLEe72LQq/xx4ULYgmqZy9QSFzdyK6RHIDffww+CHXyG/yxP5SyP/tLAbb17f/TjBYLMoVcdDmn/wl4UWZMR7ZqFeGOGJWmFpHmeB3HBPU2TyzsTLF9ECgCw298qIKwH0kD3rvGZ+fXPRCX8bLqDkVNL/jDLT5Z/ITGmIUWaBAT/MFoMeuKvOG8NC82edNb7RukoHoXxVgVywbd9Cdlrzu5S0TAgg8qhTlAAx7PuLqyNECgYEA9zqS5smIu1iDwczqYbGxXab3wEVhfAZ/rHa2zB0/tMyZBWJjWlw3jrcNouWnRlxWXoUrcVe/NavKkRBMjlhITZ+nPA7kOQaZIpujulN6euKVgf57zcfhxc4SUeyxYwnOGQFErorP8UnuDYC8rK8tloPVyp3B+sXyZpHOjTtH0RcCgYEA39850L18FfqSN1oDRe01BCJNF0/OM++CFka+OyPkTI7GpmeeEobhY2VsTJuPGMw07uB9OWHOrfsxNbd3R5QO4Rd0svlfBpz8XtUCgWaHV3pNm+zprAf3Fq06Gk3KfO9QMO116fd7RS/RmsFhGIqFGRZ+IP0Tl02mA+ri7wQ3WLECgYAp8Ofm+x2VGskPYaIJfMmoJ6E0HxEQp1GVgnY0XmnmVCdJgI12UNqj/W30ypz8FMIaOuFJ0yb/BevRfEBgjZ2GfaUzTRtuiS4Fbv3xqCPJIRNYAEIkgNpOYk09VLgrIwixuUNbkPUB7BbUd5iKexVyyV7FhsnXrykWOXoe/4WJdQKBgQC03JDG1O50izSpRy0xxwt3xYZmePDsAGkmOgzhloOQXiCau0d3TES2mm++DEa1D/ULr407WIsy/6an8QqKZ1EGBH8hQFnG6/jvXENj60MYJxSgDexSMTUrutMgAQy/lk9A1/bVCD0sjg9WaThaLT6OIB/R4uN67x5aN98SnmNgYQKBgQClIzFFq6Ks2sqxn4PguvL1B4vnqetR4WJc9RvoKp+WAHcJD372B3N4i25n0kv7xyWgYUp25qj1SJL11NTsbiPdFzc4IYBEOwf7/y4l+ZRg2PSF96wZmuQdK3mwzUj9OiYkPUeYd6mtNVbgsCZLrr3Tvgd6NZMSeigFMfESiIpo6w==" ],
+ "keyUse" : [ "SIG" ],
+ "certificate" : [ "MIIClzCCAX8CBgGNeYaMLTANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANgzmdKh4nu90rhVUe3Ir65eq/NmFIgIIX82jKMIwoNKNOgBfvtpSEu7zVfz27FVc5zwADKlazRvvAnHrxM71WTEA/Zx+AyO8ZTsStJa2LvK5jHknzr11WwVbFgWXtI5xjbpGao8JkROf/7bSXcT3yAU+fti+poLkGw34UlBBHSFu8u1Hzl76i6hHAbaCBAfjkSg01CEMBmTOZkgsvnGN3B772X2VYGlFMuTb7oz0V0zI3uJ/4RtCnxFfuNBvagtv178eBKKCcwWehUk4YloQqcISL83EKgejPZR1u51OsAA4WDzQmtjilr6YcGf826xeAfXZkumZYuawb26MfR4eOcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAsnQG/Yi2g1XTCJn74hWv9MjxVAaZb4gBAc2AWm5VgAjhFEM9h6x6m1mQkq7JM4rIdAj8jw55Ok9CBVBIqq4G4cME3eUvVytkj2lC9zcRoAivjjZF2HPg7zNPa2TTR50asmHPRokppV6gewO/C+o5as+4P2zqDXBh61aRd/9kdQfkg14LBbH5/dYccAuvUqlTYC4IEPCvVmBNC1xsMjf0vohvoSjm9vL2bfqG/RJH0ScdCjOd5d2zju4/e2oVdluWm+vzKBQplc7tVMuKpn6LcLmVHiGNAl+EBIZH+WVLlTx0D1+kbHZsfLYG53lQg2LsvurRbWyF/a5fVM/oLTn5ag==" ],
+ "priority" : [ "100" ]
+ }
+ }, {
+ "id" : "d50865f3-256c-4fe2-b426-f8fe01b21381",
+ "name" : "rsa-enc-generated",
+ "providerId" : "rsa-enc-generated",
+ "subComponents" : { },
+ "config" : {
+ "privateKey" : [ "MIIEpAIBAAKCAQEApNvU3ecpVHbJT4bCOEpw6cnV1yi65tB3I0bRF2ilLVOY944QRAGnjBBECPIzNbgqavghYp1j75F2nq6/ny1CYfoaxTV2iDpRUw8/f7sliYbl8FrLLat0S25ItlZrg5TEJHObvOqlG2/nXoeH36MRWwNhms2uCqfhn5VgtenIzpQIBolnM7zzGp21NvdJ1C/ZAUzkXC+l3oQ+BXTtpEVM4h2KpYh4gfZJWCbYij5d1e1YApKD6V61/Cs3Oa2OY7CAUyq5kgAWJZFDB6CpzIr226u3bV7F9RbrQu3Ybc/Lv33EwykscLznKWZY2Mbs3Iz/rFNv3sVX/vHpH4DHWlKu7QIDAQABAoIBAAn84YwiHaBm4/Jj/S9Q3z9iwYhcCNrEBXvHJhLPfbZdyrYwzq54FTEIqT6Lgeu+wR8i8k7ZrzzL6M5bUvOvV8a80tNg1lIRimzITzYLXg5TdGnX7lhRe2W4hEI7wR7DLBDzShurcZ5UbMWO234CkKIdddPdoy41FpfHAoly5P4S48ZYqoEcx3V2g3S7XJ4pz2JE9bCF6c9PAiYWimIW6yJgopqjslMrkFxbyWhQir7tuulGSsLaHvX2wuHlKJ0GqNUQiVAd1xapmTleJstJ0OHFnfxn+2gHqiBc08c1IjNDpDmH/54nA8MQhMR8qMRIBO1OMzu7do5HKiSf25FfRacCgYEA6HUpKuo2k/2SjxSnYaHAozGiXdmCFf6mNuT0sCQdDu5ZxMmS2QLTLeH0BbFIXf98EXfFeqwBcA00PXpfc5Fo7fudxnMl/lVyqN+gGO/Sfo7sM+Ds/iXDvucE+vGpgcLEpMvvnFphs0ScPyE0mbbAbYVukKz5YrUgeL+d+I+Z938CgYEAtY4PKsvgRy1sD5WCZqoCRpoY2H3/MuLxDQUu8EAlU4ALyxBkEmaMAcXx+fIDT0X8ldCEoLcyy7800UdgxRbdKflT/lRTEW4CC/1slYpg1jPkkhYaCpsQG9G92dcAUaJWtCbLG0/9I3KFUOAhozKkvmz4gIyARw9bW28BY5Ym75MCgYEApHkRMb4Z88f8hKQWcivigxVBTqnxMuLEdB63SlGjBcd7WJNPBaDMDrDK2aRAEdIM1McrwMonEkMlbUJCeyCtX4UicyFSBowq3nWrbzlwc/9n/KTuyjuqLk6C5ZNLXfaS8A8jcDs62X54FurFruTxbgx02ISqxz5kxUq+2Pmx9L0CgYEArQtu92qFJTJs+dmWBcZrDuIXZlmJYPYfrTpQh9uL+C9mjjDcQRGOxq3lukbq0qcxXZX2o7yZZMulSweOe6wUNsqXPSUgW8+PkeAFm+7d56xkYr1AKvWq/+kE3FnpyuVBYMpM8oZmD2A7I1/Nj+BYV8xDezrvlUtU1yxRlZrrF5MCgYBUMysubXkyp2nqor+x8VExN0BIlDG+0I4XwcGrI47Sb8bNaVd39XuF4GSnLGxxJ7phSOzmlNGq20ssL6h9b8czq6l5l04q0g6w0IQiWvXiFT5fQ5B2NL3jiC1feqBhXppP6Ew60a0eK7LA+/QqQLvZHkbKW72L//8B/kFACcx69Q==" ],
+ "keyUse" : [ "ENC" ],
+ "certificate" : [ "MIIClzCCAX8CBgGNeYaMlzANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKTb1N3nKVR2yU+GwjhKcOnJ1dcouubQdyNG0RdopS1TmPeOEEQBp4wQRAjyMzW4Kmr4IWKdY++Rdp6uv58tQmH6GsU1dog6UVMPP3+7JYmG5fBayy2rdEtuSLZWa4OUxCRzm7zqpRtv516Hh9+jEVsDYZrNrgqn4Z+VYLXpyM6UCAaJZzO88xqdtTb3SdQv2QFM5Fwvpd6EPgV07aRFTOIdiqWIeIH2SVgm2Io+XdXtWAKSg+letfwrNzmtjmOwgFMquZIAFiWRQwegqcyK9turt21exfUW60Lt2G3Py799xMMpLHC85ylmWNjG7NyM/6xTb97FV/7x6R+Ax1pSru0CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAQGJHeTYSMvp0yndbIn7DLohO9lom5nRrx/bLyb7TiRfogyJEF6rQZ66CAkQFk5eMF878fsHTuMVjtmXVBnhojhVmK91HwjsNQu/8xR6QMXNKJQMvHR245vwUGxlWRw/36ObM1D7QjCd/q+FonpBEY4m5Y6Uz1U0HR2Cbh0E2afVlPLeV+F0LKrlyVMdIaWBGWftCGIKDAHaG/PD66zbAKtxerv2fBIDq100WHPhd57BZxX+2aGJp1IaRDgkxV0E/CjEy3+Knd8xbAgUSW0Tl6OTC75exIvlbzeluEBe0wlapAb7WvBKYsipSW8G8Ey7tjoolDT4AU82EaKUPstiMnA==" ],
+ "priority" : [ "100" ],
+ "algorithm" : [ "RSA-OAEP" ]
+ }
+ } ]
+ },
+ "internationalizationEnabled" : false,
+ "supportedLocales" : [ ],
+ "authenticationFlows" : [ {
+ "id" : "eade39e3-8a2f-4e07-a459-24085849cc7b",
+ "alias" : "Account verification options",
+ "description" : "Method with which to verity the existing account",
+ "providerId" : "basic-flow",
+ "topLevel" : false,
+ "builtIn" : true,
+ "authenticationExecutions" : [ {
+ "authenticator" : "idp-email-verification",
+ "authenticatorFlow" : false,
+ "requirement" : "ALTERNATIVE",
+ "priority" : 10,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ }, {
+ "authenticatorFlow" : true,
+ "requirement" : "ALTERNATIVE",
+ "priority" : 20,
+ "autheticatorFlow" : true,
+ "flowAlias" : "Verify Existing Account by Re-authentication",
+ "userSetupAllowed" : false
+ } ]
+ }, {
+ "id" : "4ba9c174-71c9-4c41-9c4f-c0c0961c2e60",
+ "alias" : "Browser - Conditional OTP",
+ "description" : "Flow to determine if the OTP is required for the authentication",
+ "providerId" : "basic-flow",
+ "topLevel" : false,
+ "builtIn" : true,
+ "authenticationExecutions" : [ {
+ "authenticator" : "conditional-user-configured",
+ "authenticatorFlow" : false,
+ "requirement" : "REQUIRED",
+ "priority" : 10,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ }, {
+ "authenticator" : "auth-otp-form",
+ "authenticatorFlow" : false,
+ "requirement" : "REQUIRED",
+ "priority" : 20,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ } ]
+ }, {
+ "id" : "3c863e05-422e-4048-b5df-8db9f407265c",
+ "alias" : "Direct Grant - Conditional OTP",
+ "description" : "Flow to determine if the OTP is required for the authentication",
+ "providerId" : "basic-flow",
+ "topLevel" : false,
+ "builtIn" : true,
+ "authenticationExecutions" : [ {
+ "authenticator" : "conditional-user-configured",
+ "authenticatorFlow" : false,
+ "requirement" : "REQUIRED",
+ "priority" : 10,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ }, {
+ "authenticator" : "direct-grant-validate-otp",
+ "authenticatorFlow" : false,
+ "requirement" : "REQUIRED",
+ "priority" : 20,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ } ]
+ }, {
+ "id" : "195520f1-5683-4d15-8512-722882436cb6",
+ "alias" : "First broker login - Conditional OTP",
+ "description" : "Flow to determine if the OTP is required for the authentication",
+ "providerId" : "basic-flow",
+ "topLevel" : false,
+ "builtIn" : true,
+ "authenticationExecutions" : [ {
+ "authenticator" : "conditional-user-configured",
+ "authenticatorFlow" : false,
+ "requirement" : "REQUIRED",
+ "priority" : 10,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ }, {
+ "authenticator" : "auth-otp-form",
+ "authenticatorFlow" : false,
+ "requirement" : "REQUIRED",
+ "priority" : 20,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ } ]
+ }, {
+ "id" : "ffb0fb4e-a5b3-47d2-a695-b458f0ae98e6",
+ "alias" : "Handle Existing Account",
+ "description" : "Handle what to do if there is existing account with same email/username like authenticated identity provider",
+ "providerId" : "basic-flow",
+ "topLevel" : false,
+ "builtIn" : true,
+ "authenticationExecutions" : [ {
+ "authenticator" : "idp-confirm-link",
+ "authenticatorFlow" : false,
+ "requirement" : "REQUIRED",
+ "priority" : 10,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ }, {
+ "authenticatorFlow" : true,
+ "requirement" : "REQUIRED",
+ "priority" : 20,
+ "autheticatorFlow" : true,
+ "flowAlias" : "Account verification options",
+ "userSetupAllowed" : false
+ } ]
+ }, {
+ "id" : "13083de7-5ca7-4090-a325-fac79ad8974a",
+ "alias" : "Reset - Conditional OTP",
+ "description" : "Flow to determine if the OTP should be reset or not. Set to REQUIRED to force.",
+ "providerId" : "basic-flow",
+ "topLevel" : false,
+ "builtIn" : true,
+ "authenticationExecutions" : [ {
+ "authenticator" : "conditional-user-configured",
+ "authenticatorFlow" : false,
+ "requirement" : "REQUIRED",
+ "priority" : 10,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ }, {
+ "authenticator" : "reset-otp",
+ "authenticatorFlow" : false,
+ "requirement" : "REQUIRED",
+ "priority" : 20,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ } ]
+ }, {
+ "id" : "2c726272-8443-4bb3-aede-e853348de93d",
+ "alias" : "User creation or linking",
+ "description" : "Flow for the existing/non-existing user alternatives",
+ "providerId" : "basic-flow",
+ "topLevel" : false,
+ "builtIn" : true,
+ "authenticationExecutions" : [ {
+ "authenticatorConfig" : "create unique user config",
+ "authenticator" : "idp-create-user-if-unique",
+ "authenticatorFlow" : false,
+ "requirement" : "ALTERNATIVE",
+ "priority" : 10,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ }, {
+ "authenticatorFlow" : true,
+ "requirement" : "ALTERNATIVE",
+ "priority" : 20,
+ "autheticatorFlow" : true,
+ "flowAlias" : "Handle Existing Account",
+ "userSetupAllowed" : false
+ } ]
+ }, {
+ "id" : "8c368b22-beaf-460f-852c-ed22a9f634e0",
+ "alias" : "Verify Existing Account by Re-authentication",
+ "description" : "Reauthentication of existing account",
+ "providerId" : "basic-flow",
+ "topLevel" : false,
+ "builtIn" : true,
+ "authenticationExecutions" : [ {
+ "authenticator" : "idp-username-password-form",
+ "authenticatorFlow" : false,
+ "requirement" : "REQUIRED",
+ "priority" : 10,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ }, {
+ "authenticatorFlow" : true,
+ "requirement" : "CONDITIONAL",
+ "priority" : 20,
+ "autheticatorFlow" : true,
+ "flowAlias" : "First broker login - Conditional OTP",
+ "userSetupAllowed" : false
+ } ]
+ }, {
+ "id" : "a513e259-143c-4ca5-8453-7b40b3adaca2",
+ "alias" : "browser",
+ "description" : "browser based authentication",
+ "providerId" : "basic-flow",
+ "topLevel" : true,
+ "builtIn" : true,
+ "authenticationExecutions" : [ {
+ "authenticator" : "auth-cookie",
+ "authenticatorFlow" : false,
+ "requirement" : "ALTERNATIVE",
+ "priority" : 10,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ }, {
+ "authenticator" : "auth-spnego",
+ "authenticatorFlow" : false,
+ "requirement" : "DISABLED",
+ "priority" : 20,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ }, {
+ "authenticator" : "identity-provider-redirector",
+ "authenticatorFlow" : false,
+ "requirement" : "ALTERNATIVE",
+ "priority" : 25,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ }, {
+ "authenticatorFlow" : true,
+ "requirement" : "ALTERNATIVE",
+ "priority" : 30,
+ "autheticatorFlow" : true,
+ "flowAlias" : "forms",
+ "userSetupAllowed" : false
+ } ]
+ }, {
+ "id" : "567fabf9-3a81-4994-82f2-32265b469f0a",
+ "alias" : "clients",
+ "description" : "Base authentication for clients",
+ "providerId" : "client-flow",
+ "topLevel" : true,
+ "builtIn" : true,
+ "authenticationExecutions" : [ {
+ "authenticator" : "client-secret",
+ "authenticatorFlow" : false,
+ "requirement" : "ALTERNATIVE",
+ "priority" : 10,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ }, {
+ "authenticator" : "client-jwt",
+ "authenticatorFlow" : false,
+ "requirement" : "ALTERNATIVE",
+ "priority" : 20,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ }, {
+ "authenticator" : "client-secret-jwt",
+ "authenticatorFlow" : false,
+ "requirement" : "ALTERNATIVE",
+ "priority" : 30,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ }, {
+ "authenticator" : "client-x509",
+ "authenticatorFlow" : false,
+ "requirement" : "ALTERNATIVE",
+ "priority" : 40,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ } ]
+ }, {
+ "id" : "9138d835-7470-40b8-bd87-9dea7dddf38b",
+ "alias" : "direct grant",
+ "description" : "OpenID Connect Resource Owner Grant",
+ "providerId" : "basic-flow",
+ "topLevel" : true,
+ "builtIn" : true,
+ "authenticationExecutions" : [ {
+ "authenticator" : "direct-grant-validate-username",
+ "authenticatorFlow" : false,
+ "requirement" : "REQUIRED",
+ "priority" : 10,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ }, {
+ "authenticator" : "direct-grant-validate-password",
+ "authenticatorFlow" : false,
+ "requirement" : "REQUIRED",
+ "priority" : 20,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ }, {
+ "authenticatorFlow" : true,
+ "requirement" : "CONDITIONAL",
+ "priority" : 30,
+ "autheticatorFlow" : true,
+ "flowAlias" : "Direct Grant - Conditional OTP",
+ "userSetupAllowed" : false
+ } ]
+ }, {
+ "id" : "27ebb1ca-e8b7-44ac-b012-8d580a323249",
+ "alias" : "docker auth",
+ "description" : "Used by Docker clients to authenticate against the IDP",
+ "providerId" : "basic-flow",
+ "topLevel" : true,
+ "builtIn" : true,
+ "authenticationExecutions" : [ {
+ "authenticator" : "docker-http-basic-authenticator",
+ "authenticatorFlow" : false,
+ "requirement" : "REQUIRED",
+ "priority" : 10,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ } ]
+ }, {
+ "id" : "1dfada24-8a57-4790-8e9b-537d5325f304",
+ "alias" : "first broker login",
+ "description" : "Actions taken after first broker login with identity provider account, which is not yet linked to any Keycloak account",
+ "providerId" : "basic-flow",
+ "topLevel" : true,
+ "builtIn" : true,
+ "authenticationExecutions" : [ {
+ "authenticatorConfig" : "review profile config",
+ "authenticator" : "idp-review-profile",
+ "authenticatorFlow" : false,
+ "requirement" : "REQUIRED",
+ "priority" : 10,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ }, {
+ "authenticatorFlow" : true,
+ "requirement" : "REQUIRED",
+ "priority" : 20,
+ "autheticatorFlow" : true,
+ "flowAlias" : "User creation or linking",
+ "userSetupAllowed" : false
+ } ]
+ }, {
+ "id" : "abdd8910-0519-418d-9bf6-d74350116737",
+ "alias" : "forms",
+ "description" : "Username, password, otp and other auth forms.",
+ "providerId" : "basic-flow",
+ "topLevel" : false,
+ "builtIn" : true,
+ "authenticationExecutions" : [ {
+ "authenticator" : "auth-username-password-form",
+ "authenticatorFlow" : false,
+ "requirement" : "REQUIRED",
+ "priority" : 10,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ }, {
+ "authenticatorFlow" : true,
+ "requirement" : "CONDITIONAL",
+ "priority" : 20,
+ "autheticatorFlow" : true,
+ "flowAlias" : "Browser - Conditional OTP",
+ "userSetupAllowed" : false
+ } ]
+ }, {
+ "id" : "1d657342-0a34-43b2-88a9-de018c0f2f3e",
+ "alias" : "registration",
+ "description" : "registration flow",
+ "providerId" : "basic-flow",
+ "topLevel" : true,
+ "builtIn" : true,
+ "authenticationExecutions" : [ {
+ "authenticator" : "registration-page-form",
+ "authenticatorFlow" : true,
+ "requirement" : "REQUIRED",
+ "priority" : 10,
+ "autheticatorFlow" : true,
+ "flowAlias" : "registration form",
+ "userSetupAllowed" : false
+ } ]
+ }, {
+ "id" : "e26131b1-5820-405b-98b5-5dd1ff5d146e",
+ "alias" : "registration form",
+ "description" : "registration form",
+ "providerId" : "form-flow",
+ "topLevel" : false,
+ "builtIn" : true,
+ "authenticationExecutions" : [ {
+ "authenticator" : "registration-user-creation",
+ "authenticatorFlow" : false,
+ "requirement" : "REQUIRED",
+ "priority" : 20,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ }, {
+ "authenticator" : "registration-password-action",
+ "authenticatorFlow" : false,
+ "requirement" : "REQUIRED",
+ "priority" : 50,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ }, {
+ "authenticator" : "registration-recaptcha-action",
+ "authenticatorFlow" : false,
+ "requirement" : "DISABLED",
+ "priority" : 60,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ } ]
+ }, {
+ "id" : "d7de4f38-5c54-434b-b429-109bc617d88e",
+ "alias" : "reset credentials",
+ "description" : "Reset credentials for a user if they forgot their password or something",
+ "providerId" : "basic-flow",
+ "topLevel" : true,
+ "builtIn" : true,
+ "authenticationExecutions" : [ {
+ "authenticator" : "reset-credentials-choose-user",
+ "authenticatorFlow" : false,
+ "requirement" : "REQUIRED",
+ "priority" : 10,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ }, {
+ "authenticator" : "reset-credential-email",
+ "authenticatorFlow" : false,
+ "requirement" : "REQUIRED",
+ "priority" : 20,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ }, {
+ "authenticator" : "reset-password",
+ "authenticatorFlow" : false,
+ "requirement" : "REQUIRED",
+ "priority" : 30,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ }, {
+ "authenticatorFlow" : true,
+ "requirement" : "CONDITIONAL",
+ "priority" : 40,
+ "autheticatorFlow" : true,
+ "flowAlias" : "Reset - Conditional OTP",
+ "userSetupAllowed" : false
+ } ]
+ }, {
+ "id" : "8a5af7f0-4be1-4a71-82e6-53b998ab9996",
+ "alias" : "saml ecp",
+ "description" : "SAML ECP Profile Authentication Flow",
+ "providerId" : "basic-flow",
+ "topLevel" : true,
+ "builtIn" : true,
+ "authenticationExecutions" : [ {
+ "authenticator" : "http-basic-authenticator",
+ "authenticatorFlow" : false,
+ "requirement" : "REQUIRED",
+ "priority" : 10,
+ "autheticatorFlow" : false,
+ "userSetupAllowed" : false
+ } ]
+ } ],
+ "authenticatorConfig" : [ {
+ "id" : "ad975f49-59a4-4091-9591-a533e4a9b162",
+ "alias" : "create unique user config",
+ "config" : {
+ "require.password.update.after.registration" : "false"
+ }
+ }, {
+ "id" : "f0a940bd-6086-461e-89c2-18dcebdc8f57",
+ "alias" : "review profile config",
+ "config" : {
+ "update.profile.on.first.login" : "missing"
+ }
+ } ],
+ "requiredActions" : [ {
+ "alias" : "CONFIGURE_TOTP",
+ "name" : "Configure OTP",
+ "providerId" : "CONFIGURE_TOTP",
+ "enabled" : true,
+ "defaultAction" : false,
+ "priority" : 10,
+ "config" : { }
+ }, {
+ "alias" : "TERMS_AND_CONDITIONS",
+ "name" : "Terms and Conditions",
+ "providerId" : "TERMS_AND_CONDITIONS",
+ "enabled" : false,
+ "defaultAction" : false,
+ "priority" : 20,
+ "config" : { }
+ }, {
+ "alias" : "UPDATE_PASSWORD",
+ "name" : "Update Password",
+ "providerId" : "UPDATE_PASSWORD",
+ "enabled" : true,
+ "defaultAction" : false,
+ "priority" : 30,
+ "config" : { }
+ }, {
+ "alias" : "UPDATE_PROFILE",
+ "name" : "Update Profile",
+ "providerId" : "UPDATE_PROFILE",
+ "enabled" : true,
+ "defaultAction" : false,
+ "priority" : 40,
+ "config" : { }
+ }, {
+ "alias" : "VERIFY_EMAIL",
+ "name" : "Verify Email",
+ "providerId" : "VERIFY_EMAIL",
+ "enabled" : true,
+ "defaultAction" : false,
+ "priority" : 50,
+ "config" : { }
+ }, {
+ "alias" : "delete_account",
+ "name" : "Delete Account",
+ "providerId" : "delete_account",
+ "enabled" : false,
+ "defaultAction" : false,
+ "priority" : 60,
+ "config" : { }
+ }, {
+ "alias" : "webauthn-register",
+ "name" : "Webauthn Register",
+ "providerId" : "webauthn-register",
+ "enabled" : true,
+ "defaultAction" : false,
+ "priority" : 70,
+ "config" : { }
+ }, {
+ "alias" : "webauthn-register-passwordless",
+ "name" : "Webauthn Register Passwordless",
+ "providerId" : "webauthn-register-passwordless",
+ "enabled" : true,
+ "defaultAction" : false,
+ "priority" : 80,
+ "config" : { }
+ }, {
+ "alias" : "update_user_locale",
+ "name" : "Update User Locale",
+ "providerId" : "update_user_locale",
+ "enabled" : true,
+ "defaultAction" : false,
+ "priority" : 1000,
+ "config" : { }
+ } ],
+ "browserFlow" : "browser",
+ "registrationFlow" : "registration",
+ "directGrantFlow" : "direct grant",
+ "resetCredentialsFlow" : "reset credentials",
+ "clientAuthenticationFlow" : "clients",
+ "dockerAuthenticationFlow" : "docker auth",
+ "attributes" : {
+ "cibaBackchannelTokenDeliveryMode" : "poll",
+ "cibaExpiresIn" : "120",
+ "cibaAuthRequestedUserHint" : "login_hint",
+ "oauth2DeviceCodeLifespan" : "600",
+ "clientOfflineSessionMaxLifespan" : "0",
+ "oauth2DevicePollingInterval" : "5",
+ "clientSessionIdleTimeout" : "0",
+ "parRequestUriLifespan" : "60",
+ "clientSessionMaxLifespan" : "0",
+ "clientOfflineSessionIdleTimeout" : "0",
+ "cibaInterval" : "5",
+ "realmReusableOtpCode" : "false"
+ },
+ "keycloakVersion" : "23.0.7",
+ "userManagedAccessAllowed" : false,
+ "clientProfiles" : {
+ "profiles" : [ ]
+ },
+ "clientPolicies" : {
+ "policies" : [ ]
+ }
+}
\ No newline at end of file
diff --git a/docs/configuration/authentication/oidc_digid.rst b/docs/configuration/authentication/oidc_digid.rst
index 0da24f2027..aa75d549f4 100644
--- a/docs/configuration/authentication/oidc_digid.rst
+++ b/docs/configuration/authentication/oidc_digid.rst
@@ -17,15 +17,31 @@ flow:
.. _configuration_oidc_digid_appgroup:
-Configureren van OIDC voor DigiD
-================================
+Configureren van OIDC-provider
+==============================
Contacteer de IAM beheerders in je organisatie om een *Client* aan te
maken in de omgeving van de OpenID Connect provider.
+**Redirect URI (vanaf Open Formulieren 2.7.0)**
+
+.. warning::
+
+ Zorg dat Open Formulieren :ref:`geïnstalleerd ` is met de
+ ``USE_LEGACY_DIGID_EH_OIDC_ENDPOINTS=false``
+ :ref:`omgevingsvariabele`, anders worden de legacy
+ (zie hieronder) endpoints gebruikt.
+
+Voor de **Redirect URI** vul je ``https://open-formulieren.gemeente.nl/auth/oidc/callback/`` in,
+waarbij je ``open-formulieren.gemeente.nl`` vervangt door het relevante domein.
+
+**Redirect URI (legacy)**
+
Voor de **Redirect URI** vul je ``https://open-formulieren.gemeente.nl/digid-oidc/callback/`` in,
waarbij je ``open-formulieren.gemeente.nl`` vervangt door het relevante domein.
+**Gegevens**
+
Aan het eind van dit proces moet je de volgende gegevens hebben:
* Server adres, bijvoorbeeld ``login.gemeente.nl``
diff --git a/docs/configuration/authentication/oidc_eherkenning.rst b/docs/configuration/authentication/oidc_eherkenning.rst
index 6d27ed7f05..13d47143a0 100644
--- a/docs/configuration/authentication/oidc_eherkenning.rst
+++ b/docs/configuration/authentication/oidc_eherkenning.rst
@@ -17,15 +17,31 @@ flow:
.. _configuration_oidc_eherkenning_appgroup:
-Configureren van OIDC voor eHerkenning
-======================================
+Configureren van OIDC-provider
+==============================
Contacteer de IAM beheerders in je organisatie om een *Client* aan te
maken in de omgeving van de OpenID Connect provider.
+**Redirect URI (vanaf Open Formulieren 2.7.0)**
+
+.. warning::
+
+ Zorg dat Open Formulieren :ref:`geïnstalleerd ` is met de
+ ``USE_LEGACY_DIGID_EH_OIDC_ENDPOINTS=false``
+ :ref:`omgevingsvariabele`, anders worden de legacy
+ (zie hieronder) endpoints gebruikt.
+
+Voor de **Redirect URI** vul je ``https://open-formulieren.gemeente.nl/auth/oidc/callback/`` in,
+waarbij je ``open-formulieren.gemeente.nl`` vervangt door het relevante domein.
+
+**Redirect URI (legacy)**
+
Voor de **Redirect URI** vul je ``https://open-formulieren.gemeente.nl/eherkenning-oidc/callback/`` in,
waarbij je ``open-formulieren.gemeente.nl`` vervangt door het relevante domein.
+**Gegevens**
+
Aan het eind van dit proces moet je de volgende gegevens hebben:
* Server adres, bijvoorbeeld ``login.gemeente.nl``
diff --git a/docs/configuration/authentication/oidc_machtigen.rst b/docs/configuration/authentication/oidc_machtigen.rst
index d9a3dcc2d3..2800af9070 100644
--- a/docs/configuration/authentication/oidc_machtigen.rst
+++ b/docs/configuration/authentication/oidc_machtigen.rst
@@ -4,15 +4,19 @@
OpenID Connect voor inloggen met DigiD Machtigen en eHerkenning bewindvoering
=============================================================================
-Open Formulieren ondersteunt `DigiD Machtigen`_ en eHerkenning bewindvoering login voor burgers via het OpenID Connect
-protocol (OIDC).
-Burgers kunnen inloggen op Open Formulieren met hun DigiD/eHerkenning account en een formulier invullen namens iemand
+Open Formulieren ondersteunt `DigiD Machtigen`_ en eHerkenning bewindvoering login voor
+burgers via het OpenID Connect protocol (OIDC). Burgers kunnen inloggen op Open
+Formulieren met hun DigiD/eHerkenning account en een formulier invullen namens iemand
anders. In deze flow:
-* Een gebruiker klikt op de knop *Inloggen met DigiD Machtigen* of *Inloggen met eHerkenning bewindvoering* die op de startpagina van een formulier staat.
-* De gebruiker wordt via de omgeving van de OpenID Connect provider (bijv. `Keycloak`_) naar DigiD/eHerkenning geleid, waar de gebruiker kan inloggen met *hun eigen* DigiD/eHerkenning inloggegevens.
+* Een gebruiker klikt op de knop *Inloggen met DigiD Machtigen* of *Inloggen met
+ eHerkenning bewindvoering* die op de startpagina van een formulier staat.
+* De gebruiker wordt via de omgeving van de OpenID Connect provider (bijv. `Keycloak`_)
+ naar DigiD/eHerkenning geleid, waar de gebruiker kan inloggen met *hun eigen*
+ DigiD/eHerkenning inloggegevens.
* De gebruiker kan dan kiezen namens wie ze het formulier willen invullen.
-* De gebruiker wordt daarna terug naar de OIDC omgeving gestuurd, die op zijn beurt de gebruiker weer terugstuurt naar Open Formulieren
+* De gebruiker wordt daarna terug naar de OIDC omgeving gestuurd, die op zijn beurt de
+ gebruiker weer terugstuurt naar Open Formulieren
* De gebruiker kan verder met het invullen van het formulier
.. _DigiD Machtigen: https://machtigen.digid.nl/
@@ -20,12 +24,13 @@ anders. In deze flow:
.. _configuration_oidc_digid_machtigen_appgroup:
-Configureren van OIDC voor DigiD Machtigen
-==========================================
+Configureren van OIDC-provider voor DigiD Machtigen
+===================================================
-De stappen hier zijn dezelfde als voor :ref:`configuration_oidc_digid_appgroup`, maar de **Redirect URI**
-is ``https://open-formulieren.gemeente.nl/digid-oidc-machtigen/callback/`` (met het juiste domein in plaats van
-``open-formulieren.gemeente.nl``).
+De stappen hier zijn dezelfde als voor :ref:`configuration_oidc_digid_appgroup`.
+
+.. warning:: Indien je de legacy **Redirect URI** gebruikt, dan is de waarde
+ ``https://open-formulieren.gemeente.nl/digid-machtigen-oidc/callback/``.
Aan het eind van dit proces moet u de volgende gegevens hebben:
@@ -60,12 +65,13 @@ Nu kan er een formulier aangemaakt worden met het authenticatie backend ``DigiD
.. _configuration_oidc_eh_bewindvoering_appgroup:
-Configureren van OIDC voor eHerkenning bewindvoering
-====================================================
+Configureren van OIDC-provider voor eHerkenning bewindvoering
+=============================================================
+
+De stappen hier zijn dezelfde als voor :ref:`configuration_oidc_digid_machtigen_appgroup`.
-De stappen hier zijn dezelfde als voor :ref:`configuration_oidc_digid_machtigen_appgroup`, maar de **Redirect URI**
-is ``https://open-formulieren.gemeente.nl/eherkenning-bewindvoering-oidc/callback/`` (met het juiste domein in plaats van
-``open-formulieren.gemeente.nl``).
+.. warning:: Indien je de legacy **Redirect URI** gebruikt, dan is de waarde
+ ``https://open-formulieren.gemeente.nl/eherkenning-bewindvoering-oidc/callback/``.
Aan het eind van dit proces moet u de volgende gegevens hebben:
diff --git a/docs/configuration/authentication/oidc_org.rst b/docs/configuration/authentication/oidc_org.rst
index 7e137fad8e..e95b091ad4 100644
--- a/docs/configuration/authentication/oidc_org.rst
+++ b/docs/configuration/authentication/oidc_org.rst
@@ -11,29 +11,41 @@ OpenID Connect for organization members
admins for the management interface, please go
:ref:`here `.
-Open Forms supports login on forms by *organization members* through Single Sign On (SSO) via the OpenID Connect protocol (OIDC).
+Open Forms supports login on forms by *organization members* through Single Sign On
+(SSO) via the OpenID Connect protocol (OIDC).
-Members of the organization can login to forms for internal use by the organization using the same OpenID Connect configuration that is used for the management interface.
+Members of the organization can login to forms for internal use by the organization
+using the same OpenID Connect configuration that is used for the management interface.
In this flow:
-1. The organization member clicks *Inloggen met OpenID Connect* on the internal form.
-2. The member gets redirected to the login flow of the OpenID Connect provider where the member logs in.
-3. After completion of the OpenID Connect provider login the member is redirected back to the form in Open Forms.
+1. The organization member clicks *Inloggen met OpenID Connect* on the (internal) form.
+2. The member gets redirected to the login flow of the OpenID Connect provider where
+ the member logs in.
+3. After completion of the OpenID Connect provider login the member is redirected back
+ to the form in Open Forms.
4. The member is now logged into Open Forms and can proceed to complete the form.
-5. Open Forms optionally stores the employee ID (from the OIDC claims) on the user record _and_ the form submission.
+5. Open Forms optionally stores the employee ID (from the OIDC claims) on the user
+ record *and* the form submission.
.. _configuration_authentication_oidc_org_appgroup:
Configuring OIDC for login of organization members
==================================================
-The OpenID Connect configuration is shared with :ref:`the configuration of the management interface ` and follows the same steps with a few addtional notes:
+The OpenID Connect configuration is shared with
+:ref:`the configuration of the management interface `
+and follows the same steps with a few addtional notes:
-- The plugin callback URL needs to be registered at the OpenID Connect provider. Contact the organizations IAM and ask them add to the whitelist ``https://open-formulieren.gemeente.nl/org-oidc/callback/`` (replace ``open-formulieren.gemeente.nl`` with the domain of your Open Forms installation).
+- It is not recommended to use the *Default groups* configuration option when using
+ OpenID Connect for organization members to authenticate on forms.
-- It is not recommended to use the *Default groups* configuration option when using OpenID Connect for organization members to authenticate on forms.
-
-- To store user information from OpenID and track an "Employee ID" it is required to configure the ``claim mapping``. This is JSON object where the claims from the OIDC user-info gets mapped to attributes on the user in Open Forms. For more info and options on configuring the mapping see `mozilla-django-oidc-db `_ (Section 4.1, User profile) and the documentation of your OpenID Connect provider for the structure of the returned user-info.
+- To store user information from OpenID and track an "Employee ID" it is required to
+ configure the ``claim mapping``. This is JSON object where the claims from the OIDC
+ user-info gets mapped to attributes on the user in Open Forms. For more info and
+ options on configuring the mapping see
+ `mozilla-django-oidc-db `_
+ (Section 4.1, User profile) and the documentation of your OpenID Connect provider for
+ the structure of the returned user-info.
Example:
@@ -46,13 +58,13 @@ The OpenID Connect configuration is shared with :ref:`the configuration of the m
"employee_id": "name_of_claim_with_employee_id"
}
- Note we set the ``employee_id`` to track the member on both the submission and the created user.
+ Note we set the ``employee_id`` to track the member on both the submission and the
+ created user.
- We recommend configuring the roles on the OIDC provider side together with the
``Groups glob pattern`` to automatically assign the correct groups when an employee
authenticates via OIDC. More information about permissions and groups is available
in the :ref:`manual ` (in Dutch).
-
-After completing these steps a form can be created with the authentication backend ``Organization via OpenID Connect``, see :ref:`manual_forms_basics`.
-
+After completing these steps a form can be created with the authentication backend
+``Organization via OpenID Connect``, see :ref:`manual_forms_basics`.
diff --git a/docs/configuration/general/oidc.rst b/docs/configuration/general/oidc.rst
index 116ae33c81..96bc289269 100644
--- a/docs/configuration/general/oidc.rst
+++ b/docs/configuration/general/oidc.rst
@@ -36,6 +36,21 @@ Configureren van OIDC-provider
Contacteer de IAM beheerders in je organisatie om een *Client* of *App* aan te
maken in de omgeving van de OpenID Connect provider.
+**Redirect URI (vanaf Open Formulieren 2.7.0)**
+
+.. warning::
+
+ Zorg dat Open Formulieren :ref:`geïnstalleerd ` is met de
+ ``USE_LEGACY_OIDC_ENDPOINTS=false`` en ``USE_LEGACY_ORG_OIDC_ENDPOINTS=false``
+ :ref:`omgevingsvariabelen`, anders worden de legacy
+ (zie hieronder) endpoints gebruikt.
+
+Voor de **Redirect URI** vul je ``https://open-formulieren.gemeente.nl/auth/oidc/callback/`` in,
+waarbij je ``open-formulieren.gemeente.nl`` vervangt door het relevante domein. Deze
+Redirect URI wordt ook gebruikt voor :ref:`configuration_authentication_oidc_org`.
+
+**Redirect URI (legacy)**
+
Voor de **Redirect URI** vul je ``https://open-formulieren.gemeente.nl/oidc/callback/`` in,
waarbij je ``open-formulieren.gemeente.nl`` vervangt door het relevante domein.
@@ -44,6 +59,8 @@ formulieren, voeg dan ook direct
``https://open-formulieren.gemeente.nl/oidc-org/callback/`` toe. Je kan hier
meer over lezen op :ref:`configuration_authentication_oidc_org`.
+**Gegevens**
+
Aan het eind van dit proces moet je de volgende gegevens hebben (on premise):
* Server adres, bijvoorbeeld ``login.gemeente.nl``
diff --git a/docs/developers/backend/tests.rst b/docs/developers/backend/tests.rst
index 0335d54186..1d4f341056 100644
--- a/docs/developers/backend/tests.rst
+++ b/docs/developers/backend/tests.rst
@@ -14,10 +14,10 @@ The testsuite uses Django's standard test mechanism:
.. code-block:: bash
- python src/manage.py test src --exclude=e2e
+ python src/manage.py test src --exclude-tag=e2e --exclude-tag=migrations
-will run all the tests discovered in the ``src`` directory, excluding
-:ref:`developers_backend_tests_e2e`.
+will run all the tests discovered in the ``src`` directory, excluding slow tests like
+:ref:`end-to-end ` and migration tests.
You can also limit the tests to run by python path:
diff --git a/docs/installation/config.rst b/docs/installation/config.rst
index 70a6c2b2df..d7d87aedd8 100644
--- a/docs/installation/config.rst
+++ b/docs/installation/config.rst
@@ -242,9 +242,6 @@ Other settings
* ``CACHE_AXES``: The Redis cache location for Axes (used to prevent brute
force attacks). Defaults to ``localhost:6379/0``.
-* ``CACHE_OIDC``: The Redis cache location for the OIDC configuration. Defaults
- to ``localhost:6379/0``.
-
* ``ENVIRONMENT``: Short string to indicate the environment (test, production,
etc.) Defaults to ``""``.
@@ -265,6 +262,23 @@ Other settings
enable :ref:`Organization accounts `. Defaults
to ``False``.
+* ``USE_LEGACY_OIDC_ENDPOINTS``: Defaults to ``True`` for backwards compatibility
+ reasons. New installations should opt-out. If ``False``, the OIDC callback URL is
+ ``/auth/oidc/callback/``, if ``True``, it is ``/oidc/callback/``.
+
+* ``USE_LEGACY_DIGID_EH_OIDC_ENDPOINTS``: Defaults to ``True`` for backwards compatibility
+ reasons. New installations should opt-out. If ``False``, the OIDC callback URL is
+ ``/auth/oidc/callback/``, if ``True``, they are:
+
+ - ``/digid-oidc/callback/``
+ - ``/eherkenning-oidc/callback/``
+ - ``/digid-machtigen-oidc/callback/``
+ - ``/eherkenning-bewindvoering-oidc/callback/``
+
+* ``USE_LEGACY_ORG_OIDC_ENDPOINTS``: Defaults to ``True`` for backwards compatibility
+ reasons. New installations should opt-out. If ``False``, the OIDC callback URL is
+ ``/auth/oidc/callback/``, if ``True``, it is ``/org-oidc/callback/``.
+
* ``SESSION_EXPIRE_AT_BROWSER_CLOSE``: Controls if sessions expire at browser close.
This applies to both the session of end-users filling out forms and staff using the
administrative interface. Enabling this forces users to log in every time they open
diff --git a/docs/installation/upgrade-250.rst b/docs/installation/upgrade-250.rst
index aed17957ce..1140dd1a3a 100644
--- a/docs/installation/upgrade-250.rst
+++ b/docs/installation/upgrade-250.rst
@@ -1,8 +1,8 @@
.. _installation_upgrade_250:
-====================================================
-Upgrade details to Open Forms 2.5.0 (IN DEVELOPMENT)
-====================================================
+===================================
+Upgrade details to Open Forms 2.5.0
+===================================
We do our best to avoid breaking changes, but at times we cannot guarantee that your
configuration will keep working flawlessly. Open Forms 2.5.0 is such a release - and
diff --git a/requirements/base.in b/requirements/base.in
index 6dc092495e..32e64765a5 100644
--- a/requirements/base.in
+++ b/requirements/base.in
@@ -46,7 +46,7 @@ django-capture-tag
django-colorfield
django-cookie-consent
django-cors-headers
-django-digid-eherkenning
+django-digid-eherkenning[oidc]
django-flags
django-hijack
django-import-export
diff --git a/requirements/base.txt b/requirements/base.txt
index ab2f8d4f78..74188ada00 100644
--- a/requirements/base.txt
+++ b/requirements/base.txt
@@ -161,8 +161,10 @@ django-csp==3.8
# via -r requirements/base.in
django-csp-reports==1.8.1
# via -r requirements/base.in
-django-digid-eherkenning==0.13.1
- # via -r requirements/base.in
+django-digid-eherkenning[oidc]==0.14.0
+ # via
+ # -r requirements/base.in
+ # django-digid-eherkenning
django-filter==23.2
# via -r requirements/base.in
django-flags==5.0.13
@@ -332,8 +334,10 @@ maykin-python3-saml==1.16.1
# via django-digid-eherkenning
mozilla-django-oidc==4.0.0
# via mozilla-django-oidc-db
-mozilla-django-oidc-db==0.15.0
- # via -r requirements/base.in
+mozilla-django-oidc-db==0.18.0
+ # via
+ # -r requirements/base.in
+ # django-digid-eherkenning
o365==2.0.31
# via -r requirements/base.in
oauthlib==3.2.2
@@ -507,6 +511,7 @@ typing-extensions==4.11.0
# via
# -r requirements/base.in
# asgiref
+ # mozilla-django-oidc-db
# qrcode
# schwifty
# zgw-consumers
diff --git a/requirements/ci.txt b/requirements/ci.txt
index f55bf4976f..8c243e6613 100644
--- a/requirements/ci.txt
+++ b/requirements/ci.txt
@@ -264,10 +264,11 @@ django-csp-reports==1.8.1
# via
# -c requirements/base.txt
# -r requirements/base.txt
-django-digid-eherkenning==0.13.1
+django-digid-eherkenning[oidc]==0.14.0
# via
# -c requirements/base.txt
# -r requirements/base.txt
+ # django-digid-eherkenning
django-filter==23.2
# via
# -c requirements/base.txt
@@ -613,10 +614,11 @@ mozilla-django-oidc==4.0.0
# -c requirements/base.txt
# -r requirements/base.txt
# mozilla-django-oidc-db
-mozilla-django-oidc-db==0.15.0
+mozilla-django-oidc-db==0.18.0
# via
# -c requirements/base.txt
# -r requirements/base.txt
+ # django-digid-eherkenning
multidict==6.0.4
# via yarl
mypy-extensions==0.4.3
@@ -1021,6 +1023,7 @@ typing-extensions==4.11.0
# -r requirements/base.txt
# asgiref
# black
+ # mozilla-django-oidc-db
# pyee
# qrcode
# schwifty
diff --git a/requirements/dev.txt b/requirements/dev.txt
index a8d9f0a135..f957268a4d 100644
--- a/requirements/dev.txt
+++ b/requirements/dev.txt
@@ -290,10 +290,11 @@ django-csp-reports==1.8.1
# -r requirements/ci.txt
django-debug-toolbar==4.3.0
# via -r requirements/dev.in
-django-digid-eherkenning==0.13.1
+django-digid-eherkenning[oidc]==0.14.0
# via
# -c requirements/ci.txt
# -r requirements/ci.txt
+ # django-digid-eherkenning
django-extensions==3.2.3
# via -r requirements/dev.in
django-filter==23.2
@@ -688,10 +689,11 @@ mozilla-django-oidc==4.0.0
# -c requirements/ci.txt
# -r requirements/ci.txt
# mozilla-django-oidc-db
-mozilla-django-oidc-db==0.15.0
+mozilla-django-oidc-db==0.18.0
# via
# -c requirements/ci.txt
# -r requirements/ci.txt
+ # django-digid-eherkenning
multidict==6.0.4
# via
# -c requirements/ci.txt
@@ -1189,6 +1191,7 @@ typing-extensions==4.11.0
# -r requirements/ci.txt
# asgiref
# black
+ # mozilla-django-oidc-db
# pyee
# qrcode
# schwifty
diff --git a/requirements/extensions.txt b/requirements/extensions.txt
index 82267e3fe4..710ec82d7d 100644
--- a/requirements/extensions.txt
+++ b/requirements/extensions.txt
@@ -230,10 +230,11 @@ django-csp-reports==1.8.1
# via
# -c requirements/base.in
# -r requirements/base.txt
-django-digid-eherkenning==0.13.1
+django-digid-eherkenning[oidc]==0.14.0
# via
# -c requirements/base.in
# -r requirements/base.txt
+ # django-digid-eherkenning
django-filter==23.2
# via
# -c requirements/base.in
@@ -510,10 +511,11 @@ mozilla-django-oidc==4.0.0
# via
# -r requirements/base.txt
# mozilla-django-oidc-db
-mozilla-django-oidc-db==0.15.0
+mozilla-django-oidc-db==0.18.0
# via
# -c requirements/base.in
# -r requirements/base.txt
+ # django-digid-eherkenning
o365==2.0.31
# via
# -c requirements/base.in
@@ -797,6 +799,7 @@ typing-extensions==4.11.0
# -c requirements/base.in
# -r requirements/base.txt
# asgiref
+ # mozilla-django-oidc-db
# qrcode
# schwifty
# zgw-consumers
diff --git a/src/digid_eherkenning_oidc_generics/__init__.py b/src/digid_eherkenning_oidc_generics/__init__.py
deleted file mode 100644
index a5e7acd93b..0000000000
--- a/src/digid_eherkenning_oidc_generics/__init__.py
+++ /dev/null
@@ -1,59 +0,0 @@
-"""
-DigiD-eHerkenning-OIDC-generics abstracts authenticating over OIDC.
-
-DigiD/eHerkenning are typically exposed via SAML bindings, but there exist identity
-providers that abstract this and instead offer an OpenID Connect flow to log in with
-DigiD and/or eHerkenning. This package facilitates integrating with such providers.
-
-The architecture and authentication flows are tricky in some places. Here's an attempt
-to explain it.
-
-**Configuration**
-
-Each authentication means (DigiD, eHerkenning, mandate (machtigen) variants...) is
-mapped to an OpenID client configuration, which roughly holds:
-
-- the OIDC endpoints to use/redirect users to
-- the OAUTH2 client ID and secret to use, which indicate to the IdP which authentication
- means they should send the user to
-- which claims to look up/extract from the UserInfo endpoint/JWT
-
-These are stored in (subclasses of) the
-:class:`~digid_herkenning_oidc_generics.models.OpenIDConnectBaseConfig` model.
-
-**Authentication flow**
-
-When a user starts a login flow, they:
-
-1. Click the appriopriate button/link
-2. A Django view processes this and looks up the relevant configuration
-3. The view redirects the user to the identity provider (typically a different domain)
-4. Authenticate with the IdP
-5. The IdP redirects back to our application
-6. Our callback view performs the OIDC exchange and extracts + stores the relevant user
- information
-7. Finally, the callback view looks up where the user needs to be redirected to and
- sends them that way.
-
-Steps 2-3 are called the "init" phase in this package, while steps 6-7 are the
-"callback" phase.
-
-**Init phase**
-
-The package supports the init phase by providing an
-:class:`~digid_eherkenning_oidc_generics.views.OIDCInit` 'view' class.
-
-.. autoclass:: digid_eherkenning_oidc_generics.views.OIDCInit
-
-Concrete views bound to configuration classes are:
-
-* :attr:`~digid_herkenning_oidc_generics.views.digid_init`
-* :attr:`~digid_herkenning_oidc_generics.views.digid_machtigen_init`
-* :attr:`~digid_herkenning_oidc_generics.views.eherkenning_init`
-* :attr:`~digid_herkenning_oidc_generics.views.eherkenning_bewindvoering_init`
-
-**Callback phase**
-
-TODO
-
-"""
diff --git a/src/digid_eherkenning_oidc_generics/admin.py b/src/digid_eherkenning_oidc_generics/admin.py
deleted file mode 100644
index 6b23a53e1e..0000000000
--- a/src/digid_eherkenning_oidc_generics/admin.py
+++ /dev/null
@@ -1,205 +0,0 @@
-from django.contrib import admin
-from django.utils.translation import gettext_lazy as _
-
-from solo.admin import SingletonModelAdmin
-
-from .forms import (
- OpenIDConnectDigiDMachtigenConfigForm,
- OpenIDConnectEHerkenningBewindvoeringConfigForm,
- OpenIDConnectEHerkenningConfigForm,
- OpenIDConnectPublicConfigForm,
-)
-from .models import (
- OpenIDConnectDigiDMachtigenConfig,
- OpenIDConnectEHerkenningBewindvoeringConfig,
- OpenIDConnectEHerkenningConfig,
- OpenIDConnectPublicConfig,
-)
-
-
-class OpenIDConnectConfigBaseAdmin(SingletonModelAdmin):
- fieldsets = (
- (
- _("Activation"),
- {"fields": ("enabled",)},
- ),
- (
- _("Common settings"),
- {
- "fields": (
- "identifier_claim_name",
- "oidc_rp_client_id",
- "oidc_rp_client_secret",
- "oidc_rp_scopes_list",
- "oidc_rp_sign_algo",
- "oidc_rp_idp_sign_key",
- )
- },
- ),
- (
- _("Endpoints"),
- {
- "fields": (
- "oidc_op_discovery_endpoint",
- "oidc_op_jwks_endpoint",
- "oidc_op_authorization_endpoint",
- "oidc_op_token_endpoint",
- "oidc_token_use_basic_auth",
- "oidc_op_user_endpoint",
- "oidc_op_logout_endpoint",
- )
- },
- ),
- (_("Keycloak specific settings"), {"fields": ("oidc_keycloak_idp_hint",)}),
- (
- _("Advanced settings"),
- {
- "fields": (
- "oidc_use_nonce",
- "oidc_nonce_size",
- "oidc_state_size",
- "oidc_exempt_urls",
- "userinfo_claims_source",
- ),
- "classes": [
- "collapse in",
- ],
- },
- ),
- )
-
-
-@admin.register(OpenIDConnectPublicConfig)
-class OpenIDConnectConfigDigiDAdmin(OpenIDConnectConfigBaseAdmin):
- form = OpenIDConnectPublicConfigForm
-
-
-@admin.register(OpenIDConnectEHerkenningConfig)
-class OpenIDConnectConfigEHerkenningAdmin(OpenIDConnectConfigBaseAdmin):
- form = OpenIDConnectEHerkenningConfigForm
-
-
-@admin.register(OpenIDConnectDigiDMachtigenConfig)
-class OpenIDConnectConfigDigiDMachtigenAdmin(SingletonModelAdmin):
- form = OpenIDConnectDigiDMachtigenConfigForm
-
- fieldsets = (
- (
- _("Activation"),
- {"fields": ("enabled",)},
- ),
- (
- _("Common settings"),
- {
- "fields": (
- "oidc_rp_client_id",
- "oidc_rp_client_secret",
- "oidc_rp_scopes_list",
- "oidc_rp_sign_algo",
- "oidc_rp_idp_sign_key",
- )
- },
- ),
- (
- _("Attributes to extract from claim"),
- {
- "fields": (
- "vertegenwoordigde_claim_name",
- "gemachtigde_claim_name",
- )
- },
- ),
- (
- _("Endpoints"),
- {
- "fields": (
- "oidc_op_discovery_endpoint",
- "oidc_op_jwks_endpoint",
- "oidc_op_authorization_endpoint",
- "oidc_op_token_endpoint",
- "oidc_token_use_basic_auth",
- "oidc_op_user_endpoint",
- "oidc_op_logout_endpoint",
- )
- },
- ),
- (_("Keycloak specific settings"), {"fields": ("oidc_keycloak_idp_hint",)}),
- (
- _("Advanced settings"),
- {
- "fields": (
- "oidc_use_nonce",
- "oidc_nonce_size",
- "oidc_state_size",
- "oidc_exempt_urls",
- "userinfo_claims_source",
- ),
- "classes": [
- "collapse in",
- ],
- },
- ),
- )
-
-
-@admin.register(OpenIDConnectEHerkenningBewindvoeringConfig)
-class OpenIDConnectConfigEHerkenningBewindvoeringAdmin(SingletonModelAdmin):
- form = OpenIDConnectEHerkenningBewindvoeringConfigForm
-
- fieldsets = (
- (
- _("Activation"),
- {"fields": ("enabled",)},
- ),
- (
- _("Common settings"),
- {
- "fields": (
- "oidc_rp_client_id",
- "oidc_rp_client_secret",
- "oidc_rp_scopes_list",
- "oidc_rp_sign_algo",
- "oidc_rp_idp_sign_key",
- )
- },
- ),
- (
- _("Attributes to extract from claim"),
- {
- "fields": (
- "vertegenwoordigde_company_claim_name",
- "gemachtigde_person_claim_name",
- )
- },
- ),
- (
- _("Endpoints"),
- {
- "fields": (
- "oidc_op_discovery_endpoint",
- "oidc_op_jwks_endpoint",
- "oidc_op_authorization_endpoint",
- "oidc_op_token_endpoint",
- "oidc_token_use_basic_auth",
- "oidc_op_user_endpoint",
- "oidc_op_logout_endpoint",
- )
- },
- ),
- (_("Keycloak specific settings"), {"fields": ("oidc_keycloak_idp_hint",)}),
- (
- _("Advanced settings"),
- {
- "fields": (
- "oidc_use_nonce",
- "oidc_nonce_size",
- "oidc_state_size",
- "oidc_exempt_urls",
- "userinfo_claims_source",
- ),
- "classes": [
- "collapse in",
- ],
- },
- ),
- )
diff --git a/src/digid_eherkenning_oidc_generics/apps.py b/src/digid_eherkenning_oidc_generics/apps.py
deleted file mode 100644
index 77906b4bb5..0000000000
--- a/src/digid_eherkenning_oidc_generics/apps.py
+++ /dev/null
@@ -1,7 +0,0 @@
-from django.apps import AppConfig
-from django.utils.translation import gettext_lazy as _
-
-
-class DigiDeHerkenningOIDCAppConfig(AppConfig):
- name = "digid_eherkenning_oidc_generics"
- verbose_name = _("DigiD & eHerkenning via OpenID Connect")
diff --git a/src/digid_eherkenning_oidc_generics/backends.py b/src/digid_eherkenning_oidc_generics/backends.py
deleted file mode 100644
index 091f33781a..0000000000
--- a/src/digid_eherkenning_oidc_generics/backends.py
+++ /dev/null
@@ -1,31 +0,0 @@
-import logging
-
-from django.contrib.auth.models import AnonymousUser
-from django.core.exceptions import SuspiciousOperation
-
-from mozilla_django_oidc_db.backends import (
- OIDCAuthenticationBackend as _OIDCAuthenticationBackend,
-)
-
-logger = logging.getLogger(__name__)
-
-
-class OIDCAuthenticationBackend(_OIDCAuthenticationBackend):
- session_key = ""
- config_identifier_field = "identifier_claim_name"
-
- def extract_claims(self, payload):
- self.request.session[self.session_key] = self.retrieve_identifier_claim(payload)
-
- def get_or_create_user(self, access_token, id_token, payload):
- user_info = self.get_userinfo(access_token, id_token, payload)
- claims_verified = self.verify_claims(user_info)
- if not claims_verified:
- msg = "Claims verification failed"
- raise SuspiciousOperation(msg)
-
- self.extract_claims(payload)
-
- user = AnonymousUser()
- user.is_active = True
- return user
diff --git a/src/digid_eherkenning_oidc_generics/exceptions.py b/src/digid_eherkenning_oidc_generics/exceptions.py
deleted file mode 100644
index e4e8527ff6..0000000000
--- a/src/digid_eherkenning_oidc_generics/exceptions.py
+++ /dev/null
@@ -1,2 +0,0 @@
-class OIDCProviderOutage(Exception):
- pass
diff --git a/src/digid_eherkenning_oidc_generics/forms.py b/src/digid_eherkenning_oidc_generics/forms.py
deleted file mode 100644
index 29c2ed0fc0..0000000000
--- a/src/digid_eherkenning_oidc_generics/forms.py
+++ /dev/null
@@ -1,81 +0,0 @@
-from copy import deepcopy
-
-from django.core.validators import ValidationError
-from django.utils.translation import gettext_lazy as _
-
-from mozilla_django_oidc_db.constants import OIDC_MAPPING as _OIDC_MAPPING
-from mozilla_django_oidc_db.forms import OpenIDConnectConfigForm
-
-from openforms.forms.models import Form
-
-from .models import (
- OpenIDConnectDigiDMachtigenConfig,
- OpenIDConnectEHerkenningBewindvoeringConfig,
- OpenIDConnectEHerkenningConfig,
- OpenIDConnectPublicConfig,
-)
-
-OIDC_MAPPING = deepcopy(_OIDC_MAPPING)
-
-OIDC_MAPPING["oidc_op_logout_endpoint"] = "end_session_endpoint"
-
-
-class OpenIDConnectBaseConfigForm(OpenIDConnectConfigForm):
- required_endpoints = [
- "oidc_op_authorization_endpoint",
- "oidc_op_token_endpoint",
- "oidc_op_user_endpoint",
- "oidc_op_logout_endpoint",
- ]
- oidc_mapping = OIDC_MAPPING
- plugin_identifier = ""
-
- def clean_enabled(self):
- enabled = self.cleaned_data["enabled"]
-
- if not enabled:
- forms_with_backend = Form.objects.filter(
- authentication_backends__contains=[self.plugin_identifier]
- )
-
- if forms_with_backend.exists():
- raise ValidationError(
- _(
- "{plugin_identifier} is selected as authentication backend "
- "for one or more forms, please remove this backend from these "
- "forms before disabling this authentication backend."
- ).format(plugin_identifier=self.plugin_identifier)
- )
- return enabled
-
-
-class OpenIDConnectPublicConfigForm(OpenIDConnectBaseConfigForm):
- plugin_identifier = "digid_oidc"
-
- class Meta:
- model = OpenIDConnectPublicConfig
- fields = "__all__"
-
-
-class OpenIDConnectEHerkenningConfigForm(OpenIDConnectBaseConfigForm):
- plugin_identifier = "eherkenning_oidc"
-
- class Meta:
- model = OpenIDConnectEHerkenningConfig
- fields = "__all__"
-
-
-class OpenIDConnectDigiDMachtigenConfigForm(OpenIDConnectBaseConfigForm):
- plugin_identifier = "digid_machtigen_oidc"
-
- class Meta:
- model = OpenIDConnectDigiDMachtigenConfig
- fields = "__all__"
-
-
-class OpenIDConnectEHerkenningBewindvoeringConfigForm(OpenIDConnectBaseConfigForm):
- plugin_identifier = "eherkenning_bewindvoering_oidc"
-
- class Meta:
- model = OpenIDConnectEHerkenningBewindvoeringConfig
- fields = "__all__"
diff --git a/src/digid_eherkenning_oidc_generics/migrations/0001_initial_squashed_0007_auto_20221213_1347.py b/src/digid_eherkenning_oidc_generics/migrations/0001_initial_squashed_0007_auto_20221213_1347.py
deleted file mode 100644
index ac77fcb7ea..0000000000
--- a/src/digid_eherkenning_oidc_generics/migrations/0001_initial_squashed_0007_auto_20221213_1347.py
+++ /dev/null
@@ -1,801 +0,0 @@
-# Generated by Django 3.2.20 on 2023-09-08 10:43
-
-from django.db import migrations, models
-
-import django_jsonform.models.fields
-import mozilla_django_oidc_db.models
-
-import digid_eherkenning_oidc_generics.models
-
-
-class Migration(migrations.Migration):
- dependencies = []
-
- operations = [
- migrations.CreateModel(
- name="OpenIDConnectDigiDMachtigenConfig",
- fields=[
- (
- "id",
- models.AutoField(
- auto_created=True,
- primary_key=True,
- serialize=False,
- verbose_name="ID",
- ),
- ),
- (
- "enabled",
- models.BooleanField(
- default=False,
- help_text="Indicates whether OpenID Connect for authentication/authorization is enabled",
- verbose_name="enable",
- ),
- ),
- (
- "oidc_rp_client_id",
- models.CharField(
- help_text="OpenID Connect client ID provided by the OIDC Provider",
- max_length=1000,
- verbose_name="OpenID Connect client ID",
- ),
- ),
- (
- "oidc_rp_client_secret",
- models.CharField(
- help_text="OpenID Connect secret provided by the OIDC Provider",
- max_length=1000,
- verbose_name="OpenID Connect secret",
- ),
- ),
- (
- "oidc_rp_sign_algo",
- models.CharField(
- default="HS256",
- help_text="Algorithm the Identity Provider uses to sign ID tokens",
- max_length=50,
- verbose_name="OpenID sign algorithm",
- ),
- ),
- (
- "oidc_op_discovery_endpoint",
- models.URLField(
- blank=True,
- help_text="URL of your OpenID Connect provider discovery endpoint ending with a slash (`.well-known/...` will be added automatically). If this is provided, the remaining endpoints can be omitted, as they will be derived from this endpoint.",
- max_length=1000,
- verbose_name="Discovery endpoint",
- ),
- ),
- (
- "oidc_op_jwks_endpoint",
- models.URLField(
- blank=True,
- help_text="URL of your OpenID Connect provider JSON Web Key Set endpoint. Required if `RS256` is used as signing algorithm.",
- max_length=1000,
- verbose_name="JSON Web Key Set endpoint",
- ),
- ),
- (
- "oidc_op_authorization_endpoint",
- models.URLField(
- help_text="URL of your OpenID Connect provider authorization endpoint",
- max_length=1000,
- verbose_name="Authorization endpoint",
- ),
- ),
- (
- "oidc_op_token_endpoint",
- models.URLField(
- help_text="URL of your OpenID Connect provider token endpoint",
- max_length=1000,
- verbose_name="Token endpoint",
- ),
- ),
- (
- "oidc_op_user_endpoint",
- models.URLField(
- help_text="URL of your OpenID Connect provider userinfo endpoint",
- max_length=1000,
- verbose_name="User endpoint",
- ),
- ),
- (
- "oidc_rp_idp_sign_key",
- models.CharField(
- blank=True,
- help_text="Key the Identity Provider uses to sign ID tokens in the case of an RSA sign algorithm. Should be the signing key in PEM or DER format.",
- max_length=1000,
- verbose_name="Sign key",
- ),
- ),
- (
- "oidc_op_logout_endpoint",
- models.URLField(
- blank=True,
- help_text="URL of your OpenID Connect provider logout endpoint",
- max_length=1000,
- verbose_name="Logout endpoint",
- ),
- ),
- (
- "oidc_keycloak_idp_hint",
- models.CharField(
- blank=True,
- help_text="Specific for Keycloak: parameter that indicates which identity provider should be used (therefore skipping the Keycloak login screen).",
- max_length=1000,
- verbose_name="Keycloak Identity Provider hint",
- ),
- ),
- (
- "vertegenwoordigde_claim_name",
- models.CharField(
- default="aanvrager.bsn",
- help_text="Name of the claim in which the BSN of the person being represented is stored",
- max_length=50,
- verbose_name="vertegenwoordigde claim name",
- ),
- ),
- (
- "gemachtigde_claim_name",
- models.CharField(
- default="gemachtigde.bsn",
- help_text="Name of the claim in which the BSN of the person representing someone else is stored",
- max_length=50,
- verbose_name="gemachtigde claim name",
- ),
- ),
- (
- "oidc_rp_scopes_list",
- django_jsonform.models.fields.ArrayField(
- base_field=models.CharField(
- max_length=50, verbose_name="OpenID Connect scope"
- ),
- blank=True,
- default=digid_eherkenning_oidc_generics.models.get_default_scopes_bsn,
- help_text="OpenID Connect scopes that are requested during login. These scopes are hardcoded and must be supported by the identity provider",
- size=None,
- verbose_name="OpenID Connect scopes",
- ),
- ),
- (
- "oidc_exempt_urls",
- django_jsonform.models.fields.ArrayField(
- base_field=models.CharField(
- max_length=1000, verbose_name="Exempt URL"
- ),
- blank=True,
- default=list,
- help_text="This is a list of absolute url paths, regular expressions for url paths, or Django view names. This plus the mozilla-django-oidc urls are exempted from the session renewal by the SessionRefresh middleware.",
- size=None,
- verbose_name="URLs exempt from session renewal",
- ),
- ),
- (
- "oidc_nonce_size",
- models.PositiveIntegerField(
- default=32,
- help_text="Sets the length of the random string used for OpenID Connect nonce verification",
- verbose_name="Nonce size",
- ),
- ),
- (
- "oidc_state_size",
- models.PositiveIntegerField(
- default=32,
- help_text="Sets the length of the random string used for OpenID Connect state verification",
- verbose_name="State size",
- ),
- ),
- (
- "oidc_use_nonce",
- models.BooleanField(
- default=True,
- help_text="Controls whether the OpenID Connect client uses nonce verification",
- verbose_name="Use nonce",
- ),
- ),
- (
- "userinfo_claims_source",
- models.CharField(
- choices=[
- ("userinfo_endpoint", "Userinfo endpoint"),
- ("id_token", "ID token"),
- ],
- default="userinfo_endpoint",
- help_text="Indicates the source from which the user information claims should be extracted.",
- max_length=100,
- verbose_name="user information claims extracted from",
- ),
- ),
- ],
- options={
- "verbose_name": "OpenID Connect configuration for DigiD Machtigen",
- },
- bases=(mozilla_django_oidc_db.models.CachingMixin, models.Model),
- ),
- migrations.CreateModel(
- name="OpenIDConnectEHerkenningBewindvoeringConfig",
- fields=[
- (
- "id",
- models.AutoField(
- auto_created=True,
- primary_key=True,
- serialize=False,
- verbose_name="ID",
- ),
- ),
- (
- "enabled",
- models.BooleanField(
- default=False,
- help_text="Indicates whether OpenID Connect for authentication/authorization is enabled",
- verbose_name="enable",
- ),
- ),
- (
- "oidc_rp_client_id",
- models.CharField(
- help_text="OpenID Connect client ID provided by the OIDC Provider",
- max_length=1000,
- verbose_name="OpenID Connect client ID",
- ),
- ),
- (
- "oidc_rp_client_secret",
- models.CharField(
- help_text="OpenID Connect secret provided by the OIDC Provider",
- max_length=1000,
- verbose_name="OpenID Connect secret",
- ),
- ),
- (
- "oidc_rp_sign_algo",
- models.CharField(
- default="HS256",
- help_text="Algorithm the Identity Provider uses to sign ID tokens",
- max_length=50,
- verbose_name="OpenID sign algorithm",
- ),
- ),
- (
- "oidc_op_discovery_endpoint",
- models.URLField(
- blank=True,
- help_text="URL of your OpenID Connect provider discovery endpoint ending with a slash (`.well-known/...` will be added automatically). If this is provided, the remaining endpoints can be omitted, as they will be derived from this endpoint.",
- max_length=1000,
- verbose_name="Discovery endpoint",
- ),
- ),
- (
- "oidc_op_jwks_endpoint",
- models.URLField(
- blank=True,
- help_text="URL of your OpenID Connect provider JSON Web Key Set endpoint. Required if `RS256` is used as signing algorithm.",
- max_length=1000,
- verbose_name="JSON Web Key Set endpoint",
- ),
- ),
- (
- "oidc_op_authorization_endpoint",
- models.URLField(
- help_text="URL of your OpenID Connect provider authorization endpoint",
- max_length=1000,
- verbose_name="Authorization endpoint",
- ),
- ),
- (
- "oidc_op_token_endpoint",
- models.URLField(
- help_text="URL of your OpenID Connect provider token endpoint",
- max_length=1000,
- verbose_name="Token endpoint",
- ),
- ),
- (
- "oidc_op_user_endpoint",
- models.URLField(
- help_text="URL of your OpenID Connect provider userinfo endpoint",
- max_length=1000,
- verbose_name="User endpoint",
- ),
- ),
- (
- "oidc_rp_idp_sign_key",
- models.CharField(
- blank=True,
- help_text="Key the Identity Provider uses to sign ID tokens in the case of an RSA sign algorithm. Should be the signing key in PEM or DER format.",
- max_length=1000,
- verbose_name="Sign key",
- ),
- ),
- (
- "oidc_use_nonce",
- models.BooleanField(
- default=True,
- help_text="Controls whether the OpenID Connect client uses nonce verification",
- verbose_name="Use nonce",
- ),
- ),
- (
- "oidc_nonce_size",
- models.PositiveIntegerField(
- default=32,
- help_text="Sets the length of the random string used for OpenID Connect nonce verification",
- verbose_name="Nonce size",
- ),
- ),
- (
- "oidc_state_size",
- models.PositiveIntegerField(
- default=32,
- help_text="Sets the length of the random string used for OpenID Connect state verification",
- verbose_name="State size",
- ),
- ),
- (
- "oidc_exempt_urls",
- django_jsonform.models.fields.ArrayField(
- base_field=models.CharField(
- max_length=1000, verbose_name="Exempt URL"
- ),
- blank=True,
- default=list,
- help_text="This is a list of absolute url paths, regular expressions for url paths, or Django view names. This plus the mozilla-django-oidc urls are exempted from the session renewal by the SessionRefresh middleware.",
- size=None,
- verbose_name="URLs exempt from session renewal",
- ),
- ),
- (
- "oidc_op_logout_endpoint",
- models.URLField(
- blank=True,
- help_text="URL of your OpenID Connect provider logout endpoint",
- max_length=1000,
- verbose_name="Logout endpoint",
- ),
- ),
- (
- "oidc_keycloak_idp_hint",
- models.CharField(
- blank=True,
- help_text="Specific for Keycloak: parameter that indicates which identity provider should be used (therefore skipping the Keycloak login screen).",
- max_length=1000,
- verbose_name="Keycloak Identity Provider hint",
- ),
- ),
- (
- "vertegenwoordigde_company_claim_name",
- models.CharField(
- default="aanvrager.kvk",
- help_text="Name of the claim in which the KVK of the company being represented is stored",
- max_length=50,
- verbose_name="vertegenwoordigde company claim name",
- ),
- ),
- (
- "gemachtigde_person_claim_name",
- models.CharField(
- default="gemachtigde.pseudoID",
- help_text="Name of the claim in which the ID of the person representing a company is stored",
- max_length=50,
- verbose_name="gemachtigde person claim name",
- ),
- ),
- (
- "oidc_rp_scopes_list",
- django_jsonform.models.fields.ArrayField(
- base_field=models.CharField(
- max_length=50, verbose_name="OpenID Connect scope"
- ),
- blank=True,
- default=digid_eherkenning_oidc_generics.models.get_default_scopes_bsn,
- help_text="OpenID Connect scopes that are requested during login. These scopes are hardcoded and must be supported by the identity provider",
- size=None,
- verbose_name="OpenID Connect scopes",
- ),
- ),
- (
- "userinfo_claims_source",
- models.CharField(
- choices=[
- ("userinfo_endpoint", "Userinfo endpoint"),
- ("id_token", "ID token"),
- ],
- default="userinfo_endpoint",
- help_text="Indicates the source from which the user information claims should be extracted.",
- max_length=100,
- verbose_name="user information claims extracted from",
- ),
- ),
- ],
- options={
- "verbose_name": "OpenID Connect configuration for eHerkenning Bewindvoering",
- },
- bases=(mozilla_django_oidc_db.models.CachingMixin, models.Model),
- ),
- migrations.CreateModel(
- name="OpenIDConnectEHerkenningConfig",
- fields=[
- (
- "id",
- models.AutoField(
- auto_created=True,
- primary_key=True,
- serialize=False,
- verbose_name="ID",
- ),
- ),
- (
- "enabled",
- models.BooleanField(
- default=False,
- help_text="Indicates whether OpenID Connect for authentication/authorization is enabled",
- verbose_name="enable",
- ),
- ),
- (
- "oidc_rp_client_id",
- models.CharField(
- help_text="OpenID Connect client ID provided by the OIDC Provider",
- max_length=1000,
- verbose_name="OpenID Connect client ID",
- ),
- ),
- (
- "oidc_rp_client_secret",
- models.CharField(
- help_text="OpenID Connect secret provided by the OIDC Provider",
- max_length=1000,
- verbose_name="OpenID Connect secret",
- ),
- ),
- (
- "oidc_rp_sign_algo",
- models.CharField(
- default="HS256",
- help_text="Algorithm the Identity Provider uses to sign ID tokens",
- max_length=50,
- verbose_name="OpenID sign algorithm",
- ),
- ),
- (
- "oidc_op_discovery_endpoint",
- models.URLField(
- blank=True,
- help_text="URL of your OpenID Connect provider discovery endpoint ending with a slash (`.well-known/...` will be added automatically). If this is provided, the remaining endpoints can be omitted, as they will be derived from this endpoint.",
- max_length=1000,
- verbose_name="Discovery endpoint",
- ),
- ),
- (
- "oidc_op_jwks_endpoint",
- models.URLField(
- blank=True,
- help_text="URL of your OpenID Connect provider JSON Web Key Set endpoint. Required if `RS256` is used as signing algorithm.",
- max_length=1000,
- verbose_name="JSON Web Key Set endpoint",
- ),
- ),
- (
- "oidc_op_authorization_endpoint",
- models.URLField(
- help_text="URL of your OpenID Connect provider authorization endpoint",
- max_length=1000,
- verbose_name="Authorization endpoint",
- ),
- ),
- (
- "oidc_op_token_endpoint",
- models.URLField(
- help_text="URL of your OpenID Connect provider token endpoint",
- max_length=1000,
- verbose_name="Token endpoint",
- ),
- ),
- (
- "oidc_op_user_endpoint",
- models.URLField(
- help_text="URL of your OpenID Connect provider userinfo endpoint",
- max_length=1000,
- verbose_name="User endpoint",
- ),
- ),
- (
- "oidc_rp_idp_sign_key",
- models.CharField(
- blank=True,
- help_text="Key the Identity Provider uses to sign ID tokens in the case of an RSA sign algorithm. Should be the signing key in PEM or DER format.",
- max_length=1000,
- verbose_name="Sign key",
- ),
- ),
- (
- "oidc_op_logout_endpoint",
- models.URLField(
- blank=True,
- help_text="URL of your OpenID Connect provider logout endpoint",
- max_length=1000,
- verbose_name="Logout endpoint",
- ),
- ),
- (
- "oidc_keycloak_idp_hint",
- models.CharField(
- blank=True,
- help_text="Specific for Keycloak: parameter that indicates which identity provider should be used (therefore skipping the Keycloak login screen).",
- max_length=1000,
- verbose_name="Keycloak Identity Provider hint",
- ),
- ),
- (
- "identifier_claim_name",
- models.CharField(
- default="kvk",
- help_text="The name of the claim in which the KVK of the user is stored",
- max_length=100,
- verbose_name="KVK claim name",
- ),
- ),
- (
- "oidc_rp_scopes_list",
- django_jsonform.models.fields.ArrayField(
- base_field=models.CharField(
- max_length=50, verbose_name="OpenID Connect scope"
- ),
- blank=True,
- default=digid_eherkenning_oidc_generics.models.get_default_scopes_kvk,
- help_text="OpenID Connect scopes that are requested during login. These scopes are hardcoded and must be supported by the identity provider",
- size=None,
- verbose_name="OpenID Connect scopes",
- ),
- ),
- (
- "oidc_exempt_urls",
- django_jsonform.models.fields.ArrayField(
- base_field=models.CharField(
- max_length=1000, verbose_name="Exempt URL"
- ),
- blank=True,
- default=list,
- help_text="This is a list of absolute url paths, regular expressions for url paths, or Django view names. This plus the mozilla-django-oidc urls are exempted from the session renewal by the SessionRefresh middleware.",
- size=None,
- verbose_name="URLs exempt from session renewal",
- ),
- ),
- (
- "oidc_nonce_size",
- models.PositiveIntegerField(
- default=32,
- help_text="Sets the length of the random string used for OpenID Connect nonce verification",
- verbose_name="Nonce size",
- ),
- ),
- (
- "oidc_state_size",
- models.PositiveIntegerField(
- default=32,
- help_text="Sets the length of the random string used for OpenID Connect state verification",
- verbose_name="State size",
- ),
- ),
- (
- "oidc_use_nonce",
- models.BooleanField(
- default=True,
- help_text="Controls whether the OpenID Connect client uses nonce verification",
- verbose_name="Use nonce",
- ),
- ),
- (
- "userinfo_claims_source",
- models.CharField(
- choices=[
- ("userinfo_endpoint", "Userinfo endpoint"),
- ("id_token", "ID token"),
- ],
- default="userinfo_endpoint",
- help_text="Indicates the source from which the user information claims should be extracted.",
- max_length=100,
- verbose_name="user information claims extracted from",
- ),
- ),
- ],
- options={
- "verbose_name": "OpenID Connect configuration for eHerkenning",
- },
- bases=(mozilla_django_oidc_db.models.CachingMixin, models.Model),
- ),
- migrations.CreateModel(
- name="OpenIDConnectPublicConfig",
- fields=[
- (
- "id",
- models.AutoField(
- auto_created=True,
- primary_key=True,
- serialize=False,
- verbose_name="ID",
- ),
- ),
- (
- "enabled",
- models.BooleanField(
- default=False,
- help_text="Indicates whether OpenID Connect for authentication/authorization is enabled",
- verbose_name="enable",
- ),
- ),
- (
- "oidc_rp_client_id",
- models.CharField(
- help_text="OpenID Connect client ID provided by the OIDC Provider",
- max_length=1000,
- verbose_name="OpenID Connect client ID",
- ),
- ),
- (
- "oidc_rp_client_secret",
- models.CharField(
- help_text="OpenID Connect secret provided by the OIDC Provider",
- max_length=1000,
- verbose_name="OpenID Connect secret",
- ),
- ),
- (
- "oidc_rp_sign_algo",
- models.CharField(
- default="HS256",
- help_text="Algorithm the Identity Provider uses to sign ID tokens",
- max_length=50,
- verbose_name="OpenID sign algorithm",
- ),
- ),
- (
- "oidc_op_discovery_endpoint",
- models.URLField(
- blank=True,
- help_text="URL of your OpenID Connect provider discovery endpoint ending with a slash (`.well-known/...` will be added automatically). If this is provided, the remaining endpoints can be omitted, as they will be derived from this endpoint.",
- max_length=1000,
- verbose_name="Discovery endpoint",
- ),
- ),
- (
- "oidc_op_jwks_endpoint",
- models.URLField(
- blank=True,
- help_text="URL of your OpenID Connect provider JSON Web Key Set endpoint. Required if `RS256` is used as signing algorithm.",
- max_length=1000,
- verbose_name="JSON Web Key Set endpoint",
- ),
- ),
- (
- "oidc_op_authorization_endpoint",
- models.URLField(
- help_text="URL of your OpenID Connect provider authorization endpoint",
- max_length=1000,
- verbose_name="Authorization endpoint",
- ),
- ),
- (
- "oidc_op_token_endpoint",
- models.URLField(
- help_text="URL of your OpenID Connect provider token endpoint",
- max_length=1000,
- verbose_name="Token endpoint",
- ),
- ),
- (
- "oidc_op_user_endpoint",
- models.URLField(
- help_text="URL of your OpenID Connect provider userinfo endpoint",
- max_length=1000,
- verbose_name="User endpoint",
- ),
- ),
- (
- "oidc_rp_idp_sign_key",
- models.CharField(
- blank=True,
- help_text="Key the Identity Provider uses to sign ID tokens in the case of an RSA sign algorithm. Should be the signing key in PEM or DER format.",
- max_length=1000,
- verbose_name="Sign key",
- ),
- ),
- (
- "oidc_op_logout_endpoint",
- models.URLField(
- blank=True,
- help_text="URL of your OpenID Connect provider logout endpoint",
- max_length=1000,
- verbose_name="Logout endpoint",
- ),
- ),
- (
- "oidc_keycloak_idp_hint",
- models.CharField(
- blank=True,
- help_text="Specific for Keycloak: parameter that indicates which identity provider should be used (therefore skipping the Keycloak login screen).",
- max_length=1000,
- verbose_name="Keycloak Identity Provider hint",
- ),
- ),
- (
- "identifier_claim_name",
- models.CharField(
- default="bsn",
- help_text="The name of the claim in which the BSN of the user is stored",
- max_length=100,
- verbose_name="BSN claim name",
- ),
- ),
- (
- "oidc_rp_scopes_list",
- django_jsonform.models.fields.ArrayField(
- base_field=models.CharField(
- max_length=50, verbose_name="OpenID Connect scope"
- ),
- blank=True,
- default=digid_eherkenning_oidc_generics.models.get_default_scopes_bsn,
- help_text="OpenID Connect scopes that are requested during login. These scopes are hardcoded and must be supported by the identity provider",
- size=None,
- verbose_name="OpenID Connect scopes",
- ),
- ),
- (
- "oidc_exempt_urls",
- django_jsonform.models.fields.ArrayField(
- base_field=models.CharField(
- max_length=1000, verbose_name="Exempt URL"
- ),
- blank=True,
- default=list,
- help_text="This is a list of absolute url paths, regular expressions for url paths, or Django view names. This plus the mozilla-django-oidc urls are exempted from the session renewal by the SessionRefresh middleware.",
- size=None,
- verbose_name="URLs exempt from session renewal",
- ),
- ),
- (
- "oidc_nonce_size",
- models.PositiveIntegerField(
- default=32,
- help_text="Sets the length of the random string used for OpenID Connect nonce verification",
- verbose_name="Nonce size",
- ),
- ),
- (
- "oidc_state_size",
- models.PositiveIntegerField(
- default=32,
- help_text="Sets the length of the random string used for OpenID Connect state verification",
- verbose_name="State size",
- ),
- ),
- (
- "oidc_use_nonce",
- models.BooleanField(
- default=True,
- help_text="Controls whether the OpenID Connect client uses nonce verification",
- verbose_name="Use nonce",
- ),
- ),
- (
- "userinfo_claims_source",
- models.CharField(
- choices=[
- ("userinfo_endpoint", "Userinfo endpoint"),
- ("id_token", "ID token"),
- ],
- default="userinfo_endpoint",
- help_text="Indicates the source from which the user information claims should be extracted.",
- max_length=100,
- verbose_name="user information claims extracted from",
- ),
- ),
- ],
- options={
- "verbose_name": "OpenID Connect configuration for DigiD",
- },
- bases=(mozilla_django_oidc_db.models.CachingMixin, models.Model),
- ),
- ]
diff --git a/src/digid_eherkenning_oidc_generics/migrations/0002_auto_20240207_1546.py b/src/digid_eherkenning_oidc_generics/migrations/0002_auto_20240207_1546.py
deleted file mode 100644
index fa17bca23b..0000000000
--- a/src/digid_eherkenning_oidc_generics/migrations/0002_auto_20240207_1546.py
+++ /dev/null
@@ -1,52 +0,0 @@
-# Generated by Django 3.2.24 on 2024-02-07 14:46
-
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
- dependencies = [
- (
- "digid_eherkenning_oidc_generics",
- "0001_initial_squashed_0007_auto_20221213_1347",
- ),
- ]
-
- operations = [
- migrations.AddField(
- model_name="openidconnectdigidmachtigenconfig",
- name="oidc_token_use_basic_auth",
- field=models.BooleanField(
- default=False,
- help_text="If enabled, the client ID and secret are sent in the HTTP Basic auth header when obtaining the access token. Otherwise, they are sent in the request body.",
- verbose_name="Use Basic auth for token endpoint",
- ),
- ),
- migrations.AddField(
- model_name="openidconnecteherkenningbewindvoeringconfig",
- name="oidc_token_use_basic_auth",
- field=models.BooleanField(
- default=False,
- help_text="If enabled, the client ID and secret are sent in the HTTP Basic auth header when obtaining the access token. Otherwise, they are sent in the request body.",
- verbose_name="Use Basic auth for token endpoint",
- ),
- ),
- migrations.AddField(
- model_name="openidconnecteherkenningconfig",
- name="oidc_token_use_basic_auth",
- field=models.BooleanField(
- default=False,
- help_text="If enabled, the client ID and secret are sent in the HTTP Basic auth header when obtaining the access token. Otherwise, they are sent in the request body.",
- verbose_name="Use Basic auth for token endpoint",
- ),
- ),
- migrations.AddField(
- model_name="openidconnectpublicconfig",
- name="oidc_token_use_basic_auth",
- field=models.BooleanField(
- default=False,
- help_text="If enabled, the client ID and secret are sent in the HTTP Basic auth header when obtaining the access token. Otherwise, they are sent in the request body.",
- verbose_name="Use Basic auth for token endpoint",
- ),
- ),
- ]
diff --git a/src/digid_eherkenning_oidc_generics/mixins.py b/src/digid_eherkenning_oidc_generics/mixins.py
deleted file mode 100644
index a6e0663f80..0000000000
--- a/src/digid_eherkenning_oidc_generics/mixins.py
+++ /dev/null
@@ -1,84 +0,0 @@
-import logging
-from copy import deepcopy
-
-from django.contrib.auth.models import AnonymousUser
-from django.core.exceptions import SuspiciousOperation
-
-from glom import PathAccessError, glom
-from mozilla_django_oidc_db.mixins import SoloConfigMixin
-from mozilla_django_oidc_db.utils import obfuscate_claim_value
-
-from .models import (
- OpenIDConnectDigiDMachtigenConfig,
- OpenIDConnectEHerkenningBewindvoeringConfig,
- OpenIDConnectEHerkenningConfig,
- OpenIDConnectPublicConfig,
-)
-
-logger = logging.getLogger(__name__)
-
-
-class SoloConfigDigiDMixin(SoloConfigMixin):
- config_class = OpenIDConnectPublicConfig
-
-
-class SoloConfigEHerkenningMixin(SoloConfigMixin):
- config_class = OpenIDConnectEHerkenningConfig
-
-
-class SoloConfigDigiDMachtigenMixin(SoloConfigMixin):
- config_class = OpenIDConnectDigiDMachtigenConfig
-
-
-class SoloConfigEHerkenningBewindvoeringMixin(SoloConfigMixin):
- config_class = OpenIDConnectEHerkenningBewindvoeringConfig
-
-
-class MachtigenBackendMixin:
- def get_or_create_user(self, access_token, id_token, payload):
- claims_verified = self.verify_claims(payload)
- if not claims_verified:
- msg = "Claims verification failed"
- raise SuspiciousOperation(msg)
-
- self.extract_claims(payload)
-
- user = AnonymousUser()
- user.is_active = True
- return user
-
- def extract_claims(self, payload: dict) -> None:
- self.request.session[self.session_key] = {}
- for claim_name in self.claim_names:
- self.request.session[self.session_key][claim_name] = glom(
- payload, claim_name
- )
-
- def log_received_claims(self, claims: dict):
- copied_claims = deepcopy(claims)
-
- def _obfuscate_claims_values(claims_to_obfuscate: dict) -> dict:
- for key, value in claims_to_obfuscate.items():
- if isinstance(value, dict):
- _obfuscate_claims_values(value)
- else:
- claims_to_obfuscate[key] = obfuscate_claim_value(value)
- return claims_to_obfuscate
-
- obfuscated_claims = _obfuscate_claims_values(copied_claims)
- logger.debug("OIDC claims received: %s", obfuscated_claims)
-
- def verify_claims(self, claims: dict) -> bool:
- self.log_received_claims(claims)
-
- for expected_claim in self.claim_names:
- try:
- glom(claims, expected_claim)
- except PathAccessError:
- logger.error(
- "`%s` not in OIDC claims, cannot proceed with eHerkenning bewindvoering authentication",
- expected_claim,
- )
- return False
-
- return True
diff --git a/src/digid_eherkenning_oidc_generics/models.py b/src/digid_eherkenning_oidc_generics/models.py
deleted file mode 100644
index fd6abdc338..0000000000
--- a/src/digid_eherkenning_oidc_generics/models.py
+++ /dev/null
@@ -1,181 +0,0 @@
-from typing import ClassVar
-
-from django.db import models
-from django.utils.translation import gettext_lazy as _
-
-from django_jsonform.models.fields import ArrayField
-from mozilla_django_oidc_db.models import CachingMixin, OpenIDConnectConfigBase
-
-from openforms.authentication.constants import AuthAttribute
-
-
-def get_default_scopes_bsn():
- """
- Returns the default scopes to request for OpenID Connect logins
- """
- return ["openid", AuthAttribute.bsn]
-
-
-def get_default_scopes_kvk():
- """
- Returns the default scopes to request for OpenID Connect logins
- """
- return ["openid", AuthAttribute.kvk]
-
-
-class OpenIDConnectBaseConfig(CachingMixin, OpenIDConnectConfigBase):
- """
- Configuration for DigiD authentication via OpenID connect
- """
-
- oidc_op_logout_endpoint = models.URLField(
- _("Logout endpoint"),
- max_length=1000,
- help_text=_("URL of your OpenID Connect provider logout endpoint"),
- blank=True,
- )
-
- # Keycloak specific config
- oidc_keycloak_idp_hint = models.CharField(
- _("Keycloak Identity Provider hint"),
- max_length=1000,
- help_text=_(
- "Specific for Keycloak: parameter that indicates which identity provider "
- "should be used (therefore skipping the Keycloak login screen)."
- ),
- blank=True,
- )
-
- class Meta:
- verbose_name = _("OpenID Connect configuration")
- abstract = True
-
-
-class OpenIDConnectPublicConfig(OpenIDConnectBaseConfig):
- """
- Configuration for DigiD authentication via OpenID connect
- """
-
- identifier_claim_name = models.CharField(
- _("BSN claim name"),
- max_length=100,
- help_text=_("The name of the claim in which the BSN of the user is stored"),
- default=AuthAttribute.bsn,
- )
- oidc_rp_scopes_list = ArrayField(
- verbose_name=_("OpenID Connect scopes"),
- base_field=models.CharField(_("OpenID Connect scope"), max_length=50),
- default=get_default_scopes_bsn,
- blank=True,
- help_text=_(
- "OpenID Connect scopes that are requested during login. "
- "These scopes are hardcoded and must be supported by the identity provider"
- ),
- )
-
- custom_oidc_db_prefix: ClassVar[str] = "digid_oidc"
- oidc_authentication_callback_url: ClassVar[str] = "digid_oidc:callback"
-
- class Meta:
- verbose_name = _("OpenID Connect configuration for DigiD")
-
-
-class OpenIDConnectDigiDMachtigenConfig(OpenIDConnectBaseConfig):
- vertegenwoordigde_claim_name = models.CharField(
- verbose_name=_("vertegenwoordigde claim name"),
- default="aanvrager.bsn",
- max_length=50,
- help_text=_(
- "Name of the claim in which the BSN of the person being represented is stored"
- ),
- )
- gemachtigde_claim_name = models.CharField(
- verbose_name=_("gemachtigde claim name"),
- default="gemachtigde.bsn",
- max_length=50,
- help_text=_(
- "Name of the claim in which the BSN of the person representing someone else is stored"
- ),
- )
- oidc_rp_scopes_list = ArrayField(
- verbose_name=_("OpenID Connect scopes"),
- base_field=models.CharField(_("OpenID Connect scope"), max_length=50),
- default=get_default_scopes_bsn,
- blank=True,
- help_text=_(
- "OpenID Connect scopes that are requested during login. "
- "These scopes are hardcoded and must be supported by the identity provider"
- ),
- )
-
- custom_oidc_db_prefix: ClassVar[str] = "digid_machtigen_oidc"
- oidc_authentication_callback_url: ClassVar[str] = "digid_machtigen_oidc:callback"
-
- class Meta:
- verbose_name = _("OpenID Connect configuration for DigiD Machtigen")
-
-
-class OpenIDConnectEHerkenningConfig(OpenIDConnectBaseConfig):
- """
- Configuration for eHerkenning authentication via OpenID connect
- """
-
- identifier_claim_name = models.CharField(
- _("KVK claim name"),
- max_length=100,
- help_text=_("The name of the claim in which the KVK of the user is stored"),
- default=AuthAttribute.kvk,
- )
- oidc_rp_scopes_list = ArrayField(
- verbose_name=_("OpenID Connect scopes"),
- base_field=models.CharField(_("OpenID Connect scope"), max_length=50),
- default=get_default_scopes_kvk,
- blank=True,
- help_text=_(
- "OpenID Connect scopes that are requested during login. "
- "These scopes are hardcoded and must be supported by the identity provider"
- ),
- )
-
- custom_oidc_db_prefix: ClassVar[str] = "eherkenning_oidc"
- oidc_authentication_callback_url: ClassVar[str] = "eherkenning_oidc:callback"
-
- class Meta:
- verbose_name = _("OpenID Connect configuration for eHerkenning")
-
-
-class OpenIDConnectEHerkenningBewindvoeringConfig(OpenIDConnectBaseConfig):
- vertegenwoordigde_company_claim_name = models.CharField(
- verbose_name=_("vertegenwoordigde company claim name"),
- default="aanvrager.kvk",
- max_length=50,
- help_text=_(
- "Name of the claim in which the KVK of the company being represented is stored"
- ),
- )
- gemachtigde_person_claim_name = models.CharField(
- verbose_name=_("gemachtigde person claim name"),
- default="gemachtigde.pseudoID",
- max_length=50,
- help_text=_(
- "Name of the claim in which the ID of the person representing a company is stored"
- ),
- )
- oidc_rp_scopes_list = ArrayField(
- verbose_name=_("OpenID Connect scopes"),
- base_field=models.CharField(_("OpenID Connect scope"), max_length=50),
- default=get_default_scopes_bsn,
- blank=True,
- help_text=_(
- "OpenID Connect scopes that are requested during login. "
- "These scopes are hardcoded and must be supported by the identity provider"
- ),
- )
-
- custom_oidc_db_prefix: ClassVar[str] = "eherkenning_bewindvoering_oidc"
- oidc_authentication_callback_url: ClassVar[str] = (
- "eherkenning_bewindvoering_oidc:callback"
- )
-
- class Meta:
- verbose_name = _("OpenID Connect configuration for eHerkenning Bewindvoering")
diff --git a/src/digid_eherkenning_oidc_generics/utils.py b/src/digid_eherkenning_oidc_generics/utils.py
deleted file mode 100644
index 7618e75ad6..0000000000
--- a/src/digid_eherkenning_oidc_generics/utils.py
+++ /dev/null
@@ -1,22 +0,0 @@
-from typing import Any
-
-from mozilla_django_oidc.utils import import_from_settings
-
-from .models import OpenIDConnectBaseConfig
-
-
-def get_setting_from_config(config: OpenIDConnectBaseConfig, attr: str, *args) -> Any:
- """
- Look up a setting from the config record or fall back to Django settings.
-
- TODO: port this into mozilla_django_oidc_db.
- """
- attr_lowercase = attr.lower()
- if hasattr(config, attr_lowercase):
- # Workaround for OIDC_RP_IDP_SIGN_KEY being an empty string by default.
- # mozilla-django-oidc explicitly checks if `OIDC_RP_IDP_SIGN_KEY` is not `None`
- # https://github.com/mozilla/mozilla-django-oidc/blob/master/mozilla_django_oidc/auth.py#L189
- if (value_from_config := getattr(config, attr_lowercase)) == "":
- return None
- return value_from_config
- return import_from_settings(attr, *args)
diff --git a/src/digid_eherkenning_oidc_generics/views.py b/src/digid_eherkenning_oidc_generics/views.py
deleted file mode 100644
index 4f04c2cc61..0000000000
--- a/src/digid_eherkenning_oidc_generics/views.py
+++ /dev/null
@@ -1,234 +0,0 @@
-import logging
-import time
-from typing import Generic, TypeVar, cast
-
-from django.contrib import auth
-from django.core.exceptions import DisallowedRedirect, SuspiciousOperation
-from django.http import HttpRequest, HttpResponseRedirect
-from django.utils.http import url_has_allowed_host_and_scheme
-
-import requests
-from mozilla_django_oidc.views import (
- OIDCAuthenticationCallbackView as _OIDCAuthenticationCallbackView,
- OIDCAuthenticationRequestView as _OIDCAuthenticationRequestView,
-)
-
-from .exceptions import OIDCProviderOutage
-from .models import (
- OpenIDConnectBaseConfig,
- OpenIDConnectDigiDMachtigenConfig,
- OpenIDConnectEHerkenningBewindvoeringConfig,
- OpenIDConnectEHerkenningConfig,
- OpenIDConnectPublicConfig,
-)
-from .utils import get_setting_from_config
-
-logger = logging.getLogger(__name__)
-
-T = TypeVar("T", bound=OpenIDConnectBaseConfig)
-
-
-class OIDCInit(Generic[T], _OIDCAuthenticationRequestView):
- """
- A 'view' to start an OIDC authentication flow.
-
- This view class is parametrized with the config model/class to retrieve the
- specific configuration, such as the identity provider endpoint to redirect the
- user to.
-
- This view is not necessarily meant to be exposed directly via a URL pattern, but
- rather specific views are to be created from it, e.g.:
-
- .. code-block:: python
-
- >>> digid_init = OIDCInit.as_view(config_class=OpenIDConnectPublicConfig)
- >>> redirect_response = digid_init(request)
- # Redirect to some keycloak instance, for example.
-
- These concrete views are intended to be wrapped by your own views so that you can
- supply the ``return_url`` parameter:
-
- .. code-block:: python
-
- def my_digid_login(request):
- return digid_init(request, return_url=request.GET["next"])
-
- Compared to :class:`mozilla_django_oidc.views.OIDCAuthenticationRequestView`, some
- extra actions are performed:
-
- * Any Keycloak IdP hint is added, if configured
- * The ``return_url`` is validated against unsafe redirects
- * The availability of the identity provider endpoint is checked, if it's not
- available, the :class:`digid_eherkenning_oidc_generics.exceptions.OIDCProviderOutage`
- exception is raised. Note that your own code needs to handle this appropriately!
- """
-
- config_class: type[OpenIDConnectBaseConfig] = OpenIDConnectBaseConfig
- _config: T
- """
- The config model/class to get the endpoints/credentials from.
-
- Specify this as a kwarg in the ``as_view(config_class=...)`` class method.
- """
-
- def get_settings(self, attr, *args): # type: ignore
- if (config := getattr(self, "_config", None)) is None:
- # django-solo and type checking is challenging, but a new release is on the
- # way and should fix that :fingers_crossed:
- config = cast(T, self.config_class.get_solo())
- self._config = config
- return get_setting_from_config(config, attr, *args)
-
- def get(
- self, request: HttpRequest, return_url: str = "", *args, **kwargs
- ) -> HttpResponseRedirect:
- if not return_url:
- raise ValueError("You must pass a return URL")
-
- url_is_safe = url_has_allowed_host_and_scheme(
- url=return_url,
- allowed_hosts=request.get_host(),
- require_https=request.is_secure(),
- )
- if not url_is_safe:
- raise DisallowedRedirect(f"Can't redirect to '{return_url}'")
-
- self._check_idp_availability()
-
- # We add our own key to keep track of the redirect URL. In the case of
- # authentication failure (or canceled logins), the session is cleared by the
- # upstream library, so in the callback view we store this URL so that we know
- # where to redirect with the error information.
- self.request.session["of_redirect_next"] = return_url
-
- response = super().get(request, *args, **kwargs)
-
- # mozilla-django-oidc grabs this from request.GET and since that is not mutable,
- # it's easiest to just override the session key with the correct value.
- request.session["oidc_login_next"] = return_url
-
- return response
-
- def _check_idp_availability(self) -> None:
- endpoint = self.OIDC_OP_AUTH_ENDPOINT
- try:
- # Verify that the identity provider endpoint can be reached. This is where
- # the user ultimately gets redirected to.
- response = requests.get(endpoint)
- if response.status_code > 400:
- response.raise_for_status()
- except requests.RequestException as exc:
- logger.info(
- "OIDC provider endpoint '%s' could not be retrieved",
- endpoint,
- exc_info=exc,
- )
- raise OIDCProviderOutage() from exc
-
- def get_extra_params(self, request: HttpRequest) -> dict[str, str]:
- """
- Add a keycloak identity provider hint if configured.
- """
- extra = super().get_extra_params(request)
- options = self.config_class._meta
- # Store which config class to use in the params so that the callback view can
- # extract this again.
- # TODO: verify this cannot be tampered with!
- extra["config"] = f"{options.app_label}.{options.object_name}"
- if kc_idp_hint := self.get_settings("OIDC_KEYCLOAK_IDP_HINT", ""):
- extra["kc_idp_hint"] = kc_idp_hint
- return extra
-
-
-digid_init = OIDCInit.as_view(config_class=OpenIDConnectPublicConfig)
-digid_machtigen_init = OIDCInit.as_view(config_class=OpenIDConnectDigiDMachtigenConfig)
-eherkenning_init = OIDCInit.as_view(config_class=OpenIDConnectEHerkenningConfig)
-eherkenning_bewindvoering_init = OIDCInit.as_view(
- config_class=OpenIDConnectEHerkenningBewindvoeringConfig
-)
-
-
-class OIDCAuthenticationCallbackView(_OIDCAuthenticationCallbackView):
- auth_backend_class = None
-
- def get(self, request):
- """
- Callback handler for OIDC authorization code flow
-
- Copied from mozilla-django-oidc but modified to directly authenticate using
- the configured backend class, instead of using Django's default authentication
- mechanism. This removes the need to include these backends in `settings.AUTHENTICATION_BACKENDS`
- """
-
- if request.GET.get("error"):
- # Ouch! Something important failed.
-
- # Delete the state entry also for failed authentication attempts
- # to prevent replay attacks.
- if (
- "state" in request.GET
- and "oidc_states" in request.session
- and request.GET["state"] in request.session["oidc_states"]
- ): # pragma: no cover
- del request.session["oidc_states"][request.GET["state"]]
- request.session.save()
-
- # Make sure the user doesn't get to continue to be logged in
- # otherwise the refresh middleware will force the user to
- # redirect to authorize again if the session refresh has
- # expired.
- if request.user.is_authenticated:
- auth.logout(request)
- assert not request.user.is_authenticated
- elif "code" in request.GET and "state" in request.GET:
-
- # Check instead of "oidc_state" check if the "oidc_states" session key exists!
- if "oidc_states" not in request.session:
- return self.login_failure()
-
- # State and Nonce are stored in the session "oidc_states" dictionary.
- # State is the key, the value is a dictionary with the Nonce in the "nonce" field.
- state = request.GET.get("state")
- if state not in request.session["oidc_states"]:
- msg = "OIDC callback state not found in session `oidc_states`!"
- raise SuspiciousOperation(msg)
-
- # Get the nonce from the dictionary for further processing and delete the entry to
- # prevent replay attacks.
- nonce = request.session["oidc_states"][state]["nonce"]
- del request.session["oidc_states"][state]
-
- # Authenticating is slow, so save the updated oidc_states.
- request.session.save()
- # Reset the session. This forces the session to get reloaded from the database after
- # fetching the token from the OpenID connect provider.
- # Without this step we would overwrite items that are being added/removed from the
- # session in parallel browser tabs.
- request.session = request.session.__class__(request.session.session_key)
-
- kwargs = {
- "request": request,
- "nonce": nonce,
- }
- self.user = self.auth_backend_class().authenticate(**kwargs)
-
- if self.user and self.user.is_active:
- return self.login_success()
- return self.login_failure()
-
- def login_success(self):
- """
- Overridden to not actually log the user in, since setting the BSN in
- the session variables is all that matters
- """
-
- # Figure out when this id_token will expire. This is ignored unless you're
- # using the RenewIDToken middleware.
- expiration_interval = self.get_settings(
- "OIDC_RENEW_ID_TOKEN_EXPIRY_SECONDS", 60 * 15
- )
- self.request.session["oidc_id_token_expiration"] = (
- time.time() + expiration_interval
- )
-
- return HttpResponseRedirect(self.success_url)
diff --git a/src/openapi.yaml b/src/openapi.yaml
index 662ae294e8..0ca54a7074 100644
--- a/src/openapi.yaml
+++ b/src/openapi.yaml
@@ -5944,6 +5944,7 @@ paths:
format: uuid
description: UUID of the submission for which this co-sign authentication
applies. Presence of this parameter marks a flow as a co-sign flow.
+ deprecated: true
- in: query
name: next
schema:
@@ -6688,23 +6689,23 @@ components:
- supportsLoaOverride
AuthenticationBackendsEnum:
enum:
- - digid
- - eherkenning
- - eidas
- digid_oidc
- eherkenning_oidc
- digid_machtigen_oidc
- eherkenning_bewindvoering_oidc
+ - digid
+ - eherkenning
+ - eidas
- org-oidc
type: string
description: |-
- * `digid` - DigiD
- * `eherkenning` - eHerkenning
- * `eidas` - eIDAS
* `digid_oidc` - DigiD
* `eherkenning_oidc` - eHerkenning
* `digid_machtigen_oidc` - DigiD Machtigen
* `eherkenning_bewindvoering_oidc` - eHerkenning bewindvoering
+ * `digid` - DigiD
+ * `eherkenning` - eHerkenning
+ * `eidas` - eIDAS
* `org-oidc` - OpenID Connect
AvailableLanguagesEnum:
enum:
diff --git a/src/openforms/accounts/tests/data/vcr_cassettes/OIDCFLowTests/OIDCFLowTests.test_duplicate_email_unique_constraint_violated.yaml b/src/openforms/accounts/tests/data/vcr_cassettes/OIDCFLowTests/OIDCFLowTests.test_duplicate_email_unique_constraint_violated.yaml
new file mode 100644
index 0000000000..7e17f9983a
--- /dev/null
+++ b/src/openforms/accounts/tests/data/vcr_cassettes/OIDCFLowTests/OIDCFLowTests.test_duplicate_email_unique_constraint_violated.yaml
@@ -0,0 +1,314 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.32.2
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth?response_type=code&scope=openid&client_id=testid&redirect_uri=http%3A%2F%2Ftestserver%2Foidc%2Fcallback%2F&state=not-a-random-string&nonce=not-a-random-string
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n \n\n\n\n\n
+ \ \n
\n
+ \ \n
\n
+ \
\n\n\n
\n \n\n\n\n\n\n
+ \
\n
\n\n
\n
\n\n\n"
+ headers:
+ Cache-Control:
+ - no-store, must-revalidate, max-age=0
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Set-Cookie:
+ - AUTH_SESSION_ID=80550c25-22d6-4bb2-a71d-e68871660572; Version=1; Path=/realms/test/;
+ SameSite=None; Secure; HttpOnly
+ - AUTH_SESSION_ID_LEGACY=80550c25-22d6-4bb2-a71d-e68871660572; Version=1; Path=/realms/test/;
+ HttpOnly
+ - KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJjaWQiOiJ0ZXN0aWQiLCJwdHkiOiJvcGVuaWQtY29ubmVjdCIsInJ1cmkiOiJodHRwOi8vdGVzdHNlcnZlci9vaWRjL2NhbGxiYWNrLyIsImFjdCI6IkFVVEhFTlRJQ0FURSIsIm5vdGVzIjp7InNjb3BlIjoib3BlbmlkIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0IiwicmVzcG9uc2VfdHlwZSI6ImNvZGUiLCJyZWRpcmVjdF91cmkiOiJodHRwOi8vdGVzdHNlcnZlci9vaWRjL2NhbGxiYWNrLyIsInN0YXRlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyJ9fQ.f7ZABGR0O48xm61gDKLOR_LjWH9a59wtTbGXUfm78sI;
+ Version=1; Path=/realms/test/; HttpOnly
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '4466'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: username=admin&password=admin&credentialId=&login=Sign+In
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '57'
+ Content-Type:
+ - application/x-www-form-urlencoded
+ Cookie:
+ - AUTH_SESSION_ID_LEGACY=80550c25-22d6-4bb2-a71d-e68871660572; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJjaWQiOiJ0ZXN0aWQiLCJwdHkiOiJvcGVuaWQtY29ubmVjdCIsInJ1cmkiOiJodHRwOi8vdGVzdHNlcnZlci9vaWRjL2NhbGxiYWNrLyIsImFjdCI6IkFVVEhFTlRJQ0FURSIsIm5vdGVzIjp7InNjb3BlIjoib3BlbmlkIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0IiwicmVzcG9uc2VfdHlwZSI6ImNvZGUiLCJyZWRpcmVjdF91cmkiOiJodHRwOi8vdGVzdHNlcnZlci9vaWRjL2NhbGxiYWNrLyIsInN0YXRlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyJ9fQ.f7ZABGR0O48xm61gDKLOR_LjWH9a59wtTbGXUfm78sI
+ User-Agent:
+ - python-requests/2.32.2
+ method: POST
+ uri: http://localhost:8080/realms/test/login-actions/authenticate?session_code=UU9D4914-4iH6bseaNMSaQ49wYLob8gcmyMj9wwMJSk&execution=d8b8778e-a545-45d4-8f72-fd69facf4b72&client_id=testid&tab_id=njHHLHoRZCM
+ response:
+ body:
+ string: ''
+ headers:
+ Cache-Control:
+ - no-store, must-revalidate, max-age=0
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Location:
+ - http://testserver/oidc/callback/?state=not-a-random-string&session_state=80550c25-22d6-4bb2-a71d-e68871660572&iss=http%3A%2F%2Flocalhost%3A8080%2Frealms%2Ftest&code=c6a91978-ab00-402a-b550-a016b9fad38c.80550c25-22d6-4bb2-a71d-e68871660572.adf4ad83-4550-4619-9231-73bd8d700f45
+ Referrer-Policy:
+ - no-referrer
+ Set-Cookie:
+ - KEYCLOAK_LOCALE=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test/; HttpOnly
+ - KC_RESTART=; Version=1; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0;
+ Path=/realms/test/; HttpOnly
+ - KC_AUTH_STATE=; Version=1; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0;
+ Path=/realms/test/
+ - KEYCLOAK_IDENTITY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTY1MDUwMzQsImlhdCI6MTcxNjQ2OTAzNCwianRpIjoiYzc1ODY1NGMtNWZjZC00ZTNiLWEyYmUtODE0MWEzZGJjZTlhIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiNmRiMmRiODctZGUzMS00ZTMwLTlmMjUtY2VmZTVkYThiMTU0IiwidHlwIjoiU2VyaWFsaXplZC1JRCIsInNlc3Npb25fc3RhdGUiOiI4MDU1MGMyNS0yMmQ2LTRiYjItYTcxZC1lNjg4NzE2NjA1NzIiLCJzaWQiOiI4MDU1MGMyNS0yMmQ2LTRiYjItYTcxZC1lNjg4NzE2NjA1NzIiLCJzdGF0ZV9jaGVja2VyIjoiVmN6Q0kwc052TWtRSHllV0JaNUFwek5hbVRTUHVlR24tbVFTcVZXT0s0OCJ9.TH48pGwttPAwdBUmgOtOuDSb6nRq4ak94xzgIGjNakE;
+ Version=1; Path=/realms/test/; SameSite=None; Secure; HttpOnly
+ - KEYCLOAK_IDENTITY_LEGACY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTY1MDUwMzQsImlhdCI6MTcxNjQ2OTAzNCwianRpIjoiYzc1ODY1NGMtNWZjZC00ZTNiLWEyYmUtODE0MWEzZGJjZTlhIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiNmRiMmRiODctZGUzMS00ZTMwLTlmMjUtY2VmZTVkYThiMTU0IiwidHlwIjoiU2VyaWFsaXplZC1JRCIsInNlc3Npb25fc3RhdGUiOiI4MDU1MGMyNS0yMmQ2LTRiYjItYTcxZC1lNjg4NzE2NjA1NzIiLCJzaWQiOiI4MDU1MGMyNS0yMmQ2LTRiYjItYTcxZC1lNjg4NzE2NjA1NzIiLCJzdGF0ZV9jaGVja2VyIjoiVmN6Q0kwc052TWtRSHllV0JaNUFwek5hbVRTUHVlR24tbVFTcVZXT0s0OCJ9.TH48pGwttPAwdBUmgOtOuDSb6nRq4ak94xzgIGjNakE;
+ Version=1; Path=/realms/test/; HttpOnly
+ - KEYCLOAK_SESSION=test/6db2db87-de31-4e30-9f25-cefe5da8b154/80550c25-22d6-4bb2-a71d-e68871660572;
+ Version=1; Expires=Thu, 23-May-2024 22:57:14 GMT; Max-Age=36000; Path=/realms/test/;
+ SameSite=None; Secure
+ - KEYCLOAK_SESSION_LEGACY=test/6db2db87-de31-4e30-9f25-cefe5da8b154/80550c25-22d6-4bb2-a71d-e68871660572;
+ Version=1; Expires=Thu, 23-May-2024 22:57:14 GMT; Max-Age=36000; Path=/realms/test/
+ - KEYCLOAK_REMEMBER_ME=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test/; HttpOnly
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '0'
+ status:
+ code: 302
+ message: Found
+- request:
+ body: client_id=testid&client_secret=7DB3KUAAizYCcmZufpHRVOcD0TOkNO3I&grant_type=authorization_code&code=c6a91978-ab00-402a-b550-a016b9fad38c.80550c25-22d6-4bb2-a71d-e68871660572.adf4ad83-4550-4619-9231-73bd8d700f45&redirect_uri=http%3A%2F%2Ftestserver%2Foidc%2Fcallback%2F
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '267'
+ Content-Type:
+ - application/x-www-form-urlencoded
+ User-Agent:
+ - python-requests/2.32.2
+ method: POST
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/token
+ response:
+ body:
+ string: '{"access_token":"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTY0NjkzMzUsImlhdCI6MTcxNjQ2OTAzNSwiYXV0aF90aW1lIjoxNzE2NDY5MDM0LCJqdGkiOiJkY2JmNTk0YS0yMzhiLTQ4N2UtYTBmYy1jYzZjMzk0YjY0OTUiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiNmRiMmRiODctZGUzMS00ZTMwLTlmMjUtY2VmZTVkYThiMTU0IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoidGVzdGlkIiwibm9uY2UiOiJub3QtYS1yYW5kb20tc3RyaW5nIiwic2Vzc2lvbl9zdGF0ZSI6IjgwNTUwYzI1LTIyZDYtNGJiMi1hNzFkLWU2ODg3MTY2MDU3MiIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOlsiaHR0cDovLzEyNy4wLjAuMTo4MDAwIl0sInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJkZWZhdWx0LXJvbGVzLXRlc3QiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgZW1haWwgcHJvZmlsZSBrdmsgYnNuIiwic2lkIjoiODA1NTBjMjUtMjJkNi00YmIyLWE3MWQtZTY4ODcxNjYwNTcyIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsInByZWZlcnJlZF91c2VybmFtZSI6ImFkbWluIiwiZW1haWwiOiJhZG1pbkBleGFtcGxlLmNvbSJ9.mz47DGdw3hGnXQkfpWtyx2fw1RxbWaF8QghtY0R1ncNYX85N-PpQwpHsD-DPV3pylJbjMRcx6ZFXw_7ji87y7yV2mV7R7ILuIbwb4vIHQsW6wLiNXLMXNdl4SyIRO5XQRCkPCtREzvhBfiZ5YD8nDPB-g21Cbhd63lk3WNM2OQ3tq1zT6jVqWIlxKhbyDMyqDPRRDh6EdY-yeDLSd1nCjE8aXxGZVaHezwA3nU1pEmJNb2XzJL4a1tte4yDRQmAyH6bDvKVBT_5Y2_jBC30TiHVr8zIV6HQN_glTqSRnI3gAP-M_Y5VAfAxRhGYxMRvJmABoO47Hnf8QJD9pOEnAkg","expires_in":300,"refresh_expires_in":1799,"refresh_token":"eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTY0NzA4MzQsImlhdCI6MTcxNjQ2OTAzNSwianRpIjoiYzc4MWI1ZDAtZGNhNi00YzhiLWE5ZmQtMzA5MjU2ZGEzNGYwIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0IiwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiNmRiMmRiODctZGUzMS00ZTMwLTlmMjUtY2VmZTVkYThiMTU0IiwidHlwIjoiUmVmcmVzaCIsImF6cCI6InRlc3RpZCIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsInNlc3Npb25fc3RhdGUiOiI4MDU1MGMyNS0yMmQ2LTRiYjItYTcxZC1lNjg4NzE2NjA1NzIiLCJzY29wZSI6Im9wZW5pZCBlbWFpbCBwcm9maWxlIGt2ayBic24iLCJzaWQiOiI4MDU1MGMyNS0yMmQ2LTRiYjItYTcxZC1lNjg4NzE2NjA1NzIifQ.VAo16SvWvp_LeqVHWYVhB4FGMaGMy_-JQJwpQU5Sa48","token_type":"Bearer","id_token":"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTY0NjkzMzUsImlhdCI6MTcxNjQ2OTAzNSwiYXV0aF90aW1lIjoxNzE2NDY5MDM0LCJqdGkiOiJiZWZlNDVjMC0wZTZmLTQyNTMtYTExMi00ZDdiNmZhN2ZjZTMiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJ0ZXN0aWQiLCJzdWIiOiI2ZGIyZGI4Ny1kZTMxLTRlMzAtOWYyNS1jZWZlNWRhOGIxNTQiLCJ0eXAiOiJJRCIsImF6cCI6InRlc3RpZCIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsInNlc3Npb25fc3RhdGUiOiI4MDU1MGMyNS0yMmQ2LTRiYjItYTcxZC1lNjg4NzE2NjA1NzIiLCJhdF9oYXNoIjoiQ0UwQlhMZmNTU1I3NEQxZi1ZRENIZyIsImFjciI6IjEiLCJzaWQiOiI4MDU1MGMyNS0yMmQ2LTRiYjItYTcxZC1lNjg4NzE2NjA1NzIiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwicHJlZmVycmVkX3VzZXJuYW1lIjoiYWRtaW4iLCJlbWFpbCI6ImFkbWluQGV4YW1wbGUuY29tIn0.v_usY-Pdo9N6TWfQwiSAfXggmfM6cv-lmDO7H8aHoC8XEYrc1AG4vGpR7uxZO5oInGdxInUlZmwJTmZ3ElhNsZ-rtzMRyH2kVB7Rzwp3nOfs8Qk7if2VSV_zTm_0hYxd4B9JTQ1iiQC9IjGEuwl1SsMDSaP62sFDrfPaKQ4-ivGpc1QziWtflnQx_DquJj6DrNBaNJ825D-t0zm5fdUqQPlhiEYywzJldB-HQiwwZF3AeMnBTvqV4G4OPgv4QjHo-58Y4WSEiQqXRtlWay400jxAeDRLqWn8Qu1F8x97dPIPAkkgWVxdVAu---3AIN1EUy_anP75JIVUEISk4B_itQ","not-before-policy":0,"session_state":"80550c25-22d6-4bb2-a71d-e68871660572","scope":"openid
+ email profile kvk bsn"}'
+ headers:
+ Cache-Control:
+ - no-store
+ Content-Type:
+ - application/json
+ Pragma:
+ - no-cache
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '3443'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.32.2
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/certs
+ response:
+ body:
+ string: '{"keys":[{"kid":"4UNQAcvUcv-DFUOx_4O1gt13OdJSotqEKPZurs2vQW8","kty":"RSA","alg":"RS256","use":"sig","n":"2DOZ0qHie73SuFVR7civrl6r82YUiAghfzaMowjCg0o06AF--2lIS7vNV_PbsVVznPAAMqVrNG-8CcevEzvVZMQD9nH4DI7xlOxK0lrYu8rmMeSfOvXVbBVsWBZe0jnGNukZqjwmRE5__ttJdxPfIBT5-2L6mguQbDfhSUEEdIW7y7UfOXvqLqEcBtoIEB-ORKDTUIQwGZM5mSCy-cY3cHvvZfZVgaUUy5NvujPRXTMje4n_hG0KfEV-40G9qC2_Xvx4EooJzBZ6FSThiWhCpwhIvzcQqB6M9lHW7nU6wADhYPNCa2OKWvphwZ_zbrF4B9dmS6Zli5rBvbox9Hh45w","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMLTANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANgzmdKh4nu90rhVUe3Ir65eq/NmFIgIIX82jKMIwoNKNOgBfvtpSEu7zVfz27FVc5zwADKlazRvvAnHrxM71WTEA/Zx+AyO8ZTsStJa2LvK5jHknzr11WwVbFgWXtI5xjbpGao8JkROf/7bSXcT3yAU+fti+poLkGw34UlBBHSFu8u1Hzl76i6hHAbaCBAfjkSg01CEMBmTOZkgsvnGN3B772X2VYGlFMuTb7oz0V0zI3uJ/4RtCnxFfuNBvagtv178eBKKCcwWehUk4YloQqcISL83EKgejPZR1u51OsAA4WDzQmtjilr6YcGf826xeAfXZkumZYuawb26MfR4eOcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAsnQG/Yi2g1XTCJn74hWv9MjxVAaZb4gBAc2AWm5VgAjhFEM9h6x6m1mQkq7JM4rIdAj8jw55Ok9CBVBIqq4G4cME3eUvVytkj2lC9zcRoAivjjZF2HPg7zNPa2TTR50asmHPRokppV6gewO/C+o5as+4P2zqDXBh61aRd/9kdQfkg14LBbH5/dYccAuvUqlTYC4IEPCvVmBNC1xsMjf0vohvoSjm9vL2bfqG/RJH0ScdCjOd5d2zju4/e2oVdluWm+vzKBQplc7tVMuKpn6LcLmVHiGNAl+EBIZH+WVLlTx0D1+kbHZsfLYG53lQg2LsvurRbWyF/a5fVM/oLTn5ag=="],"x5t":"H5xfs1pRtvX0HyVTskx7eTXx88U","x5t#S256":"XurVtKAIEyc4w9HCGOhnjoRHnYu4d9HCn_5YHmkScJg"},{"kid":"TV3Tl5jIY1nrJLSb53UKEubLR5gYiq9slq1SsDDg1HU","kty":"RSA","alg":"RSA-OAEP","use":"enc","n":"pNvU3ecpVHbJT4bCOEpw6cnV1yi65tB3I0bRF2ilLVOY944QRAGnjBBECPIzNbgqavghYp1j75F2nq6_ny1CYfoaxTV2iDpRUw8_f7sliYbl8FrLLat0S25ItlZrg5TEJHObvOqlG2_nXoeH36MRWwNhms2uCqfhn5VgtenIzpQIBolnM7zzGp21NvdJ1C_ZAUzkXC-l3oQ-BXTtpEVM4h2KpYh4gfZJWCbYij5d1e1YApKD6V61_Cs3Oa2OY7CAUyq5kgAWJZFDB6CpzIr226u3bV7F9RbrQu3Ybc_Lv33EwykscLznKWZY2Mbs3Iz_rFNv3sVX_vHpH4DHWlKu7Q","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMlzANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKTb1N3nKVR2yU+GwjhKcOnJ1dcouubQdyNG0RdopS1TmPeOEEQBp4wQRAjyMzW4Kmr4IWKdY++Rdp6uv58tQmH6GsU1dog6UVMPP3+7JYmG5fBayy2rdEtuSLZWa4OUxCRzm7zqpRtv516Hh9+jEVsDYZrNrgqn4Z+VYLXpyM6UCAaJZzO88xqdtTb3SdQv2QFM5Fwvpd6EPgV07aRFTOIdiqWIeIH2SVgm2Io+XdXtWAKSg+letfwrNzmtjmOwgFMquZIAFiWRQwegqcyK9turt21exfUW60Lt2G3Py799xMMpLHC85ylmWNjG7NyM/6xTb97FV/7x6R+Ax1pSru0CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAQGJHeTYSMvp0yndbIn7DLohO9lom5nRrx/bLyb7TiRfogyJEF6rQZ66CAkQFk5eMF878fsHTuMVjtmXVBnhojhVmK91HwjsNQu/8xR6QMXNKJQMvHR245vwUGxlWRw/36ObM1D7QjCd/q+FonpBEY4m5Y6Uz1U0HR2Cbh0E2afVlPLeV+F0LKrlyVMdIaWBGWftCGIKDAHaG/PD66zbAKtxerv2fBIDq100WHPhd57BZxX+2aGJp1IaRDgkxV0E/CjEy3+Knd8xbAgUSW0Tl6OTC75exIvlbzeluEBe0wlapAb7WvBKYsipSW8G8Ey7tjoolDT4AU82EaKUPstiMnA=="],"x5t":"AlfHDI0FOPQpt3RBAILt0dtW1yw","x5t#S256":"a7bhm8-JsnfY7bL_m8Yl72hgmp5516VZlFcVloKzk08"}]}'
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/json;charset=UTF-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '2909'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Authorization:
+ - Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTY0NjkzMzUsImlhdCI6MTcxNjQ2OTAzNSwiYXV0aF90aW1lIjoxNzE2NDY5MDM0LCJqdGkiOiJkY2JmNTk0YS0yMzhiLTQ4N2UtYTBmYy1jYzZjMzk0YjY0OTUiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiNmRiMmRiODctZGUzMS00ZTMwLTlmMjUtY2VmZTVkYThiMTU0IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoidGVzdGlkIiwibm9uY2UiOiJub3QtYS1yYW5kb20tc3RyaW5nIiwic2Vzc2lvbl9zdGF0ZSI6IjgwNTUwYzI1LTIyZDYtNGJiMi1hNzFkLWU2ODg3MTY2MDU3MiIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOlsiaHR0cDovLzEyNy4wLjAuMTo4MDAwIl0sInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJkZWZhdWx0LXJvbGVzLXRlc3QiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgZW1haWwgcHJvZmlsZSBrdmsgYnNuIiwic2lkIjoiODA1NTBjMjUtMjJkNi00YmIyLWE3MWQtZTY4ODcxNjYwNTcyIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsInByZWZlcnJlZF91c2VybmFtZSI6ImFkbWluIiwiZW1haWwiOiJhZG1pbkBleGFtcGxlLmNvbSJ9.mz47DGdw3hGnXQkfpWtyx2fw1RxbWaF8QghtY0R1ncNYX85N-PpQwpHsD-DPV3pylJbjMRcx6ZFXw_7ji87y7yV2mV7R7ILuIbwb4vIHQsW6wLiNXLMXNdl4SyIRO5XQRCkPCtREzvhBfiZ5YD8nDPB-g21Cbhd63lk3WNM2OQ3tq1zT6jVqWIlxKhbyDMyqDPRRDh6EdY-yeDLSd1nCjE8aXxGZVaHezwA3nU1pEmJNb2XzJL4a1tte4yDRQmAyH6bDvKVBT_5Y2_jBC30TiHVr8zIV6HQN_glTqSRnI3gAP-M_Y5VAfAxRhGYxMRvJmABoO47Hnf8QJD9pOEnAkg
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.32.2
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/userinfo
+ response:
+ body:
+ string: eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJzdWIiOiI2ZGIyZGI4Ny1kZTMxLTRlMzAtOWYyNS1jZWZlNWRhOGIxNTQiLCJhdWQiOiJ0ZXN0aWQiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0IiwicHJlZmVycmVkX3VzZXJuYW1lIjoiYWRtaW4iLCJlbWFpbCI6ImFkbWluQGV4YW1wbGUuY29tIn0.JOw15ll6KCKOWcVDnth2wlYiF9XhBH7rtbWbN6cJjrk2iRH4MN0LbIRY7JLUpyXZv10aYqMa4pOKZK1TEEMdam1fDn58tUDpckq8EcGVo3XAWM737C64oL8a1ivhWIG37TPpgJyPlJL31lJ4WPGxVf-xSlCTRaZ0rqHI4FoqOrzrjnbwZg6crYagA8Zp4zzqVFEQ312VTxXVkIcsrw7pl5k29Ip0AhNXaB1VBTUTj4arUpfaM7ncewiKc7nVij87WeoziG-HaBTvCrTN7JMwBDrNvvsAOmht1P3g9lHu_XbpP9jahA73ecMXef1cV2txB-W80HNC-X2OXuz6cIrsiw
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/jwt
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '698'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.32.2
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/certs
+ response:
+ body:
+ string: '{"keys":[{"kid":"4UNQAcvUcv-DFUOx_4O1gt13OdJSotqEKPZurs2vQW8","kty":"RSA","alg":"RS256","use":"sig","n":"2DOZ0qHie73SuFVR7civrl6r82YUiAghfzaMowjCg0o06AF--2lIS7vNV_PbsVVznPAAMqVrNG-8CcevEzvVZMQD9nH4DI7xlOxK0lrYu8rmMeSfOvXVbBVsWBZe0jnGNukZqjwmRE5__ttJdxPfIBT5-2L6mguQbDfhSUEEdIW7y7UfOXvqLqEcBtoIEB-ORKDTUIQwGZM5mSCy-cY3cHvvZfZVgaUUy5NvujPRXTMje4n_hG0KfEV-40G9qC2_Xvx4EooJzBZ6FSThiWhCpwhIvzcQqB6M9lHW7nU6wADhYPNCa2OKWvphwZ_zbrF4B9dmS6Zli5rBvbox9Hh45w","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMLTANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANgzmdKh4nu90rhVUe3Ir65eq/NmFIgIIX82jKMIwoNKNOgBfvtpSEu7zVfz27FVc5zwADKlazRvvAnHrxM71WTEA/Zx+AyO8ZTsStJa2LvK5jHknzr11WwVbFgWXtI5xjbpGao8JkROf/7bSXcT3yAU+fti+poLkGw34UlBBHSFu8u1Hzl76i6hHAbaCBAfjkSg01CEMBmTOZkgsvnGN3B772X2VYGlFMuTb7oz0V0zI3uJ/4RtCnxFfuNBvagtv178eBKKCcwWehUk4YloQqcISL83EKgejPZR1u51OsAA4WDzQmtjilr6YcGf826xeAfXZkumZYuawb26MfR4eOcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAsnQG/Yi2g1XTCJn74hWv9MjxVAaZb4gBAc2AWm5VgAjhFEM9h6x6m1mQkq7JM4rIdAj8jw55Ok9CBVBIqq4G4cME3eUvVytkj2lC9zcRoAivjjZF2HPg7zNPa2TTR50asmHPRokppV6gewO/C+o5as+4P2zqDXBh61aRd/9kdQfkg14LBbH5/dYccAuvUqlTYC4IEPCvVmBNC1xsMjf0vohvoSjm9vL2bfqG/RJH0ScdCjOd5d2zju4/e2oVdluWm+vzKBQplc7tVMuKpn6LcLmVHiGNAl+EBIZH+WVLlTx0D1+kbHZsfLYG53lQg2LsvurRbWyF/a5fVM/oLTn5ag=="],"x5t":"H5xfs1pRtvX0HyVTskx7eTXx88U","x5t#S256":"XurVtKAIEyc4w9HCGOhnjoRHnYu4d9HCn_5YHmkScJg"},{"kid":"TV3Tl5jIY1nrJLSb53UKEubLR5gYiq9slq1SsDDg1HU","kty":"RSA","alg":"RSA-OAEP","use":"enc","n":"pNvU3ecpVHbJT4bCOEpw6cnV1yi65tB3I0bRF2ilLVOY944QRAGnjBBECPIzNbgqavghYp1j75F2nq6_ny1CYfoaxTV2iDpRUw8_f7sliYbl8FrLLat0S25ItlZrg5TEJHObvOqlG2_nXoeH36MRWwNhms2uCqfhn5VgtenIzpQIBolnM7zzGp21NvdJ1C_ZAUzkXC-l3oQ-BXTtpEVM4h2KpYh4gfZJWCbYij5d1e1YApKD6V61_Cs3Oa2OY7CAUyq5kgAWJZFDB6CpzIr226u3bV7F9RbrQu3Ybc_Lv33EwykscLznKWZY2Mbs3Iz_rFNv3sVX_vHpH4DHWlKu7Q","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMlzANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKTb1N3nKVR2yU+GwjhKcOnJ1dcouubQdyNG0RdopS1TmPeOEEQBp4wQRAjyMzW4Kmr4IWKdY++Rdp6uv58tQmH6GsU1dog6UVMPP3+7JYmG5fBayy2rdEtuSLZWa4OUxCRzm7zqpRtv516Hh9+jEVsDYZrNrgqn4Z+VYLXpyM6UCAaJZzO88xqdtTb3SdQv2QFM5Fwvpd6EPgV07aRFTOIdiqWIeIH2SVgm2Io+XdXtWAKSg+letfwrNzmtjmOwgFMquZIAFiWRQwegqcyK9turt21exfUW60Lt2G3Py799xMMpLHC85ylmWNjG7NyM/6xTb97FV/7x6R+Ax1pSru0CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAQGJHeTYSMvp0yndbIn7DLohO9lom5nRrx/bLyb7TiRfogyJEF6rQZ66CAkQFk5eMF878fsHTuMVjtmXVBnhojhVmK91HwjsNQu/8xR6QMXNKJQMvHR245vwUGxlWRw/36ObM1D7QjCd/q+FonpBEY4m5Y6Uz1U0HR2Cbh0E2afVlPLeV+F0LKrlyVMdIaWBGWftCGIKDAHaG/PD66zbAKtxerv2fBIDq100WHPhd57BZxX+2aGJp1IaRDgkxV0E/CjEy3+Knd8xbAgUSW0Tl6OTC75exIvlbzeluEBe0wlapAb7WvBKYsipSW8G8Ey7tjoolDT4AU82EaKUPstiMnA=="],"x5t":"AlfHDI0FOPQpt3RBAILt0dtW1yw","x5t#S256":"a7bhm8-JsnfY7bL_m8Yl72hgmp5516VZlFcVloKzk08"}]}'
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/json;charset=UTF-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '2909'
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/src/openforms/accounts/tests/data/vcr_cassettes/OIDCFLowTests/OIDCFLowTests.test_happy_flow.yaml b/src/openforms/accounts/tests/data/vcr_cassettes/OIDCFLowTests/OIDCFLowTests.test_happy_flow.yaml
new file mode 100644
index 0000000000..88a90bfdcf
--- /dev/null
+++ b/src/openforms/accounts/tests/data/vcr_cassettes/OIDCFLowTests/OIDCFLowTests.test_happy_flow.yaml
@@ -0,0 +1,314 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.32.2
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth?response_type=code&scope=openid&client_id=testid&redirect_uri=http%3A%2F%2Ftestserver%2Foidc%2Fcallback%2F&state=not-a-random-string&nonce=not-a-random-string
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n \n\n\n\n\n
+ \ \n
\n
+ \ \n
\n
+ \
\n\n\n
\n \n\n\n\n\n\n
+ \
\n
\n\n
\n
\n\n\n"
+ headers:
+ Cache-Control:
+ - no-store, must-revalidate, max-age=0
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Set-Cookie:
+ - AUTH_SESSION_ID=c3b5b1f2-4bf9-488b-bed6-1edee3734d1f; Version=1; Path=/realms/test/;
+ SameSite=None; Secure; HttpOnly
+ - AUTH_SESSION_ID_LEGACY=c3b5b1f2-4bf9-488b-bed6-1edee3734d1f; Version=1; Path=/realms/test/;
+ HttpOnly
+ - KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJjaWQiOiJ0ZXN0aWQiLCJwdHkiOiJvcGVuaWQtY29ubmVjdCIsInJ1cmkiOiJodHRwOi8vdGVzdHNlcnZlci9vaWRjL2NhbGxiYWNrLyIsImFjdCI6IkFVVEhFTlRJQ0FURSIsIm5vdGVzIjp7InNjb3BlIjoib3BlbmlkIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0IiwicmVzcG9uc2VfdHlwZSI6ImNvZGUiLCJyZWRpcmVjdF91cmkiOiJodHRwOi8vdGVzdHNlcnZlci9vaWRjL2NhbGxiYWNrLyIsInN0YXRlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyJ9fQ.f7ZABGR0O48xm61gDKLOR_LjWH9a59wtTbGXUfm78sI;
+ Version=1; Path=/realms/test/; HttpOnly
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '4466'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: username=admin&password=admin&credentialId=&login=Sign+In
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '57'
+ Content-Type:
+ - application/x-www-form-urlencoded
+ Cookie:
+ - AUTH_SESSION_ID_LEGACY=c3b5b1f2-4bf9-488b-bed6-1edee3734d1f; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJjaWQiOiJ0ZXN0aWQiLCJwdHkiOiJvcGVuaWQtY29ubmVjdCIsInJ1cmkiOiJodHRwOi8vdGVzdHNlcnZlci9vaWRjL2NhbGxiYWNrLyIsImFjdCI6IkFVVEhFTlRJQ0FURSIsIm5vdGVzIjp7InNjb3BlIjoib3BlbmlkIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0IiwicmVzcG9uc2VfdHlwZSI6ImNvZGUiLCJyZWRpcmVjdF91cmkiOiJodHRwOi8vdGVzdHNlcnZlci9vaWRjL2NhbGxiYWNrLyIsInN0YXRlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyJ9fQ.f7ZABGR0O48xm61gDKLOR_LjWH9a59wtTbGXUfm78sI
+ User-Agent:
+ - python-requests/2.32.2
+ method: POST
+ uri: http://localhost:8080/realms/test/login-actions/authenticate?session_code=IMfjw269h3bzNCjsFUxMyAlhX78DMgf_2isleVcw9sA&execution=d8b8778e-a545-45d4-8f72-fd69facf4b72&client_id=testid&tab_id=sIbVnUOdrgo
+ response:
+ body:
+ string: ''
+ headers:
+ Cache-Control:
+ - no-store, must-revalidate, max-age=0
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Location:
+ - http://testserver/oidc/callback/?state=not-a-random-string&session_state=c3b5b1f2-4bf9-488b-bed6-1edee3734d1f&iss=http%3A%2F%2Flocalhost%3A8080%2Frealms%2Ftest&code=ca5a69c2-2883-4087-ab83-9ac459cc12fa.c3b5b1f2-4bf9-488b-bed6-1edee3734d1f.adf4ad83-4550-4619-9231-73bd8d700f45
+ Referrer-Policy:
+ - no-referrer
+ Set-Cookie:
+ - KEYCLOAK_LOCALE=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test/; HttpOnly
+ - KC_RESTART=; Version=1; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0;
+ Path=/realms/test/; HttpOnly
+ - KC_AUTH_STATE=; Version=1; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0;
+ Path=/realms/test/
+ - KEYCLOAK_IDENTITY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTY1MDUwMzUsImlhdCI6MTcxNjQ2OTAzNSwianRpIjoiYmVlN2U3ZDAtY2E1ZS00YjQ1LWE4MzktZjQzZmJkZmI2NzUwIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiNmRiMmRiODctZGUzMS00ZTMwLTlmMjUtY2VmZTVkYThiMTU0IiwidHlwIjoiU2VyaWFsaXplZC1JRCIsInNlc3Npb25fc3RhdGUiOiJjM2I1YjFmMi00YmY5LTQ4OGItYmVkNi0xZWRlZTM3MzRkMWYiLCJzaWQiOiJjM2I1YjFmMi00YmY5LTQ4OGItYmVkNi0xZWRlZTM3MzRkMWYiLCJzdGF0ZV9jaGVja2VyIjoiMXBJYllqSUVPbzBvWjBOLUtEWTlJRzcwckpqQlUyMnlGTXNIelNQV21uayJ9.qVE1dwuXYAQCG3v3Wdu153Em7PDadb-p8ZQpias8JeI;
+ Version=1; Path=/realms/test/; SameSite=None; Secure; HttpOnly
+ - KEYCLOAK_IDENTITY_LEGACY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTY1MDUwMzUsImlhdCI6MTcxNjQ2OTAzNSwianRpIjoiYmVlN2U3ZDAtY2E1ZS00YjQ1LWE4MzktZjQzZmJkZmI2NzUwIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiNmRiMmRiODctZGUzMS00ZTMwLTlmMjUtY2VmZTVkYThiMTU0IiwidHlwIjoiU2VyaWFsaXplZC1JRCIsInNlc3Npb25fc3RhdGUiOiJjM2I1YjFmMi00YmY5LTQ4OGItYmVkNi0xZWRlZTM3MzRkMWYiLCJzaWQiOiJjM2I1YjFmMi00YmY5LTQ4OGItYmVkNi0xZWRlZTM3MzRkMWYiLCJzdGF0ZV9jaGVja2VyIjoiMXBJYllqSUVPbzBvWjBOLUtEWTlJRzcwckpqQlUyMnlGTXNIelNQV21uayJ9.qVE1dwuXYAQCG3v3Wdu153Em7PDadb-p8ZQpias8JeI;
+ Version=1; Path=/realms/test/; HttpOnly
+ - KEYCLOAK_SESSION=test/6db2db87-de31-4e30-9f25-cefe5da8b154/c3b5b1f2-4bf9-488b-bed6-1edee3734d1f;
+ Version=1; Expires=Thu, 23-May-2024 22:57:15 GMT; Max-Age=36000; Path=/realms/test/;
+ SameSite=None; Secure
+ - KEYCLOAK_SESSION_LEGACY=test/6db2db87-de31-4e30-9f25-cefe5da8b154/c3b5b1f2-4bf9-488b-bed6-1edee3734d1f;
+ Version=1; Expires=Thu, 23-May-2024 22:57:15 GMT; Max-Age=36000; Path=/realms/test/
+ - KEYCLOAK_REMEMBER_ME=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test/; HttpOnly
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '0'
+ status:
+ code: 302
+ message: Found
+- request:
+ body: client_id=testid&client_secret=7DB3KUAAizYCcmZufpHRVOcD0TOkNO3I&grant_type=authorization_code&code=ca5a69c2-2883-4087-ab83-9ac459cc12fa.c3b5b1f2-4bf9-488b-bed6-1edee3734d1f.adf4ad83-4550-4619-9231-73bd8d700f45&redirect_uri=http%3A%2F%2Ftestserver%2Foidc%2Fcallback%2F
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '267'
+ Content-Type:
+ - application/x-www-form-urlencoded
+ User-Agent:
+ - python-requests/2.32.2
+ method: POST
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/token
+ response:
+ body:
+ string: '{"access_token":"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTY0NjkzMzUsImlhdCI6MTcxNjQ2OTAzNSwiYXV0aF90aW1lIjoxNzE2NDY5MDM1LCJqdGkiOiI1MTg2YzFhNC1hNDljLTRjZGMtYWYxMS01ZTFlNTRmNjA5ZjIiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiNmRiMmRiODctZGUzMS00ZTMwLTlmMjUtY2VmZTVkYThiMTU0IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoidGVzdGlkIiwibm9uY2UiOiJub3QtYS1yYW5kb20tc3RyaW5nIiwic2Vzc2lvbl9zdGF0ZSI6ImMzYjViMWYyLTRiZjktNDg4Yi1iZWQ2LTFlZGVlMzczNGQxZiIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOlsiaHR0cDovLzEyNy4wLjAuMTo4MDAwIl0sInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJkZWZhdWx0LXJvbGVzLXRlc3QiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgZW1haWwgcHJvZmlsZSBrdmsgYnNuIiwic2lkIjoiYzNiNWIxZjItNGJmOS00ODhiLWJlZDYtMWVkZWUzNzM0ZDFmIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsInByZWZlcnJlZF91c2VybmFtZSI6ImFkbWluIiwiZW1haWwiOiJhZG1pbkBleGFtcGxlLmNvbSJ9.davFz7HL1a1DMJIoN0afUno2D0fNZGuhnvbTvbLjiidy1psJYQ10kQ1fN7BJ3SjmjmWwNNfwYvao9X5LCo__6mx8Hve_aVZe_qayDO2NvC5pd74zsDvw4K4eg7BJzGz8mmXhz990LzuxiEpmMAArLxA3oPFdUYREq7hLi5DOPWVS9VvHO8IOFlgGxaY544Ne9YYYyPYBNfXM2Opax9vIjuHwbc-Wj0BOHV9qTOKlO9zP58OYGbl-loeVa4VIAKMsQd1e5o-atcfFg5FqmNSuPOCq65aPvz8kKFCagGi-ATLpqDE35kz3WohuGDmPXBLuoPla9wZdGPksyA0ZaXxynQ","expires_in":300,"refresh_expires_in":1800,"refresh_token":"eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTY0NzA4MzUsImlhdCI6MTcxNjQ2OTAzNSwianRpIjoiYTY4NzE2NjctNTRiNi00NTRiLWFkZWQtYWE4NDZmY2UxNTA5IiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0IiwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiNmRiMmRiODctZGUzMS00ZTMwLTlmMjUtY2VmZTVkYThiMTU0IiwidHlwIjoiUmVmcmVzaCIsImF6cCI6InRlc3RpZCIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsInNlc3Npb25fc3RhdGUiOiJjM2I1YjFmMi00YmY5LTQ4OGItYmVkNi0xZWRlZTM3MzRkMWYiLCJzY29wZSI6Im9wZW5pZCBlbWFpbCBwcm9maWxlIGt2ayBic24iLCJzaWQiOiJjM2I1YjFmMi00YmY5LTQ4OGItYmVkNi0xZWRlZTM3MzRkMWYifQ.96vrmyT9wEbfoRnFY-sM18qd7TqyRKesnw6gkyTFZhU","token_type":"Bearer","id_token":"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTY0NjkzMzUsImlhdCI6MTcxNjQ2OTAzNSwiYXV0aF90aW1lIjoxNzE2NDY5MDM1LCJqdGkiOiI3ZjQ4ZTE4Zi0wZWJmLTQwNDEtYjZkYS0wMjg5ZjUzZjM0OGYiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJ0ZXN0aWQiLCJzdWIiOiI2ZGIyZGI4Ny1kZTMxLTRlMzAtOWYyNS1jZWZlNWRhOGIxNTQiLCJ0eXAiOiJJRCIsImF6cCI6InRlc3RpZCIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsInNlc3Npb25fc3RhdGUiOiJjM2I1YjFmMi00YmY5LTQ4OGItYmVkNi0xZWRlZTM3MzRkMWYiLCJhdF9oYXNoIjoiN210NmF3RzB0VDdNR0dyU0pIZG5XZyIsImFjciI6IjEiLCJzaWQiOiJjM2I1YjFmMi00YmY5LTQ4OGItYmVkNi0xZWRlZTM3MzRkMWYiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwicHJlZmVycmVkX3VzZXJuYW1lIjoiYWRtaW4iLCJlbWFpbCI6ImFkbWluQGV4YW1wbGUuY29tIn0.mfCuzUmfNqMFbIgtYbBkjxd8Q-ncxUIpuRChVnKB4M97THc5aev4G4-VhOgSdpbruxwGFNuxiCQ0MmrdsNepq9E9WFHlZsoFEmmaw5dDTYFWtxqdM1tmdKSzHoTEwm10QHiOTvF_CYJJ2ubv48SjG3_1wm7k0OmrjrZ0bzOYWmsHtSJDbnNuhveFjJp9lHgJmWA8fZma9b6YkUuEvsEz8MsCUqHHv4ws-2yybgfmWxggi_sB75Hs24NMRpPJtwSJnSVNfd3YV4fbv0f-G2uPtWBr7IKJ9fQ6Hx9YIdUk5r3AgkBWvKn6YOGG2I8CnW9zOQdWO4gJVjzrQxOV7A62PA","not-before-policy":0,"session_state":"c3b5b1f2-4bf9-488b-bed6-1edee3734d1f","scope":"openid
+ email profile kvk bsn"}'
+ headers:
+ Cache-Control:
+ - no-store
+ Content-Type:
+ - application/json
+ Pragma:
+ - no-cache
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '3443'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.32.2
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/certs
+ response:
+ body:
+ string: '{"keys":[{"kid":"4UNQAcvUcv-DFUOx_4O1gt13OdJSotqEKPZurs2vQW8","kty":"RSA","alg":"RS256","use":"sig","n":"2DOZ0qHie73SuFVR7civrl6r82YUiAghfzaMowjCg0o06AF--2lIS7vNV_PbsVVznPAAMqVrNG-8CcevEzvVZMQD9nH4DI7xlOxK0lrYu8rmMeSfOvXVbBVsWBZe0jnGNukZqjwmRE5__ttJdxPfIBT5-2L6mguQbDfhSUEEdIW7y7UfOXvqLqEcBtoIEB-ORKDTUIQwGZM5mSCy-cY3cHvvZfZVgaUUy5NvujPRXTMje4n_hG0KfEV-40G9qC2_Xvx4EooJzBZ6FSThiWhCpwhIvzcQqB6M9lHW7nU6wADhYPNCa2OKWvphwZ_zbrF4B9dmS6Zli5rBvbox9Hh45w","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMLTANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANgzmdKh4nu90rhVUe3Ir65eq/NmFIgIIX82jKMIwoNKNOgBfvtpSEu7zVfz27FVc5zwADKlazRvvAnHrxM71WTEA/Zx+AyO8ZTsStJa2LvK5jHknzr11WwVbFgWXtI5xjbpGao8JkROf/7bSXcT3yAU+fti+poLkGw34UlBBHSFu8u1Hzl76i6hHAbaCBAfjkSg01CEMBmTOZkgsvnGN3B772X2VYGlFMuTb7oz0V0zI3uJ/4RtCnxFfuNBvagtv178eBKKCcwWehUk4YloQqcISL83EKgejPZR1u51OsAA4WDzQmtjilr6YcGf826xeAfXZkumZYuawb26MfR4eOcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAsnQG/Yi2g1XTCJn74hWv9MjxVAaZb4gBAc2AWm5VgAjhFEM9h6x6m1mQkq7JM4rIdAj8jw55Ok9CBVBIqq4G4cME3eUvVytkj2lC9zcRoAivjjZF2HPg7zNPa2TTR50asmHPRokppV6gewO/C+o5as+4P2zqDXBh61aRd/9kdQfkg14LBbH5/dYccAuvUqlTYC4IEPCvVmBNC1xsMjf0vohvoSjm9vL2bfqG/RJH0ScdCjOd5d2zju4/e2oVdluWm+vzKBQplc7tVMuKpn6LcLmVHiGNAl+EBIZH+WVLlTx0D1+kbHZsfLYG53lQg2LsvurRbWyF/a5fVM/oLTn5ag=="],"x5t":"H5xfs1pRtvX0HyVTskx7eTXx88U","x5t#S256":"XurVtKAIEyc4w9HCGOhnjoRHnYu4d9HCn_5YHmkScJg"},{"kid":"TV3Tl5jIY1nrJLSb53UKEubLR5gYiq9slq1SsDDg1HU","kty":"RSA","alg":"RSA-OAEP","use":"enc","n":"pNvU3ecpVHbJT4bCOEpw6cnV1yi65tB3I0bRF2ilLVOY944QRAGnjBBECPIzNbgqavghYp1j75F2nq6_ny1CYfoaxTV2iDpRUw8_f7sliYbl8FrLLat0S25ItlZrg5TEJHObvOqlG2_nXoeH36MRWwNhms2uCqfhn5VgtenIzpQIBolnM7zzGp21NvdJ1C_ZAUzkXC-l3oQ-BXTtpEVM4h2KpYh4gfZJWCbYij5d1e1YApKD6V61_Cs3Oa2OY7CAUyq5kgAWJZFDB6CpzIr226u3bV7F9RbrQu3Ybc_Lv33EwykscLznKWZY2Mbs3Iz_rFNv3sVX_vHpH4DHWlKu7Q","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMlzANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKTb1N3nKVR2yU+GwjhKcOnJ1dcouubQdyNG0RdopS1TmPeOEEQBp4wQRAjyMzW4Kmr4IWKdY++Rdp6uv58tQmH6GsU1dog6UVMPP3+7JYmG5fBayy2rdEtuSLZWa4OUxCRzm7zqpRtv516Hh9+jEVsDYZrNrgqn4Z+VYLXpyM6UCAaJZzO88xqdtTb3SdQv2QFM5Fwvpd6EPgV07aRFTOIdiqWIeIH2SVgm2Io+XdXtWAKSg+letfwrNzmtjmOwgFMquZIAFiWRQwegqcyK9turt21exfUW60Lt2G3Py799xMMpLHC85ylmWNjG7NyM/6xTb97FV/7x6R+Ax1pSru0CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAQGJHeTYSMvp0yndbIn7DLohO9lom5nRrx/bLyb7TiRfogyJEF6rQZ66CAkQFk5eMF878fsHTuMVjtmXVBnhojhVmK91HwjsNQu/8xR6QMXNKJQMvHR245vwUGxlWRw/36ObM1D7QjCd/q+FonpBEY4m5Y6Uz1U0HR2Cbh0E2afVlPLeV+F0LKrlyVMdIaWBGWftCGIKDAHaG/PD66zbAKtxerv2fBIDq100WHPhd57BZxX+2aGJp1IaRDgkxV0E/CjEy3+Knd8xbAgUSW0Tl6OTC75exIvlbzeluEBe0wlapAb7WvBKYsipSW8G8Ey7tjoolDT4AU82EaKUPstiMnA=="],"x5t":"AlfHDI0FOPQpt3RBAILt0dtW1yw","x5t#S256":"a7bhm8-JsnfY7bL_m8Yl72hgmp5516VZlFcVloKzk08"}]}'
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/json;charset=UTF-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '2909'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Authorization:
+ - Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTY0NjkzMzUsImlhdCI6MTcxNjQ2OTAzNSwiYXV0aF90aW1lIjoxNzE2NDY5MDM1LCJqdGkiOiI1MTg2YzFhNC1hNDljLTRjZGMtYWYxMS01ZTFlNTRmNjA5ZjIiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiNmRiMmRiODctZGUzMS00ZTMwLTlmMjUtY2VmZTVkYThiMTU0IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoidGVzdGlkIiwibm9uY2UiOiJub3QtYS1yYW5kb20tc3RyaW5nIiwic2Vzc2lvbl9zdGF0ZSI6ImMzYjViMWYyLTRiZjktNDg4Yi1iZWQ2LTFlZGVlMzczNGQxZiIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOlsiaHR0cDovLzEyNy4wLjAuMTo4MDAwIl0sInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJkZWZhdWx0LXJvbGVzLXRlc3QiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgZW1haWwgcHJvZmlsZSBrdmsgYnNuIiwic2lkIjoiYzNiNWIxZjItNGJmOS00ODhiLWJlZDYtMWVkZWUzNzM0ZDFmIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsInByZWZlcnJlZF91c2VybmFtZSI6ImFkbWluIiwiZW1haWwiOiJhZG1pbkBleGFtcGxlLmNvbSJ9.davFz7HL1a1DMJIoN0afUno2D0fNZGuhnvbTvbLjiidy1psJYQ10kQ1fN7BJ3SjmjmWwNNfwYvao9X5LCo__6mx8Hve_aVZe_qayDO2NvC5pd74zsDvw4K4eg7BJzGz8mmXhz990LzuxiEpmMAArLxA3oPFdUYREq7hLi5DOPWVS9VvHO8IOFlgGxaY544Ne9YYYyPYBNfXM2Opax9vIjuHwbc-Wj0BOHV9qTOKlO9zP58OYGbl-loeVa4VIAKMsQd1e5o-atcfFg5FqmNSuPOCq65aPvz8kKFCagGi-ATLpqDE35kz3WohuGDmPXBLuoPla9wZdGPksyA0ZaXxynQ
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.32.2
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/userinfo
+ response:
+ body:
+ string: eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJzdWIiOiI2ZGIyZGI4Ny1kZTMxLTRlMzAtOWYyNS1jZWZlNWRhOGIxNTQiLCJhdWQiOiJ0ZXN0aWQiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0IiwicHJlZmVycmVkX3VzZXJuYW1lIjoiYWRtaW4iLCJlbWFpbCI6ImFkbWluQGV4YW1wbGUuY29tIn0.JOw15ll6KCKOWcVDnth2wlYiF9XhBH7rtbWbN6cJjrk2iRH4MN0LbIRY7JLUpyXZv10aYqMa4pOKZK1TEEMdam1fDn58tUDpckq8EcGVo3XAWM737C64oL8a1ivhWIG37TPpgJyPlJL31lJ4WPGxVf-xSlCTRaZ0rqHI4FoqOrzrjnbwZg6crYagA8Zp4zzqVFEQ312VTxXVkIcsrw7pl5k29Ip0AhNXaB1VBTUTj4arUpfaM7ncewiKc7nVij87WeoziG-HaBTvCrTN7JMwBDrNvvsAOmht1P3g9lHu_XbpP9jahA73ecMXef1cV2txB-W80HNC-X2OXuz6cIrsiw
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/jwt
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '698'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.32.2
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/certs
+ response:
+ body:
+ string: '{"keys":[{"kid":"4UNQAcvUcv-DFUOx_4O1gt13OdJSotqEKPZurs2vQW8","kty":"RSA","alg":"RS256","use":"sig","n":"2DOZ0qHie73SuFVR7civrl6r82YUiAghfzaMowjCg0o06AF--2lIS7vNV_PbsVVznPAAMqVrNG-8CcevEzvVZMQD9nH4DI7xlOxK0lrYu8rmMeSfOvXVbBVsWBZe0jnGNukZqjwmRE5__ttJdxPfIBT5-2L6mguQbDfhSUEEdIW7y7UfOXvqLqEcBtoIEB-ORKDTUIQwGZM5mSCy-cY3cHvvZfZVgaUUy5NvujPRXTMje4n_hG0KfEV-40G9qC2_Xvx4EooJzBZ6FSThiWhCpwhIvzcQqB6M9lHW7nU6wADhYPNCa2OKWvphwZ_zbrF4B9dmS6Zli5rBvbox9Hh45w","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMLTANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANgzmdKh4nu90rhVUe3Ir65eq/NmFIgIIX82jKMIwoNKNOgBfvtpSEu7zVfz27FVc5zwADKlazRvvAnHrxM71WTEA/Zx+AyO8ZTsStJa2LvK5jHknzr11WwVbFgWXtI5xjbpGao8JkROf/7bSXcT3yAU+fti+poLkGw34UlBBHSFu8u1Hzl76i6hHAbaCBAfjkSg01CEMBmTOZkgsvnGN3B772X2VYGlFMuTb7oz0V0zI3uJ/4RtCnxFfuNBvagtv178eBKKCcwWehUk4YloQqcISL83EKgejPZR1u51OsAA4WDzQmtjilr6YcGf826xeAfXZkumZYuawb26MfR4eOcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAsnQG/Yi2g1XTCJn74hWv9MjxVAaZb4gBAc2AWm5VgAjhFEM9h6x6m1mQkq7JM4rIdAj8jw55Ok9CBVBIqq4G4cME3eUvVytkj2lC9zcRoAivjjZF2HPg7zNPa2TTR50asmHPRokppV6gewO/C+o5as+4P2zqDXBh61aRd/9kdQfkg14LBbH5/dYccAuvUqlTYC4IEPCvVmBNC1xsMjf0vohvoSjm9vL2bfqG/RJH0ScdCjOd5d2zju4/e2oVdluWm+vzKBQplc7tVMuKpn6LcLmVHiGNAl+EBIZH+WVLlTx0D1+kbHZsfLYG53lQg2LsvurRbWyF/a5fVM/oLTn5ag=="],"x5t":"H5xfs1pRtvX0HyVTskx7eTXx88U","x5t#S256":"XurVtKAIEyc4w9HCGOhnjoRHnYu4d9HCn_5YHmkScJg"},{"kid":"TV3Tl5jIY1nrJLSb53UKEubLR5gYiq9slq1SsDDg1HU","kty":"RSA","alg":"RSA-OAEP","use":"enc","n":"pNvU3ecpVHbJT4bCOEpw6cnV1yi65tB3I0bRF2ilLVOY944QRAGnjBBECPIzNbgqavghYp1j75F2nq6_ny1CYfoaxTV2iDpRUw8_f7sliYbl8FrLLat0S25ItlZrg5TEJHObvOqlG2_nXoeH36MRWwNhms2uCqfhn5VgtenIzpQIBolnM7zzGp21NvdJ1C_ZAUzkXC-l3oQ-BXTtpEVM4h2KpYh4gfZJWCbYij5d1e1YApKD6V61_Cs3Oa2OY7CAUyq5kgAWJZFDB6CpzIr226u3bV7F9RbrQu3Ybc_Lv33EwykscLznKWZY2Mbs3Iz_rFNv3sVX_vHpH4DHWlKu7Q","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMlzANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKTb1N3nKVR2yU+GwjhKcOnJ1dcouubQdyNG0RdopS1TmPeOEEQBp4wQRAjyMzW4Kmr4IWKdY++Rdp6uv58tQmH6GsU1dog6UVMPP3+7JYmG5fBayy2rdEtuSLZWa4OUxCRzm7zqpRtv516Hh9+jEVsDYZrNrgqn4Z+VYLXpyM6UCAaJZzO88xqdtTb3SdQv2QFM5Fwvpd6EPgV07aRFTOIdiqWIeIH2SVgm2Io+XdXtWAKSg+letfwrNzmtjmOwgFMquZIAFiWRQwegqcyK9turt21exfUW60Lt2G3Py799xMMpLHC85ylmWNjG7NyM/6xTb97FV/7x6R+Ax1pSru0CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAQGJHeTYSMvp0yndbIn7DLohO9lom5nRrx/bLyb7TiRfogyJEF6rQZ66CAkQFk5eMF878fsHTuMVjtmXVBnhojhVmK91HwjsNQu/8xR6QMXNKJQMvHR245vwUGxlWRw/36ObM1D7QjCd/q+FonpBEY4m5Y6Uz1U0HR2Cbh0E2afVlPLeV+F0LKrlyVMdIaWBGWftCGIKDAHaG/PD66zbAKtxerv2fBIDq100WHPhd57BZxX+2aGJp1IaRDgkxV0E/CjEy3+Knd8xbAgUSW0Tl6OTC75exIvlbzeluEBe0wlapAb7WvBKYsipSW8G8Ey7tjoolDT4AU82EaKUPstiMnA=="],"x5t":"AlfHDI0FOPQpt3RBAILt0dtW1yw","x5t#S256":"a7bhm8-JsnfY7bL_m8Yl72hgmp5516VZlFcVloKzk08"}]}'
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/json;charset=UTF-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '2909'
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/src/openforms/accounts/tests/data/vcr_cassettes/OIDCFLowTests/OIDCFLowTests.test_happy_flow_existing_user.yaml b/src/openforms/accounts/tests/data/vcr_cassettes/OIDCFLowTests/OIDCFLowTests.test_happy_flow_existing_user.yaml
new file mode 100644
index 0000000000..419c1e7973
--- /dev/null
+++ b/src/openforms/accounts/tests/data/vcr_cassettes/OIDCFLowTests/OIDCFLowTests.test_happy_flow_existing_user.yaml
@@ -0,0 +1,314 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.32.2
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth?response_type=code&scope=openid&client_id=testid&redirect_uri=http%3A%2F%2Ftestserver%2Foidc%2Fcallback%2F&state=not-a-random-string&nonce=not-a-random-string
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n \n\n\n\n\n
+ \ \n
\n
+ \ \n
\n
+ \
\n\n\n
\n \n\n\n\n\n\n
+ \
\n
\n\n
\n
\n\n\n"
+ headers:
+ Cache-Control:
+ - no-store, must-revalidate, max-age=0
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Set-Cookie:
+ - AUTH_SESSION_ID=375f1de6-f279-462d-ad03-5e520bb5ec8d; Version=1; Path=/realms/test/;
+ SameSite=None; Secure; HttpOnly
+ - AUTH_SESSION_ID_LEGACY=375f1de6-f279-462d-ad03-5e520bb5ec8d; Version=1; Path=/realms/test/;
+ HttpOnly
+ - KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJjaWQiOiJ0ZXN0aWQiLCJwdHkiOiJvcGVuaWQtY29ubmVjdCIsInJ1cmkiOiJodHRwOi8vdGVzdHNlcnZlci9vaWRjL2NhbGxiYWNrLyIsImFjdCI6IkFVVEhFTlRJQ0FURSIsIm5vdGVzIjp7InNjb3BlIjoib3BlbmlkIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0IiwicmVzcG9uc2VfdHlwZSI6ImNvZGUiLCJyZWRpcmVjdF91cmkiOiJodHRwOi8vdGVzdHNlcnZlci9vaWRjL2NhbGxiYWNrLyIsInN0YXRlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyJ9fQ.f7ZABGR0O48xm61gDKLOR_LjWH9a59wtTbGXUfm78sI;
+ Version=1; Path=/realms/test/; HttpOnly
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '4466'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: username=admin&password=admin&credentialId=&login=Sign+In
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '57'
+ Content-Type:
+ - application/x-www-form-urlencoded
+ Cookie:
+ - AUTH_SESSION_ID_LEGACY=375f1de6-f279-462d-ad03-5e520bb5ec8d; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJjaWQiOiJ0ZXN0aWQiLCJwdHkiOiJvcGVuaWQtY29ubmVjdCIsInJ1cmkiOiJodHRwOi8vdGVzdHNlcnZlci9vaWRjL2NhbGxiYWNrLyIsImFjdCI6IkFVVEhFTlRJQ0FURSIsIm5vdGVzIjp7InNjb3BlIjoib3BlbmlkIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0IiwicmVzcG9uc2VfdHlwZSI6ImNvZGUiLCJyZWRpcmVjdF91cmkiOiJodHRwOi8vdGVzdHNlcnZlci9vaWRjL2NhbGxiYWNrLyIsInN0YXRlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyJ9fQ.f7ZABGR0O48xm61gDKLOR_LjWH9a59wtTbGXUfm78sI
+ User-Agent:
+ - python-requests/2.32.2
+ method: POST
+ uri: http://localhost:8080/realms/test/login-actions/authenticate?session_code=6QihpIOuTNlojr95BaoT04YSO6icbaaM2EMKzNWrujE&execution=d8b8778e-a545-45d4-8f72-fd69facf4b72&client_id=testid&tab_id=VEhr-Z2xFvY
+ response:
+ body:
+ string: ''
+ headers:
+ Cache-Control:
+ - no-store, must-revalidate, max-age=0
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Location:
+ - http://testserver/oidc/callback/?state=not-a-random-string&session_state=375f1de6-f279-462d-ad03-5e520bb5ec8d&iss=http%3A%2F%2Flocalhost%3A8080%2Frealms%2Ftest&code=8e9e69e9-105e-414e-8ea3-7bf661026e73.375f1de6-f279-462d-ad03-5e520bb5ec8d.adf4ad83-4550-4619-9231-73bd8d700f45
+ Referrer-Policy:
+ - no-referrer
+ Set-Cookie:
+ - KEYCLOAK_LOCALE=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test/; HttpOnly
+ - KC_RESTART=; Version=1; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0;
+ Path=/realms/test/; HttpOnly
+ - KC_AUTH_STATE=; Version=1; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0;
+ Path=/realms/test/
+ - KEYCLOAK_IDENTITY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTY1MDUwMzUsImlhdCI6MTcxNjQ2OTAzNSwianRpIjoiODcyMWI4MDEtYjMwNC00NjZkLTkzODYtZWM4NTdjOGE5Yzg4IiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiNmRiMmRiODctZGUzMS00ZTMwLTlmMjUtY2VmZTVkYThiMTU0IiwidHlwIjoiU2VyaWFsaXplZC1JRCIsInNlc3Npb25fc3RhdGUiOiIzNzVmMWRlNi1mMjc5LTQ2MmQtYWQwMy01ZTUyMGJiNWVjOGQiLCJzaWQiOiIzNzVmMWRlNi1mMjc5LTQ2MmQtYWQwMy01ZTUyMGJiNWVjOGQiLCJzdGF0ZV9jaGVja2VyIjoibGE4Sms0UXFmUTRsZEFfMUEzYXV6eW00WHlGcUVGMXl3eXNfYjVDaFl4YyJ9.hNeVYblFwRFrka1HCwk76UKGaYrCuTXHUnxoZ6xgMhQ;
+ Version=1; Path=/realms/test/; SameSite=None; Secure; HttpOnly
+ - KEYCLOAK_IDENTITY_LEGACY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTY1MDUwMzUsImlhdCI6MTcxNjQ2OTAzNSwianRpIjoiODcyMWI4MDEtYjMwNC00NjZkLTkzODYtZWM4NTdjOGE5Yzg4IiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiNmRiMmRiODctZGUzMS00ZTMwLTlmMjUtY2VmZTVkYThiMTU0IiwidHlwIjoiU2VyaWFsaXplZC1JRCIsInNlc3Npb25fc3RhdGUiOiIzNzVmMWRlNi1mMjc5LTQ2MmQtYWQwMy01ZTUyMGJiNWVjOGQiLCJzaWQiOiIzNzVmMWRlNi1mMjc5LTQ2MmQtYWQwMy01ZTUyMGJiNWVjOGQiLCJzdGF0ZV9jaGVja2VyIjoibGE4Sms0UXFmUTRsZEFfMUEzYXV6eW00WHlGcUVGMXl3eXNfYjVDaFl4YyJ9.hNeVYblFwRFrka1HCwk76UKGaYrCuTXHUnxoZ6xgMhQ;
+ Version=1; Path=/realms/test/; HttpOnly
+ - KEYCLOAK_SESSION=test/6db2db87-de31-4e30-9f25-cefe5da8b154/375f1de6-f279-462d-ad03-5e520bb5ec8d;
+ Version=1; Expires=Thu, 23-May-2024 22:57:15 GMT; Max-Age=36000; Path=/realms/test/;
+ SameSite=None; Secure
+ - KEYCLOAK_SESSION_LEGACY=test/6db2db87-de31-4e30-9f25-cefe5da8b154/375f1de6-f279-462d-ad03-5e520bb5ec8d;
+ Version=1; Expires=Thu, 23-May-2024 22:57:15 GMT; Max-Age=36000; Path=/realms/test/
+ - KEYCLOAK_REMEMBER_ME=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test/; HttpOnly
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '0'
+ status:
+ code: 302
+ message: Found
+- request:
+ body: client_id=testid&client_secret=7DB3KUAAizYCcmZufpHRVOcD0TOkNO3I&grant_type=authorization_code&code=8e9e69e9-105e-414e-8ea3-7bf661026e73.375f1de6-f279-462d-ad03-5e520bb5ec8d.adf4ad83-4550-4619-9231-73bd8d700f45&redirect_uri=http%3A%2F%2Ftestserver%2Foidc%2Fcallback%2F
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '267'
+ Content-Type:
+ - application/x-www-form-urlencoded
+ User-Agent:
+ - python-requests/2.32.2
+ method: POST
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/token
+ response:
+ body:
+ string: '{"access_token":"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTY0NjkzMzUsImlhdCI6MTcxNjQ2OTAzNSwiYXV0aF90aW1lIjoxNzE2NDY5MDM1LCJqdGkiOiJlMDhmYzg2Zi00ODAzLTQwNjktYjY3Ni0xYjVkOTMxNWRhOTUiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiNmRiMmRiODctZGUzMS00ZTMwLTlmMjUtY2VmZTVkYThiMTU0IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoidGVzdGlkIiwibm9uY2UiOiJub3QtYS1yYW5kb20tc3RyaW5nIiwic2Vzc2lvbl9zdGF0ZSI6IjM3NWYxZGU2LWYyNzktNDYyZC1hZDAzLTVlNTIwYmI1ZWM4ZCIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOlsiaHR0cDovLzEyNy4wLjAuMTo4MDAwIl0sInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJkZWZhdWx0LXJvbGVzLXRlc3QiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgZW1haWwgcHJvZmlsZSBrdmsgYnNuIiwic2lkIjoiMzc1ZjFkZTYtZjI3OS00NjJkLWFkMDMtNWU1MjBiYjVlYzhkIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsInByZWZlcnJlZF91c2VybmFtZSI6ImFkbWluIiwiZW1haWwiOiJhZG1pbkBleGFtcGxlLmNvbSJ9.JEWLm0cX6uCrs7BQ4DVPrHvR9HwteuO__BiP2-lppc04HQisf2ehz--RAy1RYfcalXn2Ksk-wHR_LtlrOmnVYRF2Fd6kjv5T16irxYlmxhxFi8eb15-s-EtE8D3dITHl9LUOQnYFimYHqP5oA_UZf80664_lJ18Bv0gUSEcV7ugbS1ifrhJLiQfwv2wnHLOI2As80Fuf_XVl8LrzQyvATieK_dV51qoe0_tsySoq7X37LmapV0RNiQOtbspQtsTBO_gFtCXR4eOTmqYCyHE1P2hS3edmcWGCJlxsV6zWK3ZxYA2yXjZglleL1ELFhYC3uipaxRMW5Ohx24s1Tk3NVg","expires_in":300,"refresh_expires_in":1800,"refresh_token":"eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTY0NzA4MzUsImlhdCI6MTcxNjQ2OTAzNSwianRpIjoiODRjZmRmNzYtOWFhNC00MGZhLThjYzEtOGI3ZDAzYjBjYWFiIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0IiwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiNmRiMmRiODctZGUzMS00ZTMwLTlmMjUtY2VmZTVkYThiMTU0IiwidHlwIjoiUmVmcmVzaCIsImF6cCI6InRlc3RpZCIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsInNlc3Npb25fc3RhdGUiOiIzNzVmMWRlNi1mMjc5LTQ2MmQtYWQwMy01ZTUyMGJiNWVjOGQiLCJzY29wZSI6Im9wZW5pZCBlbWFpbCBwcm9maWxlIGt2ayBic24iLCJzaWQiOiIzNzVmMWRlNi1mMjc5LTQ2MmQtYWQwMy01ZTUyMGJiNWVjOGQifQ.orsrRmVbPg1KI8L96i4JLn-cjSQdwoPKAfO30k-DqmY","token_type":"Bearer","id_token":"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTY0NjkzMzUsImlhdCI6MTcxNjQ2OTAzNSwiYXV0aF90aW1lIjoxNzE2NDY5MDM1LCJqdGkiOiJkNTg3OGVkOS04MDFmLTRlNzUtYWVkNC0wYjE2NTc1NmE2NjYiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJ0ZXN0aWQiLCJzdWIiOiI2ZGIyZGI4Ny1kZTMxLTRlMzAtOWYyNS1jZWZlNWRhOGIxNTQiLCJ0eXAiOiJJRCIsImF6cCI6InRlc3RpZCIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsInNlc3Npb25fc3RhdGUiOiIzNzVmMWRlNi1mMjc5LTQ2MmQtYWQwMy01ZTUyMGJiNWVjOGQiLCJhdF9oYXNoIjoiR1B0dExxOUNXcjVhcTNhMU1vQ3kxdyIsImFjciI6IjEiLCJzaWQiOiIzNzVmMWRlNi1mMjc5LTQ2MmQtYWQwMy01ZTUyMGJiNWVjOGQiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwicHJlZmVycmVkX3VzZXJuYW1lIjoiYWRtaW4iLCJlbWFpbCI6ImFkbWluQGV4YW1wbGUuY29tIn0.TkfKFZ5oWfVuYvi_DB6td3IZyDi3Hu1YuPRqXA-tlhKSVypLzM0UUT0aCOnQjtkbNmjdmpLCKOSMv3jjFlxlIRlw_tN66Yq71gbbuszyw6vhexOYRWXL6euSwaNXeJW9b0Vqhw0QaO7RG3o_F9UC5TCMtQX0tq09LDBgJmVlYbmWFHudfvXe6Y7AKbF93yRBnfwLZFO0TIVfSBdKo1JwrrTbIoJePqBbUmpuIJGKxkLHyrAfyyGs_1XRZf7pjMZJ48oI8KkJS-ADRhoGuHsyxXVbVQjgAYJDYcLpv98IbZj4DjgkcLj8Lawb6VxO8s11DImLjiLU6ijIZfLUR0oEyQ","not-before-policy":0,"session_state":"375f1de6-f279-462d-ad03-5e520bb5ec8d","scope":"openid
+ email profile kvk bsn"}'
+ headers:
+ Cache-Control:
+ - no-store
+ Content-Type:
+ - application/json
+ Pragma:
+ - no-cache
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '3443'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.32.2
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/certs
+ response:
+ body:
+ string: '{"keys":[{"kid":"4UNQAcvUcv-DFUOx_4O1gt13OdJSotqEKPZurs2vQW8","kty":"RSA","alg":"RS256","use":"sig","n":"2DOZ0qHie73SuFVR7civrl6r82YUiAghfzaMowjCg0o06AF--2lIS7vNV_PbsVVznPAAMqVrNG-8CcevEzvVZMQD9nH4DI7xlOxK0lrYu8rmMeSfOvXVbBVsWBZe0jnGNukZqjwmRE5__ttJdxPfIBT5-2L6mguQbDfhSUEEdIW7y7UfOXvqLqEcBtoIEB-ORKDTUIQwGZM5mSCy-cY3cHvvZfZVgaUUy5NvujPRXTMje4n_hG0KfEV-40G9qC2_Xvx4EooJzBZ6FSThiWhCpwhIvzcQqB6M9lHW7nU6wADhYPNCa2OKWvphwZ_zbrF4B9dmS6Zli5rBvbox9Hh45w","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMLTANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANgzmdKh4nu90rhVUe3Ir65eq/NmFIgIIX82jKMIwoNKNOgBfvtpSEu7zVfz27FVc5zwADKlazRvvAnHrxM71WTEA/Zx+AyO8ZTsStJa2LvK5jHknzr11WwVbFgWXtI5xjbpGao8JkROf/7bSXcT3yAU+fti+poLkGw34UlBBHSFu8u1Hzl76i6hHAbaCBAfjkSg01CEMBmTOZkgsvnGN3B772X2VYGlFMuTb7oz0V0zI3uJ/4RtCnxFfuNBvagtv178eBKKCcwWehUk4YloQqcISL83EKgejPZR1u51OsAA4WDzQmtjilr6YcGf826xeAfXZkumZYuawb26MfR4eOcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAsnQG/Yi2g1XTCJn74hWv9MjxVAaZb4gBAc2AWm5VgAjhFEM9h6x6m1mQkq7JM4rIdAj8jw55Ok9CBVBIqq4G4cME3eUvVytkj2lC9zcRoAivjjZF2HPg7zNPa2TTR50asmHPRokppV6gewO/C+o5as+4P2zqDXBh61aRd/9kdQfkg14LBbH5/dYccAuvUqlTYC4IEPCvVmBNC1xsMjf0vohvoSjm9vL2bfqG/RJH0ScdCjOd5d2zju4/e2oVdluWm+vzKBQplc7tVMuKpn6LcLmVHiGNAl+EBIZH+WVLlTx0D1+kbHZsfLYG53lQg2LsvurRbWyF/a5fVM/oLTn5ag=="],"x5t":"H5xfs1pRtvX0HyVTskx7eTXx88U","x5t#S256":"XurVtKAIEyc4w9HCGOhnjoRHnYu4d9HCn_5YHmkScJg"},{"kid":"TV3Tl5jIY1nrJLSb53UKEubLR5gYiq9slq1SsDDg1HU","kty":"RSA","alg":"RSA-OAEP","use":"enc","n":"pNvU3ecpVHbJT4bCOEpw6cnV1yi65tB3I0bRF2ilLVOY944QRAGnjBBECPIzNbgqavghYp1j75F2nq6_ny1CYfoaxTV2iDpRUw8_f7sliYbl8FrLLat0S25ItlZrg5TEJHObvOqlG2_nXoeH36MRWwNhms2uCqfhn5VgtenIzpQIBolnM7zzGp21NvdJ1C_ZAUzkXC-l3oQ-BXTtpEVM4h2KpYh4gfZJWCbYij5d1e1YApKD6V61_Cs3Oa2OY7CAUyq5kgAWJZFDB6CpzIr226u3bV7F9RbrQu3Ybc_Lv33EwykscLznKWZY2Mbs3Iz_rFNv3sVX_vHpH4DHWlKu7Q","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMlzANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKTb1N3nKVR2yU+GwjhKcOnJ1dcouubQdyNG0RdopS1TmPeOEEQBp4wQRAjyMzW4Kmr4IWKdY++Rdp6uv58tQmH6GsU1dog6UVMPP3+7JYmG5fBayy2rdEtuSLZWa4OUxCRzm7zqpRtv516Hh9+jEVsDYZrNrgqn4Z+VYLXpyM6UCAaJZzO88xqdtTb3SdQv2QFM5Fwvpd6EPgV07aRFTOIdiqWIeIH2SVgm2Io+XdXtWAKSg+letfwrNzmtjmOwgFMquZIAFiWRQwegqcyK9turt21exfUW60Lt2G3Py799xMMpLHC85ylmWNjG7NyM/6xTb97FV/7x6R+Ax1pSru0CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAQGJHeTYSMvp0yndbIn7DLohO9lom5nRrx/bLyb7TiRfogyJEF6rQZ66CAkQFk5eMF878fsHTuMVjtmXVBnhojhVmK91HwjsNQu/8xR6QMXNKJQMvHR245vwUGxlWRw/36ObM1D7QjCd/q+FonpBEY4m5Y6Uz1U0HR2Cbh0E2afVlPLeV+F0LKrlyVMdIaWBGWftCGIKDAHaG/PD66zbAKtxerv2fBIDq100WHPhd57BZxX+2aGJp1IaRDgkxV0E/CjEy3+Knd8xbAgUSW0Tl6OTC75exIvlbzeluEBe0wlapAb7WvBKYsipSW8G8Ey7tjoolDT4AU82EaKUPstiMnA=="],"x5t":"AlfHDI0FOPQpt3RBAILt0dtW1yw","x5t#S256":"a7bhm8-JsnfY7bL_m8Yl72hgmp5516VZlFcVloKzk08"}]}'
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/json;charset=UTF-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '2909'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Authorization:
+ - Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTY0NjkzMzUsImlhdCI6MTcxNjQ2OTAzNSwiYXV0aF90aW1lIjoxNzE2NDY5MDM1LCJqdGkiOiJlMDhmYzg2Zi00ODAzLTQwNjktYjY3Ni0xYjVkOTMxNWRhOTUiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiNmRiMmRiODctZGUzMS00ZTMwLTlmMjUtY2VmZTVkYThiMTU0IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoidGVzdGlkIiwibm9uY2UiOiJub3QtYS1yYW5kb20tc3RyaW5nIiwic2Vzc2lvbl9zdGF0ZSI6IjM3NWYxZGU2LWYyNzktNDYyZC1hZDAzLTVlNTIwYmI1ZWM4ZCIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOlsiaHR0cDovLzEyNy4wLjAuMTo4MDAwIl0sInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJkZWZhdWx0LXJvbGVzLXRlc3QiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgZW1haWwgcHJvZmlsZSBrdmsgYnNuIiwic2lkIjoiMzc1ZjFkZTYtZjI3OS00NjJkLWFkMDMtNWU1MjBiYjVlYzhkIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsInByZWZlcnJlZF91c2VybmFtZSI6ImFkbWluIiwiZW1haWwiOiJhZG1pbkBleGFtcGxlLmNvbSJ9.JEWLm0cX6uCrs7BQ4DVPrHvR9HwteuO__BiP2-lppc04HQisf2ehz--RAy1RYfcalXn2Ksk-wHR_LtlrOmnVYRF2Fd6kjv5T16irxYlmxhxFi8eb15-s-EtE8D3dITHl9LUOQnYFimYHqP5oA_UZf80664_lJ18Bv0gUSEcV7ugbS1ifrhJLiQfwv2wnHLOI2As80Fuf_XVl8LrzQyvATieK_dV51qoe0_tsySoq7X37LmapV0RNiQOtbspQtsTBO_gFtCXR4eOTmqYCyHE1P2hS3edmcWGCJlxsV6zWK3ZxYA2yXjZglleL1ELFhYC3uipaxRMW5Ohx24s1Tk3NVg
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.32.2
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/userinfo
+ response:
+ body:
+ string: eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJzdWIiOiI2ZGIyZGI4Ny1kZTMxLTRlMzAtOWYyNS1jZWZlNWRhOGIxNTQiLCJhdWQiOiJ0ZXN0aWQiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0IiwicHJlZmVycmVkX3VzZXJuYW1lIjoiYWRtaW4iLCJlbWFpbCI6ImFkbWluQGV4YW1wbGUuY29tIn0.JOw15ll6KCKOWcVDnth2wlYiF9XhBH7rtbWbN6cJjrk2iRH4MN0LbIRY7JLUpyXZv10aYqMa4pOKZK1TEEMdam1fDn58tUDpckq8EcGVo3XAWM737C64oL8a1ivhWIG37TPpgJyPlJL31lJ4WPGxVf-xSlCTRaZ0rqHI4FoqOrzrjnbwZg6crYagA8Zp4zzqVFEQ312VTxXVkIcsrw7pl5k29Ip0AhNXaB1VBTUTj4arUpfaM7ncewiKc7nVij87WeoziG-HaBTvCrTN7JMwBDrNvvsAOmht1P3g9lHu_XbpP9jahA73ecMXef1cV2txB-W80HNC-X2OXuz6cIrsiw
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/jwt
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '698'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.32.2
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/certs
+ response:
+ body:
+ string: '{"keys":[{"kid":"4UNQAcvUcv-DFUOx_4O1gt13OdJSotqEKPZurs2vQW8","kty":"RSA","alg":"RS256","use":"sig","n":"2DOZ0qHie73SuFVR7civrl6r82YUiAghfzaMowjCg0o06AF--2lIS7vNV_PbsVVznPAAMqVrNG-8CcevEzvVZMQD9nH4DI7xlOxK0lrYu8rmMeSfOvXVbBVsWBZe0jnGNukZqjwmRE5__ttJdxPfIBT5-2L6mguQbDfhSUEEdIW7y7UfOXvqLqEcBtoIEB-ORKDTUIQwGZM5mSCy-cY3cHvvZfZVgaUUy5NvujPRXTMje4n_hG0KfEV-40G9qC2_Xvx4EooJzBZ6FSThiWhCpwhIvzcQqB6M9lHW7nU6wADhYPNCa2OKWvphwZ_zbrF4B9dmS6Zli5rBvbox9Hh45w","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMLTANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANgzmdKh4nu90rhVUe3Ir65eq/NmFIgIIX82jKMIwoNKNOgBfvtpSEu7zVfz27FVc5zwADKlazRvvAnHrxM71WTEA/Zx+AyO8ZTsStJa2LvK5jHknzr11WwVbFgWXtI5xjbpGao8JkROf/7bSXcT3yAU+fti+poLkGw34UlBBHSFu8u1Hzl76i6hHAbaCBAfjkSg01CEMBmTOZkgsvnGN3B772X2VYGlFMuTb7oz0V0zI3uJ/4RtCnxFfuNBvagtv178eBKKCcwWehUk4YloQqcISL83EKgejPZR1u51OsAA4WDzQmtjilr6YcGf826xeAfXZkumZYuawb26MfR4eOcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAsnQG/Yi2g1XTCJn74hWv9MjxVAaZb4gBAc2AWm5VgAjhFEM9h6x6m1mQkq7JM4rIdAj8jw55Ok9CBVBIqq4G4cME3eUvVytkj2lC9zcRoAivjjZF2HPg7zNPa2TTR50asmHPRokppV6gewO/C+o5as+4P2zqDXBh61aRd/9kdQfkg14LBbH5/dYccAuvUqlTYC4IEPCvVmBNC1xsMjf0vohvoSjm9vL2bfqG/RJH0ScdCjOd5d2zju4/e2oVdluWm+vzKBQplc7tVMuKpn6LcLmVHiGNAl+EBIZH+WVLlTx0D1+kbHZsfLYG53lQg2LsvurRbWyF/a5fVM/oLTn5ag=="],"x5t":"H5xfs1pRtvX0HyVTskx7eTXx88U","x5t#S256":"XurVtKAIEyc4w9HCGOhnjoRHnYu4d9HCn_5YHmkScJg"},{"kid":"TV3Tl5jIY1nrJLSb53UKEubLR5gYiq9slq1SsDDg1HU","kty":"RSA","alg":"RSA-OAEP","use":"enc","n":"pNvU3ecpVHbJT4bCOEpw6cnV1yi65tB3I0bRF2ilLVOY944QRAGnjBBECPIzNbgqavghYp1j75F2nq6_ny1CYfoaxTV2iDpRUw8_f7sliYbl8FrLLat0S25ItlZrg5TEJHObvOqlG2_nXoeH36MRWwNhms2uCqfhn5VgtenIzpQIBolnM7zzGp21NvdJ1C_ZAUzkXC-l3oQ-BXTtpEVM4h2KpYh4gfZJWCbYij5d1e1YApKD6V61_Cs3Oa2OY7CAUyq5kgAWJZFDB6CpzIr226u3bV7F9RbrQu3Ybc_Lv33EwykscLznKWZY2Mbs3Iz_rFNv3sVX_vHpH4DHWlKu7Q","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMlzANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKTb1N3nKVR2yU+GwjhKcOnJ1dcouubQdyNG0RdopS1TmPeOEEQBp4wQRAjyMzW4Kmr4IWKdY++Rdp6uv58tQmH6GsU1dog6UVMPP3+7JYmG5fBayy2rdEtuSLZWa4OUxCRzm7zqpRtv516Hh9+jEVsDYZrNrgqn4Z+VYLXpyM6UCAaJZzO88xqdtTb3SdQv2QFM5Fwvpd6EPgV07aRFTOIdiqWIeIH2SVgm2Io+XdXtWAKSg+letfwrNzmtjmOwgFMquZIAFiWRQwegqcyK9turt21exfUW60Lt2G3Py799xMMpLHC85ylmWNjG7NyM/6xTb97FV/7x6R+Ax1pSru0CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAQGJHeTYSMvp0yndbIn7DLohO9lom5nRrx/bLyb7TiRfogyJEF6rQZ66CAkQFk5eMF878fsHTuMVjtmXVBnhojhVmK91HwjsNQu/8xR6QMXNKJQMvHR245vwUGxlWRw/36ObM1D7QjCd/q+FonpBEY4m5Y6Uz1U0HR2Cbh0E2afVlPLeV+F0LKrlyVMdIaWBGWftCGIKDAHaG/PD66zbAKtxerv2fBIDq100WHPhd57BZxX+2aGJp1IaRDgkxV0E/CjEy3+Knd8xbAgUSW0Tl6OTC75exIvlbzeluEBe0wlapAb7WvBKYsipSW8G8Ey7tjoolDT4AU82EaKUPstiMnA=="],"x5t":"AlfHDI0FOPQpt3RBAILt0dtW1yw","x5t#S256":"a7bhm8-JsnfY7bL_m8Yl72hgmp5516VZlFcVloKzk08"}]}'
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/json;charset=UTF-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '2909'
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/src/openforms/accounts/tests/test_oidc.py b/src/openforms/accounts/tests/test_oidc.py
index a47b5d4994..439509bf11 100644
--- a/src/openforms/accounts/tests/test_oidc.py
+++ b/src/openforms/accounts/tests/test_oidc.py
@@ -1,22 +1,33 @@
-from unittest.mock import patch
+from functools import partial
+from pathlib import Path
-from django.test import TestCase
from django.urls import reverse
from django.utils.translation import gettext as _
from django_webtest import WebTest
-from mozilla_django_oidc_db.models import OpenIDConnectConfig
+
+from openforms.utils.tests.keycloak import keycloak_login, mock_oidc_db_config
+from openforms.utils.tests.vcr import OFVCRMixin
from ..models import User
from .factories import StaffUserFactory
+TEST_FILES = (Path(__file__).parent / "data").resolve()
+
+
+mock_admin_oidc_config = partial(
+ mock_oidc_db_config,
+ app_label="mozilla_django_oidc_db",
+ model="OpenIDConnectConfig",
+ id=1, # required for the group queries because we're using in-memory objects
+ make_users_staff=True,
+ username_claim=["preferred_username"],
+)
+
class OIDCLoginButtonTestCase(WebTest):
- @patch(
- "mozilla_django_oidc_db.mixins.OpenIDConnectConfig.get_solo",
- return_value=OpenIDConnectConfig(enabled=False),
- )
- def test_oidc_button_disabled(self, mock_get_solo):
+ @mock_admin_oidc_config(enabled=False)
+ def test_oidc_button_disabled(self):
response = self.app.get(reverse("admin-mfa-login"))
oidc_login_link = response.html.find(
@@ -25,17 +36,8 @@ def test_oidc_button_disabled(self, mock_get_solo):
# Verify that the login button is not visible
self.assertIsNone(oidc_login_link)
- @patch(
- "mozilla_django_oidc_db.mixins.OpenIDConnectConfig.get_solo",
- return_value=OpenIDConnectConfig(
- enabled=True,
- oidc_op_token_endpoint="https://some.endpoint.nl/",
- oidc_op_user_endpoint="https://some.endpoint.nl/",
- oidc_rp_client_id="id",
- oidc_rp_client_secret="secret",
- ),
- )
- def test_oidc_button_enabled(self, mock_get_solo):
+ @mock_admin_oidc_config(enabled=True)
+ def test_oidc_button_enabled(self):
response = self.app.get(reverse("admin-mfa-login"))
oidc_login_link = response.html.find(
@@ -48,160 +50,88 @@ def test_oidc_button_enabled(self, mock_get_solo):
)
-class OIDCFLowTests(TestCase):
- @patch("mozilla_django_oidc_db.backends.OIDCAuthenticationBackend.get_userinfo")
- @patch("mozilla_django_oidc_db.backends.OIDCAuthenticationBackend.store_tokens")
- @patch("mozilla_django_oidc_db.backends.OIDCAuthenticationBackend.verify_token")
- @patch("mozilla_django_oidc_db.backends.OIDCAuthenticationBackend.get_token")
- @patch(
- "mozilla_django_oidc_db.mixins.OpenIDConnectConfig.get_solo",
- return_value=OpenIDConnectConfig(id=1, enabled=True),
- )
- def test_duplicate_email_unique_constraint_violated(
- self,
- mock_get_solo,
- mock_get_token,
- mock_verify_token,
- mock_store_tokens,
- mock_get_userinfo,
- ):
+class OIDCFLowTests(OFVCRMixin, WebTest):
+ VCR_TEST_FILES = TEST_FILES
+
+ @mock_admin_oidc_config()
+ def test_duplicate_email_unique_constraint_violated(self):
"""
Assert that duplicate email addresses result in usable user feedback.
Regression test for #1199
"""
- # set up a user with a colliding email address
- mock_get_userinfo.return_value = {
- "email": "collision@example.com",
- "sub": "some_username",
- }
- StaffUserFactory.create(
- username="nonmatchingusername", email="collision@example.com"
+ # this user collides on the email address
+ staff_user = StaffUserFactory.create(
+ username="no-match", email="admin@example.com"
)
- session = self.client.session
- session["oidc_states"] = {"mock": {"nonce": "nonce"}}
- session.save()
- callback_url = reverse("oidc_authentication_callback")
-
- # enter the login flow
- callback_response = self.client.get(
- callback_url, {"code": "mock", "state": "mock"}
+ login_page = self.app.get(reverse("admin-mfa-login"))
+ start_response = login_page.click(
+ description=_("Login with organization account")
+ )
+ assert start_response.status_code == 302
+ redirect_uri = keycloak_login(
+ start_response["Location"], username="admin", password="admin"
)
- error_url = reverse("admin-oidc-error")
-
- with self.subTest("error redirects"):
- self.assertRedirects(callback_response, error_url)
-
- with self.subTest("exception info on error page"):
- error_page = self.client.get(error_url)
+ error_page = self.app.get(redirect_uri, auto_follow=True)
+ with self.subTest("error page"):
self.assertEqual(error_page.status_code, 200)
+ self.assertEqual(error_page.request.path, reverse("admin-oidc-error"))
self.assertEqual(
error_page.context["oidc_error"],
"""duplicate key value violates unique constraint "filled_email_unique"""
- """"\nDETAIL: Key (email)=(collision@example.com) already exists.\n""",
+ """"\nDETAIL: Key (email)=(admin@example.com) already exists.\n""",
)
self.assertContains(
error_page, "duplicate key value violates unique constraint"
)
- @patch("mozilla_django_oidc_db.backends.OIDCAuthenticationBackend.get_userinfo")
- @patch("mozilla_django_oidc_db.backends.OIDCAuthenticationBackend.store_tokens")
- @patch("mozilla_django_oidc_db.backends.OIDCAuthenticationBackend.verify_token")
- @patch("mozilla_django_oidc_db.backends.OIDCAuthenticationBackend.get_token")
- @patch(
- "mozilla_django_oidc_db.mixins.OpenIDConnectConfig.get_solo",
- return_value=OpenIDConnectConfig(id=1, enabled=True),
- )
- def test_happy_flow(
- self,
- mock_get_solo,
- mock_get_token,
- mock_verify_token,
- mock_store_tokens,
- mock_get_userinfo,
- ):
- """
- Assert that duplicate email addresses result in usable user feedback.
-
- Regression test for #1199
- """
- # set up a user with a colliding email address
- mock_get_userinfo.return_value = {
- "email": "nocollision@example.com",
- "sub": "some_username",
- }
- StaffUserFactory.create(
- username="nonmatchingusername", email="collision@example.com"
+ with self.subTest("user state unmodified"):
+ self.assertEqual(User.objects.count(), 1)
+ staff_user.refresh_from_db()
+ self.assertEqual(staff_user.username, "no-match")
+ self.assertEqual(staff_user.email, "admin@example.com")
+ self.assertTrue(staff_user.is_staff)
+
+ @mock_admin_oidc_config()
+ def test_happy_flow(self):
+ login_page = self.app.get(reverse("admin-mfa-login"))
+ start_response = login_page.click(
+ description=_("Login with organization account")
)
- session = self.client.session
- session["oidc_states"] = {"mock": {"nonce": "nonce"}}
- session.save()
- callback_url = reverse("oidc_authentication_callback")
-
- # enter the login flow
- callback_response = self.client.get(
- callback_url, {"code": "mock", "state": "mock"}
+ assert start_response.status_code == 302
+ redirect_uri = keycloak_login(
+ start_response["Location"], username="admin", password="admin"
)
- self.assertRedirects(
- callback_response, reverse("admin:index"), fetch_redirect_response=False
+ admin_index = self.app.get(redirect_uri, auto_follow=True)
+
+ self.assertEqual(admin_index.status_code, 200)
+ self.assertEqual(admin_index.request.path, reverse("admin:index"))
+
+ self.assertEqual(User.objects.count(), 1)
+ user = User.objects.get()
+ self.assertEqual(user.username, "admin")
+
+ @mock_admin_oidc_config(make_users_staff=False)
+ def test_happy_flow_existing_user(self):
+ staff_user = StaffUserFactory.create(username="admin", email="update-me")
+ login_page = self.app.get(reverse("admin-mfa-login"))
+ start_response = login_page.click(
+ description=_("Login with organization account")
+ )
+ assert start_response.status_code == 302
+ redirect_uri = keycloak_login(
+ start_response["Location"], username="admin", password="admin"
)
- self.assertTrue(User.objects.filter(email="nocollision@example.com").exists())
-
- def test_error_page_direct_access_forbidden(self):
- error_url = reverse("admin-oidc-error")
-
- response = self.client.get(error_url)
-
- self.assertEqual(response.status_code, 403)
-
- @patch("mozilla_django_oidc_db.backends.OIDCAuthenticationBackend.get_userinfo")
- @patch("mozilla_django_oidc_db.backends.OIDCAuthenticationBackend.store_tokens")
- @patch("mozilla_django_oidc_db.backends.OIDCAuthenticationBackend.verify_token")
- @patch("mozilla_django_oidc_db.backends.OIDCAuthenticationBackend.get_token")
- @patch(
- "mozilla_django_oidc_db.mixins.OpenIDConnectConfig.get_solo",
- return_value=OpenIDConnectConfig(id=1, enabled=True),
- )
- def test_error_first_cleared_after_succesful_login(
- self,
- mock_get_solo,
- mock_get_token,
- mock_verify_token,
- mock_store_tokens,
- mock_get_userinfo,
- ):
- mock_get_userinfo.return_value = {
- "email": "nocollision@example.com",
- "sub": "some_username",
- }
- session = self.client.session
- session["oidc-error"] = "some error"
- session.save()
- error_url = reverse("admin-oidc-error")
-
- with self.subTest("with error"):
- response = self.client.get(error_url)
-
- self.assertEqual(response.status_code, 200)
-
- with self.subTest("after succesful login"):
- session["oidc_states"] = {"mock": {"nonce": "nonce"}}
- session.save()
- callback_url = reverse("oidc_authentication_callback")
-
- # enter the login flow
- callback_response = self.client.get(
- callback_url, {"code": "mock", "state": "mock"}
- )
- self.assertRedirects(
- callback_response, reverse("admin:index"), fetch_redirect_response=False
- )
+ admin_index = self.app.get(redirect_uri, auto_follow=True)
- with self.subTest("check error page again"):
- response = self.client.get(error_url)
+ self.assertEqual(admin_index.status_code, 200)
+ self.assertEqual(admin_index.request.path, reverse("admin:index"))
- self.assertEqual(response.status_code, 403)
+ self.assertEqual(User.objects.count(), 1)
+ staff_user.refresh_from_db()
+ self.assertEqual(staff_user.username, "admin")
+ self.assertEqual(staff_user.email, "admin@example.com")
diff --git a/src/openforms/admin/tests/test_admin_login.py b/src/openforms/admin/tests/test_admin_login.py
index d5d25a9e18..a7fb644fed 100644
--- a/src/openforms/admin/tests/test_admin_login.py
+++ b/src/openforms/admin/tests/test_admin_login.py
@@ -83,7 +83,7 @@ def setUp(self):
super().setUp()
patcher = patch(
- "mozilla_django_oidc_db.mixins.OpenIDConnectConfig.get_solo",
+ "mozilla_django_oidc_db.models.OpenIDConnectConfig.get_solo",
return_value=OpenIDConnectConfig(
enabled=True,
oidc_op_authorization_endpoint="https://oidc.example.com/",
diff --git a/src/openforms/authentication/api/tests/test_endpoints.py b/src/openforms/authentication/api/tests/test_endpoints.py
index 71db37c362..926a74ceb3 100644
--- a/src/openforms/authentication/api/tests/test_endpoints.py
+++ b/src/openforms/authentication/api/tests/test_endpoints.py
@@ -1,12 +1,14 @@
from unittest.mock import patch
from django.db.models import TextChoices
+from django.test import override_settings
from rest_framework import status
from rest_framework.reverse import reverse, reverse_lazy
from rest_framework.test import APITestCase
from openforms.accounts.tests.factories import UserFactory
+from openforms.config.models import GlobalConfiguration
from openforms.utils.tests.feature_flags import enable_feature_flag
from ...base import BasePlugin
@@ -69,6 +71,7 @@ def test_authenticated_and_staff(self):
self.assertEqual(response.status_code, status.HTTP_200_OK)
+@override_settings(SOLO_CACHE=None)
class ResponseTests(APITestCase):
@classmethod
def setUpTestData(cls):
@@ -130,3 +133,16 @@ def test_demo_plugin(self):
]
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(response.json(), expected)
+
+ def test_disabled_plugins_are_not_returned(self):
+ config = GlobalConfiguration.get_solo()
+ config.plugin_configuration = {
+ "authentication": {"plugin1": {"enabled": False}},
+ }
+ config.save()
+ endpoint = reverse("api:authentication-plugin-list")
+
+ response = self.client.get(endpoint)
+
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
+ self.assertEqual(response.json(), [])
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/admin.py b/src/openforms/authentication/contrib/digid_eherkenning_oidc/admin.py
new file mode 100644
index 0000000000..b4341e2b1c
--- /dev/null
+++ b/src/openforms/authentication/contrib/digid_eherkenning_oidc/admin.py
@@ -0,0 +1,89 @@
+from django import forms
+from django.contrib import admin
+from django.utils.translation import gettext_lazy as _
+
+from digid_eherkenning.oidc.admin import (
+ DigiDConfigAdmin as _DigiDConfigAdmin,
+ DigiDMachtigenConfigAdmin as _DigiDMachtigenConfigAdmin,
+ EHerkenningBewindvoeringConfigAdmin as _EHerkenningBewindvoeringConfigAdmin,
+ EHerkenningConfigAdmin as _EHerkenningConfigAdmin,
+ admin_modelform_factory,
+)
+from digid_eherkenning.oidc.models import (
+ DigiDConfig,
+ DigiDMachtigenConfig,
+ EHerkenningBewindvoeringConfig,
+ EHerkenningConfig,
+)
+from mozilla_django_oidc_db.forms import OpenIDConnectConfigForm
+
+from openforms.forms.models import Form
+
+from .models import (
+ OFDigiDConfig,
+ OFDigiDMachtigenConfig,
+ OFEHerkenningBewindvoeringConfig,
+ OFEHerkenningConfig,
+)
+from .plugin import get_config_to_plugin
+
+# unregister the default app admins so we can add in our own behaviour
+admin.site.unregister(DigiDMachtigenConfig)
+admin.site.unregister(EHerkenningBewindvoeringConfig)
+admin.site.unregister(EHerkenningConfig)
+admin.site.unregister(DigiDConfig)
+
+
+class OIDCConfigForm(OpenIDConnectConfigForm):
+ """
+ Custom form class to block backend disabling if any form uses it.
+ """
+
+ def clean_enabled(self):
+ """
+ Scan the (live) forms to see if any might be using this backend.
+
+ Disabling a backend while it is being used as a plugin on a live form would
+ break this form, so we warn the users for this.
+ """
+ enabled = self.cleaned_data["enabled"]
+ # Nothing to do if it is being or stays enabled
+ if enabled:
+ return enabled
+
+ # deteermine which plugin ID we need to query for
+ plugin = get_config_to_plugin()[self._meta.model]
+ forms_with_backend = Form.objects.live().filter(
+ authentication_backends__contains=[plugin.identifier]
+ )
+ if forms_with_backend.exists():
+ raise forms.ValidationError(
+ _(
+ "{plugin_identifier} is selected as authentication backend "
+ "for one or more forms, please remove this backend from these "
+ "forms before disabling this authentication backend."
+ ).format(plugin_identifier=plugin.verbose_name)
+ )
+ return enabled
+
+
+@admin.register(OFDigiDConfig)
+class DigiDConfigAdmin(_DigiDConfigAdmin):
+ form = admin_modelform_factory(OFDigiDConfig, form=OIDCConfigForm)
+
+
+@admin.register(OFDigiDMachtigenConfig)
+class DigiDMachtigenConfigAdmin(_DigiDMachtigenConfigAdmin):
+ form = admin_modelform_factory(OFDigiDMachtigenConfig, form=OIDCConfigForm)
+
+
+@admin.register(OFEHerkenningConfig)
+class EHerkenningConfigAdmin(_EHerkenningConfigAdmin):
+ form = admin_modelform_factory(OFEHerkenningConfig, form=OIDCConfigForm)
+
+
+@admin.register(OFEHerkenningBewindvoeringConfig)
+class EHerkenningBewindvoeringConfigAdmin(_EHerkenningBewindvoeringConfigAdmin):
+ form = admin_modelform_factory(
+ OFEHerkenningBewindvoeringConfig, form=OIDCConfigForm
+ )
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/backends.py b/src/openforms/authentication/contrib/digid_eherkenning_oidc/backends.py
index a87789a5bc..60190882a8 100644
--- a/src/openforms/authentication/contrib/digid_eherkenning_oidc/backends.py
+++ b/src/openforms/authentication/contrib/digid_eherkenning_oidc/backends.py
@@ -1,65 +1,133 @@
import logging
-from digid_eherkenning_oidc_generics.backends import OIDCAuthenticationBackend
-from digid_eherkenning_oidc_generics.mixins import (
- MachtigenBackendMixin,
- SoloConfigDigiDMachtigenMixin,
- SoloConfigDigiDMixin,
- SoloConfigEHerkenningBewindvoeringMixin,
- SoloConfigEHerkenningMixin,
-)
+from django.contrib.auth.models import AnonymousUser
+from django.core.exceptions import PermissionDenied
+from django.http import HttpRequest
+
+from digid_eherkenning.oidc.models import OpenIDConnectBaseConfig
+from glom import Path, PathAccessError, glom
+from mozilla_django_oidc_db.backends import OIDCAuthenticationBackend
+from mozilla_django_oidc_db.config import dynamic_setting
+from mozilla_django_oidc_db.typing import ClaimPath
+from mozilla_django_oidc_db.utils import obfuscate_claims
+from typing_extensions import override
-from .constants import (
- DIGID_MACHTIGEN_OIDC_AUTH_SESSION_KEY,
- DIGID_OIDC_AUTH_SESSION_KEY,
- EHERKENNING_BEWINDVOERING_OIDC_AUTH_SESSION_KEY,
- EHERKENNING_OIDC_AUTH_SESSION_KEY,
+from openforms.typing import JSONObject
+
+from .models import (
+ OFDigiDConfig,
+ OFDigiDMachtigenConfig,
+ OFEHerkenningBewindvoeringConfig,
+ OFEHerkenningConfig,
)
+from .plugin import get_config_to_plugin
logger = logging.getLogger(__name__)
-class OIDCAuthenticationDigiDBackend(SoloConfigDigiDMixin, OIDCAuthenticationBackend):
+class DigiDEHerkenningOIDCBackend(OIDCAuthenticationBackend):
"""
- Allows logging in via OIDC with DigiD
+ A backend specialised to the digid-eherkenning-generics subclassed model.
"""
- session_key = DIGID_OIDC_AUTH_SESSION_KEY
-
-
-class OIDCAuthenticationEHerkenningBackend(
- SoloConfigEHerkenningMixin, OIDCAuthenticationBackend
-):
+ MANDATE_CLAIMS = dynamic_setting[dict[str, ClaimPath]]()
"""
- Allows logging in via OIDC with DigiD
+ Mapping of destination key and the claim paths to extract.
"""
- session_key = EHERKENNING_OIDC_AUTH_SESSION_KEY
+ @override
+ def _check_candidate_backend(self) -> bool:
+ # if we're dealing with a mozilla-django-oidc-db config that is *not* a
+ # digid-eherkenning-generics subclass, then don't bother.
+ if not issubclass(self.config_class, OpenIDConnectBaseConfig):
+ return False
+ return super()._check_candidate_backend()
+
+ def get_or_create_user(
+ self, access_token: str, id_token: str, payload: JSONObject
+ ) -> AnonymousUser:
+ """
+ Return a "fake" Django user.
+
+ If the claims are valid, we only process them and do not create or update an
+ actual Django user.
+ """
+ assert isinstance(self.request, HttpRequest)
+
+ user_info = self.get_userinfo(access_token, id_token, payload)
+ claims_verified = self.verify_claims(user_info)
+ if not claims_verified:
+ msg = "Claims verification failed"
+ # Raise PermissionDenied rather than SuspiciousOperation - this makes it
+ # Django stops trying other (OIDC) authentication backends, which fail
+ # because the code was already exchanged for an access token.
+ # Note that this backend only runs for the DigiD/eHerkenning configs at all,
+ # and those aren't particularly compatible with the admin-OIDC flow anyway.
+ # See :meth:`_check_candidate_backend` that prevents this backend from being
+ # used for admin OIDC.
+ raise PermissionDenied(msg)
+
+ self._extract_and_store_claims(payload)
+
+ user = AnonymousUser()
+ user.is_active = True # type: ignore
+ return user
+
+ @override
+ def verify_claims(self, claims) -> bool:
+ """Verify the provided claims to decide if authentication should be allowed."""
+ if self.config_class in (OFDigiDConfig, OFEHerkenningConfig):
+ return super().verify_claims(claims)
+
+ assert self.config_class in (
+ OFDigiDMachtigenConfig,
+ OFEHerkenningBewindvoeringConfig,
+ )
+
+ assert claims, "Empty claims should have been blocked earlier"
+ obfuscated_claims = obfuscate_claims(claims, self.OIDCDB_SENSITIVE_CLAIMS)
+ logger.debug("OIDC claims received: %s", obfuscated_claims)
+
+ for claim_path in self.MANDATE_CLAIMS.values():
+ try:
+ glom(claims, Path(*claim_path))
+ except PathAccessError:
+ logger.error(
+ "`%s` not found in the OIDC claims, cannot "
+ "proceed with authentication",
+ " > ".join(claim_path),
+ )
+ return False
+ return True
-class OIDCAuthenticationDigiDMachtigenBackend(
- MachtigenBackendMixin, SoloConfigDigiDMachtigenMixin, OIDCAuthenticationBackend
-):
- session_key = DIGID_MACHTIGEN_OIDC_AUTH_SESSION_KEY
+ def _extract_and_store_claims(self, claims: JSONObject) -> None:
+ """
+ Extract the required claims and store them in the session.
- @property
- def claim_names(self):
- return [
- self.config.vertegenwoordigde_claim_name,
- self.config.gemachtigde_claim_name,
- ]
+ TODO: extend this to grab more information from the claims.
+ """
+ config_to_plugin = get_config_to_plugin()
+ assert self.config_class and self.config_class in config_to_plugin
+ session_key = config_to_plugin[self.config_class].session_key
+ session_value: JSONObject | str
-class OIDCAuthenticationEHerkenningBewindvoeringBackend(
- MachtigenBackendMixin,
- SoloConfigEHerkenningBewindvoeringMixin,
- OIDCAuthenticationBackend,
-):
- session_key = EHERKENNING_BEWINDVOERING_OIDC_AUTH_SESSION_KEY
+ # DigiD/eHerkenning without machtigen -> stores the BSN/KVK directly
+ if self.config_class in (OFDigiDConfig, OFEHerkenningConfig):
+ claim_bits = self.OIDCDB_USERNAME_CLAIM
+ session_value = glom(claims, Path(*claim_bits), default="")
+ # DigiD/eHerkenning with machtigen -> store a dict of relevant claims.
+ elif self.config_class in (
+ OFDigiDMachtigenConfig,
+ OFEHerkenningBewindvoeringConfig,
+ ):
+ session_value = {
+ key: glom(claims, Path(*claim_bits))
+ for key, claim_bits in self.MANDATE_CLAIMS.items()
+ }
+ else: # pragma: no cover
+ raise RuntimeError("Unsupported config class")
- @property
- def claim_names(self):
- return [
- self.config.vertegenwoordigde_company_claim_name,
- self.config.gemachtigde_person_claim_name,
- ]
+ assert self.request
+ self.request.session[session_key] = session_value
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/constants.py b/src/openforms/authentication/contrib/digid_eherkenning_oidc/constants.py
deleted file mode 100644
index ce6ead1307..0000000000
--- a/src/openforms/authentication/contrib/digid_eherkenning_oidc/constants.py
+++ /dev/null
@@ -1,6 +0,0 @@
-DIGID_OIDC_AUTH_SESSION_KEY = "digid_oidc:bsn"
-EHERKENNING_OIDC_AUTH_SESSION_KEY = "eherkenning_oidc:kvk"
-DIGID_MACHTIGEN_OIDC_AUTH_SESSION_KEY = "digid_machtigen_oidc:machtigen"
-EHERKENNING_BEWINDVOERING_OIDC_AUTH_SESSION_KEY = (
- "eherkenning_bewindvoering_oidc:machtigen"
-)
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/digid_machtigen_urls.py b/src/openforms/authentication/contrib/digid_eherkenning_oidc/digid_machtigen_urls.py
deleted file mode 100644
index cec3ce2f14..0000000000
--- a/src/openforms/authentication/contrib/digid_eherkenning_oidc/digid_machtigen_urls.py
+++ /dev/null
@@ -1,16 +0,0 @@
-from django.urls import path
-
-from mozilla_django_oidc.urls import urlpatterns
-
-from .views import DigiDMachtigenOIDCAuthenticationCallbackView
-
-app_name = "digid_machtigen_oidc"
-
-
-urlpatterns = [
- path(
- "callback/",
- DigiDMachtigenOIDCAuthenticationCallbackView.as_view(),
- name="callback",
- ),
-] + urlpatterns
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/digid_urls.py b/src/openforms/authentication/contrib/digid_eherkenning_oidc/digid_urls.py
deleted file mode 100644
index a7e5950f09..0000000000
--- a/src/openforms/authentication/contrib/digid_eherkenning_oidc/digid_urls.py
+++ /dev/null
@@ -1,16 +0,0 @@
-from django.urls import path
-
-from mozilla_django_oidc.urls import urlpatterns
-
-from .views import DigiDOIDCAuthenticationCallbackView
-
-app_name = "digid_oidc"
-
-
-urlpatterns = [
- path(
- "callback/",
- DigiDOIDCAuthenticationCallbackView.as_view(),
- name="callback",
- ),
-] + urlpatterns
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/eherkenning_bewindvoering_urls.py b/src/openforms/authentication/contrib/digid_eherkenning_oidc/eherkenning_bewindvoering_urls.py
deleted file mode 100644
index 9d8b596da8..0000000000
--- a/src/openforms/authentication/contrib/digid_eherkenning_oidc/eherkenning_bewindvoering_urls.py
+++ /dev/null
@@ -1,16 +0,0 @@
-from django.urls import path
-
-from mozilla_django_oidc.urls import urlpatterns
-
-from .views import EHerkenningBewindvoeringOIDCAuthenticationCallbackView
-
-app_name = "eherkenning_bewindvoering_oidc"
-
-
-urlpatterns = [
- path(
- "callback/",
- EHerkenningBewindvoeringOIDCAuthenticationCallbackView.as_view(),
- name="callback",
- ),
-] + urlpatterns
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/eherkenning_urls.py b/src/openforms/authentication/contrib/digid_eherkenning_oidc/eherkenning_urls.py
deleted file mode 100644
index 4f2ce729ca..0000000000
--- a/src/openforms/authentication/contrib/digid_eherkenning_oidc/eherkenning_urls.py
+++ /dev/null
@@ -1,16 +0,0 @@
-from django.urls import path
-
-from mozilla_django_oidc.urls import urlpatterns
-
-from .views import eHerkenningOIDCAuthenticationCallbackView
-
-app_name = "eherkenning_oidc"
-
-
-urlpatterns = [
- path(
- "callback/",
- eHerkenningOIDCAuthenticationCallbackView.as_view(),
- name="callback",
- ),
-] + urlpatterns
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/legacy_urls.py b/src/openforms/authentication/contrib/digid_eherkenning_oidc/legacy_urls.py
new file mode 100644
index 0000000000..8039dad50c
--- /dev/null
+++ b/src/openforms/authentication/contrib/digid_eherkenning_oidc/legacy_urls.py
@@ -0,0 +1,60 @@
+"""
+Callback URLs for the different plugins.
+
+These plugin-specific callback URLs are deprecated and will be removed in Open Forms
+3.0. Instead, use the generic callback URL in urls.py - it can handle the different
+configs.
+"""
+
+from django.urls import include, path
+
+from mozilla_django_oidc_db.views import OIDCCallbackView
+
+oidc_callback = OIDCCallbackView.as_view()
+
+urlpatterns = [
+ path(
+ "digid-oidc/",
+ include(
+ (
+ [
+ path("callback/", oidc_callback, name="callback"),
+ ],
+ "digid_oidc",
+ )
+ ),
+ ),
+ path(
+ "eherkenning-oidc/",
+ include(
+ (
+ [
+ path("callback/", oidc_callback, name="callback"),
+ ],
+ "eherkenning_oidc",
+ )
+ ),
+ ),
+ path(
+ "digid-machtigen-oidc/",
+ include(
+ (
+ [
+ path("callback/", oidc_callback, name="callback"),
+ ],
+ "digid_machtigen_oidc",
+ )
+ ),
+ ),
+ path(
+ "eherkenning-bewindvoering-oidc/",
+ include(
+ (
+ [
+ path("callback/", oidc_callback, name="callback"),
+ ],
+ "eherkenning_bewindvoering_oidc",
+ )
+ ),
+ ),
+]
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/migrations/0001_initial.py b/src/openforms/authentication/contrib/digid_eherkenning_oidc/migrations/0001_initial.py
new file mode 100644
index 0000000000..33c1e2cf51
--- /dev/null
+++ b/src/openforms/authentication/contrib/digid_eherkenning_oidc/migrations/0001_initial.py
@@ -0,0 +1,66 @@
+# Generated by Django 4.2.11 on 2024-06-17 07:41
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ (
+ "digid_eherkenning_oidc_generics",
+ "0006_alter_digidconfig_oidc_rp_scopes_list_and_more",
+ ),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name="OFDigiDConfig",
+ fields=[],
+ options={
+ "verbose_name": "DigiD (OIDC)",
+ "verbose_name_plural": "DigiD (OIDC)",
+ "proxy": True,
+ "indexes": [],
+ "constraints": [],
+ },
+ bases=("digid_eherkenning_oidc_generics.digidconfig",),
+ ),
+ migrations.CreateModel(
+ name="OFDigiDMachtigenConfig",
+ fields=[],
+ options={
+ "verbose_name": "DigiD Machtigen (OIDC)",
+ "verbose_name_plural": "DigiD Machtigen (OIDC)",
+ "proxy": True,
+ "indexes": [],
+ "constraints": [],
+ },
+ bases=("digid_eherkenning_oidc_generics.digidmachtigenconfig",),
+ ),
+ migrations.CreateModel(
+ name="OFEHerkenningBewindvoeringConfig",
+ fields=[],
+ options={
+ "verbose_name": "eHerkenning bewindvoering (OIDC)",
+ "verbose_name_plural": "eHerkenning bewindvoering (OIDC)",
+ "proxy": True,
+ "indexes": [],
+ "constraints": [],
+ },
+ bases=("digid_eherkenning_oidc_generics.eherkenningbewindvoeringconfig",),
+ ),
+ migrations.CreateModel(
+ name="OFEHerkenningConfig",
+ fields=[],
+ options={
+ "verbose_name": "eHerkenning (OIDC)",
+ "verbose_name_plural": "eHerkenning (OIDC)",
+ "proxy": True,
+ "indexes": [],
+ "constraints": [],
+ },
+ bases=("digid_eherkenning_oidc_generics.eherkenningconfig",),
+ ),
+ ]
diff --git a/src/digid_eherkenning_oidc_generics/migrations/__init__.py b/src/openforms/authentication/contrib/digid_eherkenning_oidc/migrations/__init__.py
similarity index 100%
rename from src/digid_eherkenning_oidc_generics/migrations/__init__.py
rename to src/openforms/authentication/contrib/digid_eherkenning_oidc/migrations/__init__.py
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/models.py b/src/openforms/authentication/contrib/digid_eherkenning_oidc/models.py
new file mode 100644
index 0000000000..2c9fff1554
--- /dev/null
+++ b/src/openforms/authentication/contrib/digid_eherkenning_oidc/models.py
@@ -0,0 +1,115 @@
+import warnings
+
+from django.conf import settings
+from django.utils.functional import classproperty
+from django.utils.translation import gettext_lazy as _
+
+from digid_eherkenning.oidc.models import (
+ DigiDConfig,
+ DigiDMachtigenConfig,
+ EHerkenningBewindvoeringConfig,
+ EHerkenningConfig,
+)
+from mozilla_django_oidc_db.typing import ClaimPath
+
+
+def get_callback_view(self):
+ from .views import callback_view
+
+ return callback_view
+
+
+class OFDigiDConfig(DigiDConfig):
+ class Meta:
+ proxy = True
+ verbose_name = _("DigiD (OIDC)")
+ verbose_name_plural = _("DigiD (OIDC)")
+
+ get_callback_view = get_callback_view
+
+ @classproperty
+ def oidc_authentication_callback_url(cls) -> str: # type: ignore
+ if settings.USE_LEGACY_DIGID_EH_OIDC_ENDPOINTS:
+ warnings.warn(
+ "Legacy DigiD-eHerkenning callback endpoints will be removed in 3.0",
+ DeprecationWarning,
+ )
+ return "digid_oidc:callback"
+ return "oidc_authentication_callback"
+
+
+class OFDigiDMachtigenConfig(DigiDMachtigenConfig):
+ class Meta:
+ proxy = True
+ verbose_name = _("DigiD Machtigen (OIDC)")
+ verbose_name_plural = _("DigiD Machtigen (OIDC)")
+
+ get_callback_view = get_callback_view
+
+ @classproperty
+ def oidc_authentication_callback_url(cls) -> str: # type: ignore
+ if settings.USE_LEGACY_DIGID_EH_OIDC_ENDPOINTS:
+ warnings.warn(
+ "Legacy DigiD-eHerkenning callback endpoints will be removed in 3.0",
+ DeprecationWarning,
+ )
+ return "digid_machtigen_oidc:callback"
+ return "oidc_authentication_callback"
+
+ @property
+ def mandate_claims(self) -> dict[str, ClaimPath]:
+ return {
+ "representee": self.representee_bsn_claim,
+ "authorizee": self.authorizee_bsn_claim,
+ "service_id": self.mandate_service_id_claim,
+ }
+
+
+class OFEHerkenningConfig(EHerkenningConfig):
+ class Meta:
+ proxy = True
+ verbose_name = _("eHerkenning (OIDC)")
+ verbose_name_plural = _("eHerkenning (OIDC)")
+
+ get_callback_view = get_callback_view
+
+ @classproperty
+ def oidc_authentication_callback_url(cls) -> str: # type: ignore
+ if settings.USE_LEGACY_DIGID_EH_OIDC_ENDPOINTS:
+ warnings.warn(
+ "Legacy DigiD-eHerkenning callback endpoints will be removed in 3.0",
+ DeprecationWarning,
+ )
+ return "eherkenning_oidc:callback"
+ return "oidc_authentication_callback"
+
+
+class OFEHerkenningBewindvoeringConfig(EHerkenningBewindvoeringConfig):
+ class Meta:
+ proxy = True
+ verbose_name = _("eHerkenning bewindvoering (OIDC)")
+ verbose_name_plural = _("eHerkenning bewindvoering (OIDC)")
+
+ get_callback_view = get_callback_view
+
+ @classproperty
+ def oidc_authentication_callback_url(cls) -> str: # type: ignore
+ if settings.USE_LEGACY_DIGID_EH_OIDC_ENDPOINTS:
+ warnings.warn(
+ "Legacy DigiD-eHerkenning callback endpoints will be removed in 3.0",
+ DeprecationWarning,
+ )
+ return "eherkenning_bewindvoering_oidc:callback"
+ return "oidc_authentication_callback"
+
+ @property
+ def mandate_claims(self) -> dict[str, ClaimPath]:
+ return {
+ "representee": self.representee_claim,
+ # "authorizee_legal_subject_type": self.identifier_type_claim,
+ "authorizee_legal_subject": self.legal_subject_claim,
+ "authorizee_acting_subject": self.acting_subject_claim,
+ # "authorizee_branch_number": self.branch_number_claim,
+ # "service_id": self.mandate_service_id_claim,
+ # "service_uuid": self.mandate_service_uuid_claim,
+ }
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/plugin.py b/src/openforms/authentication/contrib/digid_eherkenning_oidc/plugin.py
index fa7ec0eb04..cf306f8126 100644
--- a/src/openforms/authentication/contrib/digid_eherkenning_oidc/plugin.py
+++ b/src/openforms/authentication/contrib/digid_eherkenning_oidc/plugin.py
@@ -1,4 +1,6 @@
-from typing import Any, ClassVar, Protocol
+from __future__ import annotations
+
+from typing import Any, ClassVar, Generic, Protocol, TypeVar
from django.http import (
HttpRequest,
@@ -8,38 +10,47 @@
)
from django.utils.translation import gettext_lazy as _
-import requests
-from furl import furl
-from rest_framework.reverse import reverse
+from digid_eherkenning.oidc.models import OpenIDConnectBaseConfig
+from mozilla_django_oidc_db.utils import do_op_logout
+from mozilla_django_oidc_db.views import _RETURN_URL_SESSION_KEY
-from digid_eherkenning_oidc_generics.models import (
- OpenIDConnectDigiDMachtigenConfig,
- OpenIDConnectEHerkenningBewindvoeringConfig,
- OpenIDConnectEHerkenningConfig,
- OpenIDConnectPublicConfig,
-)
-from digid_eherkenning_oidc_generics.views import (
- digid_init,
- digid_machtigen_init,
- eherkenning_bewindvoering_init,
- eherkenning_init,
-)
from openforms.contrib.digid_eherkenning.utils import (
get_digid_logo,
get_eherkenning_logo,
)
from openforms.forms.models import Form
+from openforms.typing import JSONObject, StrOrPromise
+from openforms.utils.urls import reverse_plus
from ...base import BasePlugin, LoginLogo
from ...constants import CO_SIGN_PARAMETER, FORM_AUTH_SESSION_KEY, AuthAttribute
from ...exceptions import InvalidCoSignData
from ...registry import register
-from .constants import (
- DIGID_MACHTIGEN_OIDC_AUTH_SESSION_KEY,
- DIGID_OIDC_AUTH_SESSION_KEY,
- EHERKENNING_BEWINDVOERING_OIDC_AUTH_SESSION_KEY,
- EHERKENNING_OIDC_AUTH_SESSION_KEY,
+from .models import (
+ OFDigiDConfig,
+ OFDigiDMachtigenConfig,
+ OFEHerkenningBewindvoeringConfig,
+ OFEHerkenningConfig,
)
+from .views import (
+ digid_init,
+ digid_machtigen_init,
+ eherkenning_bewindvoering_init,
+ eherkenning_init,
+)
+
+OIDC_ID_TOKEN_SESSION_KEY = "oidc_id_token"
+
+
+def get_config_to_plugin() -> dict[type[OpenIDConnectBaseConfig], OIDCAuthentication]:
+ """
+ Get the mapping of config class to plugin identifier from the registry.
+ """
+ return {
+ plugin.config_class: plugin
+ for plugin in register
+ if isinstance(plugin, OIDCAuthentication)
+ }
class AuthInit(Protocol):
@@ -48,21 +59,27 @@ def __call__(
) -> HttpResponseBase: ...
-class OIDCAuthentication(BasePlugin):
- verbose_name = ""
- provides_auth = ""
- session_key = ""
- config_class = None
+T = TypeVar("T", bound=str | JSONObject)
+
+
+class OIDCAuthentication(Generic[T], BasePlugin):
+ verbose_name: StrOrPromise = ""
+ provides_auth: AuthAttribute
+ session_key: str = ""
+ config_class: ClassVar[type[OpenIDConnectBaseConfig]]
init_view: ClassVar[AuthInit]
def start_login(self, request: HttpRequest, form: Form, form_url: str):
- auth_return_url = reverse(
+ return_url_query = {"next": form_url}
+ if co_sign_param := request.GET.get(CO_SIGN_PARAMETER):
+ return_url_query[CO_SIGN_PARAMETER] = co_sign_param
+
+ return_url = reverse_plus(
"authentication:return",
kwargs={"slug": form.slug, "plugin_id": self.identifier},
+ request=request,
+ query=return_url_query,
)
- return_url = furl(auth_return_url).set({"next": form_url})
- if co_sign_param := request.GET.get(CO_SIGN_PARAMETER):
- return_url.args[CO_SIGN_PARAMETER] = co_sign_param
# "evaluate" the view, this achieves two things:
#
@@ -74,11 +91,11 @@ def start_login(self, request: HttpRequest, form: Form, form_url: str):
#
# This may raise `OIDCProviderOutage`, which bubbles into the generic auth
# start_view and gets handled there.
- response = self.init_view(request, return_url=str(return_url))
+ response = self.init_view(request, return_url=return_url)
assert isinstance(response, HttpResponseRedirect)
return response
- def handle_co_sign(self, request: HttpRequest, form: Form) -> dict[str, Any] | None:
+ def handle_co_sign(self, request: HttpRequest, form: Form) -> dict[str, Any]:
if not (claim := request.session.get(self.session_key)):
raise InvalidCoSignData(f"Missing '{self.provides_auth}' parameter/value")
return {
@@ -86,16 +103,11 @@ def handle_co_sign(self, request: HttpRequest, form: Form) -> dict[str, Any] | N
"fields": {},
}
- def add_claims_to_sessions_if_not_cosigning(self, claim, request):
- # set the session auth key only if we're not co-signing
- if claim and CO_SIGN_PARAMETER not in request.GET:
- request.session[FORM_AUTH_SESSION_KEY] = {
- "plugin": self.identifier,
- "attribute": self.provides_auth,
- "value": claim,
- }
+ def translate_auth_data(self, session_value: T) -> tuple[str, None | JSONObject]:
+ assert isinstance(session_value, str)
+ return session_value, None
- def handle_return(self, request, form):
+ def handle_return(self, request: HttpRequest, form: Form):
"""
Redirect to form URL.
"""
@@ -103,39 +115,42 @@ def handle_return(self, request, form):
if not form_url:
return HttpResponseBadRequest("missing 'next' parameter")
- claim = request.session.get(self.session_key)
-
- self.add_claims_to_sessions_if_not_cosigning(claim, request)
+ session_value: T | None = request.session.get(self.session_key)
+ if session_value and CO_SIGN_PARAMETER not in request.GET:
+ auth_value, machtigen_data = self.translate_auth_data(session_value)
+ _machtigen_data = {"machtigen": machtigen_data} if machtigen_data else {}
+ request.session[FORM_AUTH_SESSION_KEY] = {
+ "plugin": self.identifier,
+ "attribute": self.provides_auth,
+ "value": auth_value,
+ **_machtigen_data,
+ }
return HttpResponseRedirect(form_url)
def logout(self, request: HttpRequest):
- if "oidc_id_token" in request.session:
- logout_endpoint = self.config_class.get_solo().oidc_op_logout_endpoint
- if logout_endpoint:
- logout_url = furl(logout_endpoint).set(
- {
- "id_token_hint": request.session["oidc_id_token"],
- }
- )
- requests.get(str(logout_url))
-
- del request.session["oidc_id_token"]
-
- if "oidc_login_next" in request.session:
- del request.session["oidc_login_next"]
-
- if self.session_key in request.session:
- del request.session[self.session_key]
+ if id_token := request.session.get(OIDC_ID_TOKEN_SESSION_KEY):
+ config = self.config_class.get_solo()
+ assert isinstance(config, OpenIDConnectBaseConfig)
+ do_op_logout(config, id_token)
+
+ keys_to_delete = (
+ "oidc_login_next", # from upstream library
+ self.session_key,
+ _RETURN_URL_SESSION_KEY,
+ OIDC_ID_TOKEN_SESSION_KEY,
+ )
+ for key in keys_to_delete:
+ if key in request.session:
+ del request.session[key]
@register("digid_oidc")
-class DigiDOIDCAuthentication(OIDCAuthentication):
+class DigiDOIDCAuthentication(OIDCAuthentication[str]):
verbose_name = _("DigiD via OpenID Connect")
provides_auth = AuthAttribute.bsn
- session_key = DIGID_OIDC_AUTH_SESSION_KEY
- claim_name = ""
- config_class = OpenIDConnectPublicConfig
+ session_key = "digid_oidc:bsn"
+ config_class = OFDigiDConfig
init_view = staticmethod(digid_init)
def get_label(self) -> str:
@@ -146,12 +161,11 @@ def get_logo(self, request) -> LoginLogo | None:
@register("eherkenning_oidc")
-class eHerkenningOIDCAuthentication(OIDCAuthentication):
+class eHerkenningOIDCAuthentication(OIDCAuthentication[str]):
verbose_name = _("eHerkenning via OpenID Connect")
provides_auth = AuthAttribute.kvk
- session_key = EHERKENNING_OIDC_AUTH_SESSION_KEY
- claim_name = "kvk"
- config_class = OpenIDConnectEHerkenningConfig
+ session_key = "eherkenning_oidc:kvk"
+ config_class = OFEHerkenningConfig
init_view = staticmethod(eherkenning_init)
def get_label(self) -> str:
@@ -162,29 +176,22 @@ def get_logo(self, request) -> LoginLogo | None:
@register("digid_machtigen_oidc")
-class DigiDMachtigenOIDCAuthentication(OIDCAuthentication):
+class DigiDMachtigenOIDCAuthentication(OIDCAuthentication[JSONObject]):
verbose_name = _("DigiD Machtigen via OpenID Connect")
provides_auth = AuthAttribute.bsn
- session_key = DIGID_MACHTIGEN_OIDC_AUTH_SESSION_KEY
- config_class = OpenIDConnectDigiDMachtigenConfig
+ session_key = "digid_machtigen_oidc:machtigen"
+ config_class = OFDigiDMachtigenConfig
init_view = staticmethod(digid_machtigen_init)
is_for_gemachtigde = True
- def add_claims_to_sessions_if_not_cosigning(self, claim, request):
- # set the session auth key only if we're not co-signing
- if not claim or CO_SIGN_PARAMETER in request.GET:
- return
-
- config = self.config_class.get_solo()
- machtigen_data = request.session[self.session_key]
- request.session[FORM_AUTH_SESSION_KEY] = {
- "plugin": self.identifier,
- "attribute": self.provides_auth,
- "value": claim[config.vertegenwoordigde_claim_name],
- "machtigen": {
- "identifier_value": machtigen_data.get(config.gemachtigde_claim_name)
- },
- }
+ def translate_auth_data(self, session_value: JSONObject) -> tuple[str, JSONObject]:
+ # these keys are set by the authentication backend
+ bsn_vertegenwoordigde = session_value.get("representee")
+ assert isinstance(bsn_vertegenwoordigde, str)
+ bsn_gemachtigde = session_value.get("authorizee")
+ assert isinstance(bsn_gemachtigde, str)
+
+ return bsn_vertegenwoordigde, {"identifier_value": bsn_gemachtigde}
def get_label(self) -> str:
return "DigiD Machtigen"
@@ -194,32 +201,22 @@ def get_logo(self, request) -> LoginLogo | None:
@register("eherkenning_bewindvoering_oidc")
-class EHerkenningBewindvoeringOIDCAuthentication(OIDCAuthentication):
+class EHerkenningBewindvoeringOIDCAuthentication(OIDCAuthentication[JSONObject]):
verbose_name = _("eHerkenning bewindvoering via OpenID Connect")
provides_auth = AuthAttribute.kvk
- session_key = EHERKENNING_BEWINDVOERING_OIDC_AUTH_SESSION_KEY
- config_class = OpenIDConnectEHerkenningBewindvoeringConfig
+ session_key = "eherkenning_bewindvoering_oidc:machtigen"
+ config_class = OFEHerkenningBewindvoeringConfig
init_view = staticmethod(eherkenning_bewindvoering_init)
is_for_gemachtigde = True
- def add_claims_to_sessions_if_not_cosigning(self, claim, request):
- # set the session auth key only if we're not co-signing
- if not claim or CO_SIGN_PARAMETER in request.GET:
- return
-
- config = self.config_class.get_solo()
- machtigen_data = request.session[self.session_key]
- request.session[FORM_AUTH_SESSION_KEY] = {
- "plugin": self.identifier,
- "attribute": self.provides_auth,
- "value": claim[config.vertegenwoordigde_company_claim_name],
- "machtigen": {
- # TODO So far the only possibility is that this is a BSN.
- "identifier_value": machtigen_data.get(
- config.gemachtigde_person_claim_name
- )
- },
- }
+ def translate_auth_data(self, session_value: JSONObject) -> tuple[str, JSONObject]:
+ # these keys are set by the authentication backend
+ bsn_vertegenwoordigde = session_value.get("representee")
+ assert isinstance(bsn_vertegenwoordigde, str)
+ kvk_gemachtigde = session_value.get("authorizee_legal_subject")
+ assert isinstance(kvk_gemachtigde, str)
+
+ return bsn_vertegenwoordigde, {"identifier_value": kvk_gemachtigde}
def get_label(self) -> str:
return "eHerkenning bewindvoering"
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/README.md b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/README.md
new file mode 100644
index 0000000000..03037c38ea
--- /dev/null
+++ b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/README.md
@@ -0,0 +1,25 @@
+# README
+
+The integration tests for the OIDC flavour of DigiD/eHerkenning uses VCR.py. To (re-) record the
+cassettes, perform the following steps (from the root of the repo):
+
+1. Bring up the Keycloak instance
+
+ ```bash
+ cd docker/
+ docker compose -f docker-compose.keycloak.yml up -d
+ ```
+
+2. Delete the old cassettes
+
+ ```bash
+ rm -rf src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes
+ ```
+
+3. Run the tests
+
+ ```bash
+ python src/manage.py test openforms.authentication.contrib.digid_eherkenning_oidc
+ ```
+
+4. Inspect the diff and commit the changes.
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/base.py b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/base.py
new file mode 100644
index 0000000000..a463d47deb
--- /dev/null
+++ b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/base.py
@@ -0,0 +1,62 @@
+from functools import partial
+from pathlib import Path
+
+from django.test import override_settings
+
+from django_webtest import WebTest
+
+from openforms.utils.tests.keycloak import KEYCLOAK_BASE_URL, mock_oidc_db_config
+from openforms.utils.tests.vcr import OFVCRMixin
+
+TEST_FILES = (Path(__file__).parent / "data").resolve()
+
+
+def mock_config(model: str, **overrides):
+ overrides.setdefault("oidc_op_logout_endpoint", f"{KEYCLOAK_BASE_URL}/logout")
+ return mock_oidc_db_config(
+ app_label="digid_eherkenning_oidc", model=model, **overrides
+ )
+
+
+mock_digid_config = partial(
+ mock_config,
+ model="OFDigiDConfig",
+ oidc_rp_scopes_list=["openid", "bsn"],
+)
+
+mock_eherkenning_config = partial(
+ mock_config,
+ model="OFEHerkenningConfig",
+ oidc_rp_scopes_list=["openid", "kvk"],
+ identifier_type_claim=["name_qualifier"],
+ legal_subject_claim=["legalSubjectID"],
+ acting_subject_claim=["actingSubjectID"],
+ branch_number_claim=["urn:etoegang:1.9:ServiceRestriction:Vestigingsnr"],
+)
+
+mock_digid_machtigen_config = partial(
+ mock_config,
+ model="OFDigiDMachtigenConfig",
+ oidc_rp_scopes_list=["openid", "bsn"],
+ representee_bsn_claim=["aanvrager.bsn"],
+ authorizee_bsn_claim=["gemachtigde.bsn"],
+ mandate_service_id_claim=["service_id"],
+)
+
+mock_eherkenning_bewindvoering_config = partial(
+ mock_config,
+ model="OFEHerkenningBewindvoeringConfig",
+ oidc_rp_scopes_list=["openid", "bsn"],
+ identifier_type_claim=["name_qualifier"],
+ legal_subject_claim=["legalSubjectID"],
+ acting_subject_claim=["actingSubjectID"],
+ branch_number_claim=["urn:etoegang:1.9:ServiceRestriction:Vestigingsnr"],
+ representee_claim=["representeeBSN"],
+ mandate_service_id_claim=["service_id"],
+ mandate_service_uuid_claim=["service_uuid"],
+)
+
+
+@override_settings(CORS_ALLOW_ALL_ORIGINS=True, IS_HTTPS=True)
+class IntegrationTestsBase(OFVCRMixin, WebTest):
+ VCR_TEST_FILES = TEST_FILES
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/DigiDCallbackTests/DigiDCallbackTests.test_digid_error_reported_for_cancelled_login_anon_django_user.yaml b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/DigiDCallbackTests/DigiDCallbackTests.test_digid_error_reported_for_cancelled_login_anon_django_user.yaml
new file mode 100644
index 0000000000..bfe1f37dc2
--- /dev/null
+++ b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/DigiDCallbackTests/DigiDCallbackTests.test_digid_error_reported_for_cancelled_login_anon_django_user.yaml
@@ -0,0 +1,91 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n\n\n\n\n\n\n"
+ headers:
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '1573'
+ status:
+ code: 400
+ message: Bad Request
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth?response_type=code&scope=badscope&client_id=testid&redirect_uri=http%3A%2F%2Ftestserver%2Fdigid-oidc%2Fcallback%2F&state=not-a-random-string&nonce=not-a-random-string
+ response:
+ body:
+ string: ''
+ headers:
+ Location:
+ - http://testserver/digid-oidc/callback/?error=invalid_scope&error_description=Invalid+scopes%3A+badscope&state=not-a-random-string&iss=http%3A%2F%2Flocalhost%3A8080%2Frealms%2Ftest
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '0'
+ status:
+ code: 302
+ message: Found
+version: 1
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/DigiDCallbackTests/DigiDCallbackTests.test_digid_error_reported_for_cancelled_login_with_staff_django_user.yaml b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/DigiDCallbackTests/DigiDCallbackTests.test_digid_error_reported_for_cancelled_login_with_staff_django_user.yaml
new file mode 100644
index 0000000000..bfe1f37dc2
--- /dev/null
+++ b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/DigiDCallbackTests/DigiDCallbackTests.test_digid_error_reported_for_cancelled_login_with_staff_django_user.yaml
@@ -0,0 +1,91 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n\n\n\n\n\n\n"
+ headers:
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '1573'
+ status:
+ code: 400
+ message: Bad Request
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth?response_type=code&scope=badscope&client_id=testid&redirect_uri=http%3A%2F%2Ftestserver%2Fdigid-oidc%2Fcallback%2F&state=not-a-random-string&nonce=not-a-random-string
+ response:
+ body:
+ string: ''
+ headers:
+ Location:
+ - http://testserver/digid-oidc/callback/?error=invalid_scope&error_description=Invalid+scopes%3A+badscope&state=not-a-random-string&iss=http%3A%2F%2Flocalhost%3A8080%2Frealms%2Ftest
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '0'
+ status:
+ code: 302
+ message: Found
+version: 1
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/DigiDCallbackTests/DigiDCallbackTests.test_failing_claim_verification.yaml b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/DigiDCallbackTests/DigiDCallbackTests.test_failing_claim_verification.yaml
new file mode 100644
index 0000000000..61ac74073c
--- /dev/null
+++ b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/DigiDCallbackTests/DigiDCallbackTests.test_failing_claim_verification.yaml
@@ -0,0 +1,371 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n\n\n\n\n\n\n"
+ headers:
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '1573'
+ status:
+ code: 400
+ message: Bad Request
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth?response_type=code&scope=openid+bsn&client_id=testid&redirect_uri=http%3A%2F%2Ftestserver%2Fdigid-oidc%2Fcallback%2F&state=not-a-random-string&nonce=not-a-random-string
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n \n\n\n\n\n
+ \ \n
\n
+ \ \n
\n
+ \
\n\n\n
\n \n\n\n\n\n\n
+ \
\n
\n\n
\n
\n\n\n"
+ headers:
+ Cache-Control:
+ - no-store, must-revalidate, max-age=0
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Set-Cookie:
+ - AUTH_SESSION_ID=ba450357-f6ba-4c01-b882-cd99165d9ad5; Version=1; Path=/realms/test/;
+ SameSite=None; Secure; HttpOnly
+ - AUTH_SESSION_ID_LEGACY=ba450357-f6ba-4c01-b882-cd99165d9ad5; Version=1; Path=/realms/test/;
+ HttpOnly
+ - KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJjaWQiOiJ0ZXN0aWQiLCJwdHkiOiJvcGVuaWQtY29ubmVjdCIsInJ1cmkiOiJodHRwOi8vdGVzdHNlcnZlci9kaWdpZC1vaWRjL2NhbGxiYWNrLyIsImFjdCI6IkFVVEhFTlRJQ0FURSIsIm5vdGVzIjp7InNjb3BlIjoib3BlbmlkIGJzbiIsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9yZWFsbXMvdGVzdCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwicmVkaXJlY3RfdXJpIjoiaHR0cDovL3Rlc3RzZXJ2ZXIvZGlnaWQtb2lkYy9jYWxsYmFjay8iLCJzdGF0ZSI6Im5vdC1hLXJhbmRvbS1zdHJpbmciLCJub25jZSI6Im5vdC1hLXJhbmRvbS1zdHJpbmcifX0.HScBoNNJvmVcGQXpymd_ftVGkGUJBQnuwqgk59VJnYI;
+ Version=1; Path=/realms/test/; HttpOnly
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '4466'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: username=testuser&password=testuser&credentialId=&login=Sign+In
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '63'
+ Content-Type:
+ - application/x-www-form-urlencoded
+ Cookie:
+ - AUTH_SESSION_ID_LEGACY=ba450357-f6ba-4c01-b882-cd99165d9ad5; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJjaWQiOiJ0ZXN0aWQiLCJwdHkiOiJvcGVuaWQtY29ubmVjdCIsInJ1cmkiOiJodHRwOi8vdGVzdHNlcnZlci9kaWdpZC1vaWRjL2NhbGxiYWNrLyIsImFjdCI6IkFVVEhFTlRJQ0FURSIsIm5vdGVzIjp7InNjb3BlIjoib3BlbmlkIGJzbiIsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9yZWFsbXMvdGVzdCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwicmVkaXJlY3RfdXJpIjoiaHR0cDovL3Rlc3RzZXJ2ZXIvZGlnaWQtb2lkYy9jYWxsYmFjay8iLCJzdGF0ZSI6Im5vdC1hLXJhbmRvbS1zdHJpbmciLCJub25jZSI6Im5vdC1hLXJhbmRvbS1zdHJpbmcifX0.HScBoNNJvmVcGQXpymd_ftVGkGUJBQnuwqgk59VJnYI
+ User-Agent:
+ - python-requests/2.31.0
+ method: POST
+ uri: http://localhost:8080/realms/test/login-actions/authenticate?session_code=yIKomwM8U1RdBpGPk-INQDbtkF53AGoYQ3MgumaLgqk&execution=d8b8778e-a545-45d4-8f72-fd69facf4b72&client_id=testid&tab_id=bRFqvvLWaBs
+ response:
+ body:
+ string: ''
+ headers:
+ Cache-Control:
+ - no-store, must-revalidate, max-age=0
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Location:
+ - http://testserver/digid-oidc/callback/?state=not-a-random-string&session_state=ba450357-f6ba-4c01-b882-cd99165d9ad5&iss=http%3A%2F%2Flocalhost%3A8080%2Frealms%2Ftest&code=30f02855-9676-442d-bc42-e4f3438d1a02.ba450357-f6ba-4c01-b882-cd99165d9ad5.adf4ad83-4550-4619-9231-73bd8d700f45
+ Referrer-Policy:
+ - no-referrer
+ Set-Cookie:
+ - KEYCLOAK_LOCALE=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test/; HttpOnly
+ - KC_RESTART=; Version=1; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0;
+ Path=/realms/test/; HttpOnly
+ - KC_AUTH_STATE=; Version=1; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0;
+ Path=/realms/test/
+ - KEYCLOAK_IDENTITY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTY0OTY3OTksImlhdCI6MTcxNjQ2MDc5OSwianRpIjoiYzQ0ZTliYzEtMTJkZi00ZWRhLWI1MDYtMmQwZjE1YTE4YWQ3IiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiYWExMGNmYzctMmM0ZC00MWY2LThmYWMtN2JmNDA1YzU3MmM0IiwidHlwIjoiU2VyaWFsaXplZC1JRCIsInNlc3Npb25fc3RhdGUiOiJiYTQ1MDM1Ny1mNmJhLTRjMDEtYjg4Mi1jZDk5MTY1ZDlhZDUiLCJzaWQiOiJiYTQ1MDM1Ny1mNmJhLTRjMDEtYjg4Mi1jZDk5MTY1ZDlhZDUiLCJzdGF0ZV9jaGVja2VyIjoiSUlXQzYtREhaNHJHRkhaMnQ2WDJHS3ZsTHBZZHRTaFJHWEdjbHNlSEdlVSJ9.m4XUENhk1SRe2zrfA939BdsNgmS38Y3gPnokGvztWc8;
+ Version=1; Path=/realms/test/; SameSite=None; Secure; HttpOnly
+ - KEYCLOAK_IDENTITY_LEGACY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTY0OTY3OTksImlhdCI6MTcxNjQ2MDc5OSwianRpIjoiYzQ0ZTliYzEtMTJkZi00ZWRhLWI1MDYtMmQwZjE1YTE4YWQ3IiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiYWExMGNmYzctMmM0ZC00MWY2LThmYWMtN2JmNDA1YzU3MmM0IiwidHlwIjoiU2VyaWFsaXplZC1JRCIsInNlc3Npb25fc3RhdGUiOiJiYTQ1MDM1Ny1mNmJhLTRjMDEtYjg4Mi1jZDk5MTY1ZDlhZDUiLCJzaWQiOiJiYTQ1MDM1Ny1mNmJhLTRjMDEtYjg4Mi1jZDk5MTY1ZDlhZDUiLCJzdGF0ZV9jaGVja2VyIjoiSUlXQzYtREhaNHJHRkhaMnQ2WDJHS3ZsTHBZZHRTaFJHWEdjbHNlSEdlVSJ9.m4XUENhk1SRe2zrfA939BdsNgmS38Y3gPnokGvztWc8;
+ Version=1; Path=/realms/test/; HttpOnly
+ - KEYCLOAK_SESSION=test/aa10cfc7-2c4d-41f6-8fac-7bf405c572c4/ba450357-f6ba-4c01-b882-cd99165d9ad5;
+ Version=1; Expires=Thu, 23-May-2024 20:39:59 GMT; Max-Age=36000; Path=/realms/test/;
+ SameSite=None; Secure
+ - KEYCLOAK_SESSION_LEGACY=test/aa10cfc7-2c4d-41f6-8fac-7bf405c572c4/ba450357-f6ba-4c01-b882-cd99165d9ad5;
+ Version=1; Expires=Thu, 23-May-2024 20:39:59 GMT; Max-Age=36000; Path=/realms/test/
+ - KEYCLOAK_REMEMBER_ME=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test/; HttpOnly
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '0'
+ status:
+ code: 302
+ message: Found
+- request:
+ body: client_id=testid&client_secret=7DB3KUAAizYCcmZufpHRVOcD0TOkNO3I&grant_type=authorization_code&code=30f02855-9676-442d-bc42-e4f3438d1a02.ba450357-f6ba-4c01-b882-cd99165d9ad5.adf4ad83-4550-4619-9231-73bd8d700f45&redirect_uri=http%3A%2F%2Ftestserver%2Fdigid-oidc%2Fcallback%2F
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '273'
+ Content-Type:
+ - application/x-www-form-urlencoded
+ User-Agent:
+ - python-requests/2.31.0
+ method: POST
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/token
+ response:
+ body:
+ string: '{"access_token":"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTY0NjEwOTksImlhdCI6MTcxNjQ2MDc5OSwiYXV0aF90aW1lIjoxNzE2NDYwNzk5LCJqdGkiOiI5NWZkMWNlNi0wNTVmLTQ5NjEtYTBiOS01ZDJlNjJiNGM4NjYiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiYWExMGNmYzctMmM0ZC00MWY2LThmYWMtN2JmNDA1YzU3MmM0IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoidGVzdGlkIiwibm9uY2UiOiJub3QtYS1yYW5kb20tc3RyaW5nIiwic2Vzc2lvbl9zdGF0ZSI6ImJhNDUwMzU3LWY2YmEtNGMwMS1iODgyLWNkOTkxNjVkOWFkNSIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOlsiaHR0cDovLzEyNy4wLjAuMTo4MDAwIl0sInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJkZWZhdWx0LXJvbGVzLXRlc3QiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgZW1haWwgcHJvZmlsZSBrdmsgYnNuIiwic2lkIjoiYmE0NTAzNTctZjZiYS00YzAxLWI4ODItY2Q5OTE2NWQ5YWQ1Iiwia3ZrIjoiMDEyMzQ1Njc4IiwiZW1haWxfdmVyaWZpZWQiOmZhbHNlLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJ0ZXN0dXNlciIsImJzbiI6IjAwMDAwMDAwMCJ9.Ls7yWV_w1sKnyZ3RFYXeZtmEthK9vLvIOyxbV-xQI_oibFp5EnPaHNBx7rQalAEpRQO2kTRW-Q7651ICmVcpGf32vJlib1FFVhgLrbkF0rai1d22vyCZs6Ul008yY1z1h9R62XpxXRZ0DPA5hWYZE39afxrwKNljSGjHjyp2NzNCPI1IJQ2P7TAsKkHFTUpaSpFXBg4xr0iyGPRLC8G1bqokrrSf02uDDD0O8kRdM88A774oD7K-WF8iKLJyjTBRJh8uquNdzPf9dvIaxkBGvmD6GOm3QpNKqXofsTbZhDoD_8xzrfBfraiMjNdu5eGOsgjJxGnscIFOk40PmFpouA","expires_in":300,"refresh_expires_in":1800,"refresh_token":"eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTY0NjI1OTksImlhdCI6MTcxNjQ2MDc5OSwianRpIjoiZWZmZmVjNDUtNzkxYy00MzQwLTliZDMtMzYwMzFmZDM4OGM5IiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0IiwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiYWExMGNmYzctMmM0ZC00MWY2LThmYWMtN2JmNDA1YzU3MmM0IiwidHlwIjoiUmVmcmVzaCIsImF6cCI6InRlc3RpZCIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsInNlc3Npb25fc3RhdGUiOiJiYTQ1MDM1Ny1mNmJhLTRjMDEtYjg4Mi1jZDk5MTY1ZDlhZDUiLCJzY29wZSI6Im9wZW5pZCBlbWFpbCBwcm9maWxlIGt2ayBic24iLCJzaWQiOiJiYTQ1MDM1Ny1mNmJhLTRjMDEtYjg4Mi1jZDk5MTY1ZDlhZDUifQ.9etdaVa1dQLzFInp6OesD36bye0LD52K1JLMcTqNCsY","token_type":"Bearer","id_token":"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTY0NjEwOTksImlhdCI6MTcxNjQ2MDc5OSwiYXV0aF90aW1lIjoxNzE2NDYwNzk5LCJqdGkiOiJkYzM1Zjk0MS05MDA0LTQwNjYtYWM5MC1lOGI2NjQ1MTUyNGUiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJ0ZXN0aWQiLCJzdWIiOiJhYTEwY2ZjNy0yYzRkLTQxZjYtOGZhYy03YmY0MDVjNTcyYzQiLCJ0eXAiOiJJRCIsImF6cCI6InRlc3RpZCIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsInNlc3Npb25fc3RhdGUiOiJiYTQ1MDM1Ny1mNmJhLTRjMDEtYjg4Mi1jZDk5MTY1ZDlhZDUiLCJhdF9oYXNoIjoiYTdGVXMzaDdEZ05MRXRSSjVxdklkUSIsImFjciI6IjEiLCJzaWQiOiJiYTQ1MDM1Ny1mNmJhLTRjMDEtYjg4Mi1jZDk5MTY1ZDlhZDUiLCJrdmsiOiIwMTIzNDU2NzgiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsInByZWZlcnJlZF91c2VybmFtZSI6InRlc3R1c2VyIiwiYnNuIjoiMDAwMDAwMDAwIn0.mP97kvUFJUy_wFRt_Rmlbl-1YKqD4D5hyChQd_TUYszsaBtPpgq_Mul6qj-jcJJAy6ECd5YsngFVmcC_mwC_H5cGcvyWy9-k6h9fge0E7_EUa2kV3m_2yVZUpzqEv_rP2KIIFl0_8ZK8UHwtXrhX5FSpmj-_XLzWLvNrOIzAVRyqErGxNDbTnuTp5Ax-X2qs4hWzhTLcMyGd_1Zyerz3xp1IFTfaPhbHFLnTZRS-H1-PNRU33bRfiNI3YUs3fR5fn8XOUHbnlfZ7Iu_Yh71lYS0pjj3s_CTVtjNXiSlAufepxmpZTJk1OvAyMQaJ5u0tjTeO33rGqgU7wVjVwgJ5TQ","not-before-policy":0,"session_state":"ba450357-f6ba-4c01-b882-cd99165d9ad5","scope":"openid
+ email profile kvk bsn"}'
+ headers:
+ Cache-Control:
+ - no-store
+ Content-Type:
+ - application/json
+ Pragma:
+ - no-cache
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '3475'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/certs
+ response:
+ body:
+ string: '{"keys":[{"kid":"4UNQAcvUcv-DFUOx_4O1gt13OdJSotqEKPZurs2vQW8","kty":"RSA","alg":"RS256","use":"sig","n":"2DOZ0qHie73SuFVR7civrl6r82YUiAghfzaMowjCg0o06AF--2lIS7vNV_PbsVVznPAAMqVrNG-8CcevEzvVZMQD9nH4DI7xlOxK0lrYu8rmMeSfOvXVbBVsWBZe0jnGNukZqjwmRE5__ttJdxPfIBT5-2L6mguQbDfhSUEEdIW7y7UfOXvqLqEcBtoIEB-ORKDTUIQwGZM5mSCy-cY3cHvvZfZVgaUUy5NvujPRXTMje4n_hG0KfEV-40G9qC2_Xvx4EooJzBZ6FSThiWhCpwhIvzcQqB6M9lHW7nU6wADhYPNCa2OKWvphwZ_zbrF4B9dmS6Zli5rBvbox9Hh45w","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMLTANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANgzmdKh4nu90rhVUe3Ir65eq/NmFIgIIX82jKMIwoNKNOgBfvtpSEu7zVfz27FVc5zwADKlazRvvAnHrxM71WTEA/Zx+AyO8ZTsStJa2LvK5jHknzr11WwVbFgWXtI5xjbpGao8JkROf/7bSXcT3yAU+fti+poLkGw34UlBBHSFu8u1Hzl76i6hHAbaCBAfjkSg01CEMBmTOZkgsvnGN3B772X2VYGlFMuTb7oz0V0zI3uJ/4RtCnxFfuNBvagtv178eBKKCcwWehUk4YloQqcISL83EKgejPZR1u51OsAA4WDzQmtjilr6YcGf826xeAfXZkumZYuawb26MfR4eOcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAsnQG/Yi2g1XTCJn74hWv9MjxVAaZb4gBAc2AWm5VgAjhFEM9h6x6m1mQkq7JM4rIdAj8jw55Ok9CBVBIqq4G4cME3eUvVytkj2lC9zcRoAivjjZF2HPg7zNPa2TTR50asmHPRokppV6gewO/C+o5as+4P2zqDXBh61aRd/9kdQfkg14LBbH5/dYccAuvUqlTYC4IEPCvVmBNC1xsMjf0vohvoSjm9vL2bfqG/RJH0ScdCjOd5d2zju4/e2oVdluWm+vzKBQplc7tVMuKpn6LcLmVHiGNAl+EBIZH+WVLlTx0D1+kbHZsfLYG53lQg2LsvurRbWyF/a5fVM/oLTn5ag=="],"x5t":"H5xfs1pRtvX0HyVTskx7eTXx88U","x5t#S256":"XurVtKAIEyc4w9HCGOhnjoRHnYu4d9HCn_5YHmkScJg"},{"kid":"TV3Tl5jIY1nrJLSb53UKEubLR5gYiq9slq1SsDDg1HU","kty":"RSA","alg":"RSA-OAEP","use":"enc","n":"pNvU3ecpVHbJT4bCOEpw6cnV1yi65tB3I0bRF2ilLVOY944QRAGnjBBECPIzNbgqavghYp1j75F2nq6_ny1CYfoaxTV2iDpRUw8_f7sliYbl8FrLLat0S25ItlZrg5TEJHObvOqlG2_nXoeH36MRWwNhms2uCqfhn5VgtenIzpQIBolnM7zzGp21NvdJ1C_ZAUzkXC-l3oQ-BXTtpEVM4h2KpYh4gfZJWCbYij5d1e1YApKD6V61_Cs3Oa2OY7CAUyq5kgAWJZFDB6CpzIr226u3bV7F9RbrQu3Ybc_Lv33EwykscLznKWZY2Mbs3Iz_rFNv3sVX_vHpH4DHWlKu7Q","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMlzANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKTb1N3nKVR2yU+GwjhKcOnJ1dcouubQdyNG0RdopS1TmPeOEEQBp4wQRAjyMzW4Kmr4IWKdY++Rdp6uv58tQmH6GsU1dog6UVMPP3+7JYmG5fBayy2rdEtuSLZWa4OUxCRzm7zqpRtv516Hh9+jEVsDYZrNrgqn4Z+VYLXpyM6UCAaJZzO88xqdtTb3SdQv2QFM5Fwvpd6EPgV07aRFTOIdiqWIeIH2SVgm2Io+XdXtWAKSg+letfwrNzmtjmOwgFMquZIAFiWRQwegqcyK9turt21exfUW60Lt2G3Py799xMMpLHC85ylmWNjG7NyM/6xTb97FV/7x6R+Ax1pSru0CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAQGJHeTYSMvp0yndbIn7DLohO9lom5nRrx/bLyb7TiRfogyJEF6rQZ66CAkQFk5eMF878fsHTuMVjtmXVBnhojhVmK91HwjsNQu/8xR6QMXNKJQMvHR245vwUGxlWRw/36ObM1D7QjCd/q+FonpBEY4m5Y6Uz1U0HR2Cbh0E2afVlPLeV+F0LKrlyVMdIaWBGWftCGIKDAHaG/PD66zbAKtxerv2fBIDq100WHPhd57BZxX+2aGJp1IaRDgkxV0E/CjEy3+Knd8xbAgUSW0Tl6OTC75exIvlbzeluEBe0wlapAb7WvBKYsipSW8G8Ey7tjoolDT4AU82EaKUPstiMnA=="],"x5t":"AlfHDI0FOPQpt3RBAILt0dtW1yw","x5t#S256":"a7bhm8-JsnfY7bL_m8Yl72hgmp5516VZlFcVloKzk08"}]}'
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/json;charset=UTF-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '2909'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Authorization:
+ - Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTY0NjEwOTksImlhdCI6MTcxNjQ2MDc5OSwiYXV0aF90aW1lIjoxNzE2NDYwNzk5LCJqdGkiOiI5NWZkMWNlNi0wNTVmLTQ5NjEtYTBiOS01ZDJlNjJiNGM4NjYiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiYWExMGNmYzctMmM0ZC00MWY2LThmYWMtN2JmNDA1YzU3MmM0IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoidGVzdGlkIiwibm9uY2UiOiJub3QtYS1yYW5kb20tc3RyaW5nIiwic2Vzc2lvbl9zdGF0ZSI6ImJhNDUwMzU3LWY2YmEtNGMwMS1iODgyLWNkOTkxNjVkOWFkNSIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOlsiaHR0cDovLzEyNy4wLjAuMTo4MDAwIl0sInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJkZWZhdWx0LXJvbGVzLXRlc3QiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgZW1haWwgcHJvZmlsZSBrdmsgYnNuIiwic2lkIjoiYmE0NTAzNTctZjZiYS00YzAxLWI4ODItY2Q5OTE2NWQ5YWQ1Iiwia3ZrIjoiMDEyMzQ1Njc4IiwiZW1haWxfdmVyaWZpZWQiOmZhbHNlLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJ0ZXN0dXNlciIsImJzbiI6IjAwMDAwMDAwMCJ9.Ls7yWV_w1sKnyZ3RFYXeZtmEthK9vLvIOyxbV-xQI_oibFp5EnPaHNBx7rQalAEpRQO2kTRW-Q7651ICmVcpGf32vJlib1FFVhgLrbkF0rai1d22vyCZs6Ul008yY1z1h9R62XpxXRZ0DPA5hWYZE39afxrwKNljSGjHjyp2NzNCPI1IJQ2P7TAsKkHFTUpaSpFXBg4xr0iyGPRLC8G1bqokrrSf02uDDD0O8kRdM88A774oD7K-WF8iKLJyjTBRJh8uquNdzPf9dvIaxkBGvmD6GOm3QpNKqXofsTbZhDoD_8xzrfBfraiMjNdu5eGOsgjJxGnscIFOk40PmFpouA
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/userinfo
+ response:
+ body:
+ string: eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJzdWIiOiJhYTEwY2ZjNy0yYzRkLTQxZjYtOGZhYy03YmY0MDVjNTcyYzQiLCJrdmsiOiIwMTIzNDU2NzgiLCJhdWQiOiJ0ZXN0aWQiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9yZWFsbXMvdGVzdCIsInByZWZlcnJlZF91c2VybmFtZSI6InRlc3R1c2VyIiwiYnNuIjoiMDAwMDAwMDAwIn0.CKub7h5He-7acsX5pli41jZiatfM3eM-f5bl6M9GaSSVJLy-NHH5RDSIvpNu4K3PA5uO1nn2sfiDWvfBgsqPxvssiqcmkenf1RpgaEdn7fS_bRn1ziAkYFq5tVEICluPeYELR8FNt7XGVGPakhezPnUwsdaUOBWf7ELTgbxVdBBy3Nkjg2op456glHO4C84zjABNK5grWfLCDDEwKnw4o1gz-QWAS1TPa7yQaPOJr71zjFT-o3P7EBBkASN_CiELOpno3bBxIeTa631m9BHZ8dECiffp_GQhxMqPS9bTwqTlffc-EkIamZr_90uHs3Dw8gVySYL7YTGoGDeq6w6jEw
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/jwt
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '714'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/certs
+ response:
+ body:
+ string: '{"keys":[{"kid":"4UNQAcvUcv-DFUOx_4O1gt13OdJSotqEKPZurs2vQW8","kty":"RSA","alg":"RS256","use":"sig","n":"2DOZ0qHie73SuFVR7civrl6r82YUiAghfzaMowjCg0o06AF--2lIS7vNV_PbsVVznPAAMqVrNG-8CcevEzvVZMQD9nH4DI7xlOxK0lrYu8rmMeSfOvXVbBVsWBZe0jnGNukZqjwmRE5__ttJdxPfIBT5-2L6mguQbDfhSUEEdIW7y7UfOXvqLqEcBtoIEB-ORKDTUIQwGZM5mSCy-cY3cHvvZfZVgaUUy5NvujPRXTMje4n_hG0KfEV-40G9qC2_Xvx4EooJzBZ6FSThiWhCpwhIvzcQqB6M9lHW7nU6wADhYPNCa2OKWvphwZ_zbrF4B9dmS6Zli5rBvbox9Hh45w","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMLTANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANgzmdKh4nu90rhVUe3Ir65eq/NmFIgIIX82jKMIwoNKNOgBfvtpSEu7zVfz27FVc5zwADKlazRvvAnHrxM71WTEA/Zx+AyO8ZTsStJa2LvK5jHknzr11WwVbFgWXtI5xjbpGao8JkROf/7bSXcT3yAU+fti+poLkGw34UlBBHSFu8u1Hzl76i6hHAbaCBAfjkSg01CEMBmTOZkgsvnGN3B772X2VYGlFMuTb7oz0V0zI3uJ/4RtCnxFfuNBvagtv178eBKKCcwWehUk4YloQqcISL83EKgejPZR1u51OsAA4WDzQmtjilr6YcGf826xeAfXZkumZYuawb26MfR4eOcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAsnQG/Yi2g1XTCJn74hWv9MjxVAaZb4gBAc2AWm5VgAjhFEM9h6x6m1mQkq7JM4rIdAj8jw55Ok9CBVBIqq4G4cME3eUvVytkj2lC9zcRoAivjjZF2HPg7zNPa2TTR50asmHPRokppV6gewO/C+o5as+4P2zqDXBh61aRd/9kdQfkg14LBbH5/dYccAuvUqlTYC4IEPCvVmBNC1xsMjf0vohvoSjm9vL2bfqG/RJH0ScdCjOd5d2zju4/e2oVdluWm+vzKBQplc7tVMuKpn6LcLmVHiGNAl+EBIZH+WVLlTx0D1+kbHZsfLYG53lQg2LsvurRbWyF/a5fVM/oLTn5ag=="],"x5t":"H5xfs1pRtvX0HyVTskx7eTXx88U","x5t#S256":"XurVtKAIEyc4w9HCGOhnjoRHnYu4d9HCn_5YHmkScJg"},{"kid":"TV3Tl5jIY1nrJLSb53UKEubLR5gYiq9slq1SsDDg1HU","kty":"RSA","alg":"RSA-OAEP","use":"enc","n":"pNvU3ecpVHbJT4bCOEpw6cnV1yi65tB3I0bRF2ilLVOY944QRAGnjBBECPIzNbgqavghYp1j75F2nq6_ny1CYfoaxTV2iDpRUw8_f7sliYbl8FrLLat0S25ItlZrg5TEJHObvOqlG2_nXoeH36MRWwNhms2uCqfhn5VgtenIzpQIBolnM7zzGp21NvdJ1C_ZAUzkXC-l3oQ-BXTtpEVM4h2KpYh4gfZJWCbYij5d1e1YApKD6V61_Cs3Oa2OY7CAUyq5kgAWJZFDB6CpzIr226u3bV7F9RbrQu3Ybc_Lv33EwykscLznKWZY2Mbs3Iz_rFNv3sVX_vHpH4DHWlKu7Q","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMlzANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKTb1N3nKVR2yU+GwjhKcOnJ1dcouubQdyNG0RdopS1TmPeOEEQBp4wQRAjyMzW4Kmr4IWKdY++Rdp6uv58tQmH6GsU1dog6UVMPP3+7JYmG5fBayy2rdEtuSLZWa4OUxCRzm7zqpRtv516Hh9+jEVsDYZrNrgqn4Z+VYLXpyM6UCAaJZzO88xqdtTb3SdQv2QFM5Fwvpd6EPgV07aRFTOIdiqWIeIH2SVgm2Io+XdXtWAKSg+letfwrNzmtjmOwgFMquZIAFiWRQwegqcyK9turt21exfUW60Lt2G3Py799xMMpLHC85ylmWNjG7NyM/6xTb97FV/7x6R+Ax1pSru0CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAQGJHeTYSMvp0yndbIn7DLohO9lom5nRrx/bLyb7TiRfogyJEF6rQZ66CAkQFk5eMF878fsHTuMVjtmXVBnhojhVmK91HwjsNQu/8xR6QMXNKJQMvHR245vwUGxlWRw/36ObM1D7QjCd/q+FonpBEY4m5Y6Uz1U0HR2Cbh0E2afVlPLeV+F0LKrlyVMdIaWBGWftCGIKDAHaG/PD66zbAKtxerv2fBIDq100WHPhd57BZxX+2aGJp1IaRDgkxV0E/CjEy3+Knd8xbAgUSW0Tl6OTC75exIvlbzeluEBe0wlapAb7WvBKYsipSW8G8Ey7tjoolDT4AU82EaKUPstiMnA=="],"x5t":"AlfHDI0FOPQpt3RBAILt0dtW1yw","x5t#S256":"a7bhm8-JsnfY7bL_m8Yl72hgmp5516VZlFcVloKzk08"}]}'
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/json;charset=UTF-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '2909'
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/DigiDCallbackTests/DigiDCallbackTests.test_redirects_after_successful_auth.yaml b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/DigiDCallbackTests/DigiDCallbackTests.test_redirects_after_successful_auth.yaml
new file mode 100644
index 0000000000..4cc00716a3
--- /dev/null
+++ b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/DigiDCallbackTests/DigiDCallbackTests.test_redirects_after_successful_auth.yaml
@@ -0,0 +1,371 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n\n\n\n\n\n\n"
+ headers:
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '1573'
+ status:
+ code: 400
+ message: Bad Request
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth?response_type=code&scope=openid+bsn&client_id=testid&redirect_uri=http%3A%2F%2Ftestserver%2Fdigid-oidc%2Fcallback%2F&state=not-a-random-string&nonce=not-a-random-string
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n \n\n\n\n\n
+ \ \n
\n
+ \ \n
\n
+ \
\n\n\n
\n \n\n\n\n\n\n
+ \
\n
\n\n
\n
\n\n\n"
+ headers:
+ Cache-Control:
+ - no-store, must-revalidate, max-age=0
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Set-Cookie:
+ - AUTH_SESSION_ID=3114bc76-dfd1-46f3-ac41-b9fd1ffcec70; Version=1; Path=/realms/test/;
+ SameSite=None; Secure; HttpOnly
+ - AUTH_SESSION_ID_LEGACY=3114bc76-dfd1-46f3-ac41-b9fd1ffcec70; Version=1; Path=/realms/test/;
+ HttpOnly
+ - KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJjaWQiOiJ0ZXN0aWQiLCJwdHkiOiJvcGVuaWQtY29ubmVjdCIsInJ1cmkiOiJodHRwOi8vdGVzdHNlcnZlci9kaWdpZC1vaWRjL2NhbGxiYWNrLyIsImFjdCI6IkFVVEhFTlRJQ0FURSIsIm5vdGVzIjp7InNjb3BlIjoib3BlbmlkIGJzbiIsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9yZWFsbXMvdGVzdCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwicmVkaXJlY3RfdXJpIjoiaHR0cDovL3Rlc3RzZXJ2ZXIvZGlnaWQtb2lkYy9jYWxsYmFjay8iLCJzdGF0ZSI6Im5vdC1hLXJhbmRvbS1zdHJpbmciLCJub25jZSI6Im5vdC1hLXJhbmRvbS1zdHJpbmcifX0.HScBoNNJvmVcGQXpymd_ftVGkGUJBQnuwqgk59VJnYI;
+ Version=1; Path=/realms/test/; HttpOnly
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '4466'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: username=testuser&password=testuser&credentialId=&login=Sign+In
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '63'
+ Content-Type:
+ - application/x-www-form-urlencoded
+ Cookie:
+ - AUTH_SESSION_ID_LEGACY=3114bc76-dfd1-46f3-ac41-b9fd1ffcec70; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJjaWQiOiJ0ZXN0aWQiLCJwdHkiOiJvcGVuaWQtY29ubmVjdCIsInJ1cmkiOiJodHRwOi8vdGVzdHNlcnZlci9kaWdpZC1vaWRjL2NhbGxiYWNrLyIsImFjdCI6IkFVVEhFTlRJQ0FURSIsIm5vdGVzIjp7InNjb3BlIjoib3BlbmlkIGJzbiIsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9yZWFsbXMvdGVzdCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwicmVkaXJlY3RfdXJpIjoiaHR0cDovL3Rlc3RzZXJ2ZXIvZGlnaWQtb2lkYy9jYWxsYmFjay8iLCJzdGF0ZSI6Im5vdC1hLXJhbmRvbS1zdHJpbmciLCJub25jZSI6Im5vdC1hLXJhbmRvbS1zdHJpbmcifX0.HScBoNNJvmVcGQXpymd_ftVGkGUJBQnuwqgk59VJnYI
+ User-Agent:
+ - python-requests/2.31.0
+ method: POST
+ uri: http://localhost:8080/realms/test/login-actions/authenticate?session_code=VpBSf3lWFq8CtuFRLHFM1heNdmlibKeJxe4ea8vLWKE&execution=d8b8778e-a545-45d4-8f72-fd69facf4b72&client_id=testid&tab_id=cB7QKE99Kcg
+ response:
+ body:
+ string: ''
+ headers:
+ Cache-Control:
+ - no-store, must-revalidate, max-age=0
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Location:
+ - http://testserver/digid-oidc/callback/?state=not-a-random-string&session_state=3114bc76-dfd1-46f3-ac41-b9fd1ffcec70&iss=http%3A%2F%2Flocalhost%3A8080%2Frealms%2Ftest&code=b5a57e80-99a1-4b15-aa13-a743e3776cb7.3114bc76-dfd1-46f3-ac41-b9fd1ffcec70.adf4ad83-4550-4619-9231-73bd8d700f45
+ Referrer-Policy:
+ - no-referrer
+ Set-Cookie:
+ - KEYCLOAK_LOCALE=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test/; HttpOnly
+ - KC_RESTART=; Version=1; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0;
+ Path=/realms/test/; HttpOnly
+ - KC_AUTH_STATE=; Version=1; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0;
+ Path=/realms/test/
+ - KEYCLOAK_IDENTITY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTY0OTY4MDAsImlhdCI6MTcxNjQ2MDgwMCwianRpIjoiMTU5NTRjYjMtYjZhZC00ZTNmLTlmMjAtNmQ0OTNiNzJhZGEwIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiYWExMGNmYzctMmM0ZC00MWY2LThmYWMtN2JmNDA1YzU3MmM0IiwidHlwIjoiU2VyaWFsaXplZC1JRCIsInNlc3Npb25fc3RhdGUiOiIzMTE0YmM3Ni1kZmQxLTQ2ZjMtYWM0MS1iOWZkMWZmY2VjNzAiLCJzaWQiOiIzMTE0YmM3Ni1kZmQxLTQ2ZjMtYWM0MS1iOWZkMWZmY2VjNzAiLCJzdGF0ZV9jaGVja2VyIjoiWTVVSVl2UkRtVHJUbGpWSGhCVnZRVEFCT3pXbF9qRjhfZ1NJVGh1RkpzUSJ9.i4VqQ0kFz7JgaacFgRLODlfnJ5bIxq5GniTsw8OTAho;
+ Version=1; Path=/realms/test/; SameSite=None; Secure; HttpOnly
+ - KEYCLOAK_IDENTITY_LEGACY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTY0OTY4MDAsImlhdCI6MTcxNjQ2MDgwMCwianRpIjoiMTU5NTRjYjMtYjZhZC00ZTNmLTlmMjAtNmQ0OTNiNzJhZGEwIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiYWExMGNmYzctMmM0ZC00MWY2LThmYWMtN2JmNDA1YzU3MmM0IiwidHlwIjoiU2VyaWFsaXplZC1JRCIsInNlc3Npb25fc3RhdGUiOiIzMTE0YmM3Ni1kZmQxLTQ2ZjMtYWM0MS1iOWZkMWZmY2VjNzAiLCJzaWQiOiIzMTE0YmM3Ni1kZmQxLTQ2ZjMtYWM0MS1iOWZkMWZmY2VjNzAiLCJzdGF0ZV9jaGVja2VyIjoiWTVVSVl2UkRtVHJUbGpWSGhCVnZRVEFCT3pXbF9qRjhfZ1NJVGh1RkpzUSJ9.i4VqQ0kFz7JgaacFgRLODlfnJ5bIxq5GniTsw8OTAho;
+ Version=1; Path=/realms/test/; HttpOnly
+ - KEYCLOAK_SESSION=test/aa10cfc7-2c4d-41f6-8fac-7bf405c572c4/3114bc76-dfd1-46f3-ac41-b9fd1ffcec70;
+ Version=1; Expires=Thu, 23-May-2024 20:40:00 GMT; Max-Age=36000; Path=/realms/test/;
+ SameSite=None; Secure
+ - KEYCLOAK_SESSION_LEGACY=test/aa10cfc7-2c4d-41f6-8fac-7bf405c572c4/3114bc76-dfd1-46f3-ac41-b9fd1ffcec70;
+ Version=1; Expires=Thu, 23-May-2024 20:40:00 GMT; Max-Age=36000; Path=/realms/test/
+ - KEYCLOAK_REMEMBER_ME=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test/; HttpOnly
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '0'
+ status:
+ code: 302
+ message: Found
+- request:
+ body: client_id=testid&client_secret=7DB3KUAAizYCcmZufpHRVOcD0TOkNO3I&grant_type=authorization_code&code=b5a57e80-99a1-4b15-aa13-a743e3776cb7.3114bc76-dfd1-46f3-ac41-b9fd1ffcec70.adf4ad83-4550-4619-9231-73bd8d700f45&redirect_uri=http%3A%2F%2Ftestserver%2Fdigid-oidc%2Fcallback%2F
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '273'
+ Content-Type:
+ - application/x-www-form-urlencoded
+ User-Agent:
+ - python-requests/2.31.0
+ method: POST
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/token
+ response:
+ body:
+ string: '{"access_token":"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTY0NjExMDAsImlhdCI6MTcxNjQ2MDgwMCwiYXV0aF90aW1lIjoxNzE2NDYwODAwLCJqdGkiOiI4MjVjNjA1Yi05MTY0LTQ3NTQtYmJiNy0wZmZkYjI2NmE5ZGEiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiYWExMGNmYzctMmM0ZC00MWY2LThmYWMtN2JmNDA1YzU3MmM0IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoidGVzdGlkIiwibm9uY2UiOiJub3QtYS1yYW5kb20tc3RyaW5nIiwic2Vzc2lvbl9zdGF0ZSI6IjMxMTRiYzc2LWRmZDEtNDZmMy1hYzQxLWI5ZmQxZmZjZWM3MCIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOlsiaHR0cDovLzEyNy4wLjAuMTo4MDAwIl0sInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJkZWZhdWx0LXJvbGVzLXRlc3QiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgZW1haWwgcHJvZmlsZSBrdmsgYnNuIiwic2lkIjoiMzExNGJjNzYtZGZkMS00NmYzLWFjNDEtYjlmZDFmZmNlYzcwIiwia3ZrIjoiMDEyMzQ1Njc4IiwiZW1haWxfdmVyaWZpZWQiOmZhbHNlLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJ0ZXN0dXNlciIsImJzbiI6IjAwMDAwMDAwMCJ9.lVo9LCUi_jPabEZ3lwTWwZe9_U0itZnoB-m9dI4qFFeOKq69XfgYWRrmycPiZQmBozDViHXEq9yHICCC09hPmyvReLZ383SOPIXuKRciSZ75JiqXcR_Iq6ZiZcr-vdBquPesH6CicPqsdhkWVf0UrOlUngVtBo74GTzF7rspskl__It_XpvsDbercF9TdkER6Qdcp6WRwZnv2y2JzmmXV7uRwZRw-Oi07pFG_PsU7zGMASZlzoZKeBotdT5ISaom5-TkqNziTjH1dDBwjjyVfbG30aXaYgaHOC8fCwr5ARrWpaWrZy56dy4RHa1IrxIsDXNRvnQ6pKvtAWpQ36HX6w","expires_in":300,"refresh_expires_in":1800,"refresh_token":"eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTY0NjI2MDAsImlhdCI6MTcxNjQ2MDgwMCwianRpIjoiY2QzOWNhMjAtNTc2My00MTkxLThiMjctMDNjMDBhY2U1MjNiIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0IiwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiYWExMGNmYzctMmM0ZC00MWY2LThmYWMtN2JmNDA1YzU3MmM0IiwidHlwIjoiUmVmcmVzaCIsImF6cCI6InRlc3RpZCIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsInNlc3Npb25fc3RhdGUiOiIzMTE0YmM3Ni1kZmQxLTQ2ZjMtYWM0MS1iOWZkMWZmY2VjNzAiLCJzY29wZSI6Im9wZW5pZCBlbWFpbCBwcm9maWxlIGt2ayBic24iLCJzaWQiOiIzMTE0YmM3Ni1kZmQxLTQ2ZjMtYWM0MS1iOWZkMWZmY2VjNzAifQ.423SnnSzqOCTaWXN863pQsezGdNtx2y-xgKWZ7aFFJ8","token_type":"Bearer","id_token":"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTY0NjExMDAsImlhdCI6MTcxNjQ2MDgwMCwiYXV0aF90aW1lIjoxNzE2NDYwODAwLCJqdGkiOiJkMGI4MTIxZC1iNTcyLTQ4MzAtYWY0ZC1lMTI4ZTNkZjZjMGUiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJ0ZXN0aWQiLCJzdWIiOiJhYTEwY2ZjNy0yYzRkLTQxZjYtOGZhYy03YmY0MDVjNTcyYzQiLCJ0eXAiOiJJRCIsImF6cCI6InRlc3RpZCIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsInNlc3Npb25fc3RhdGUiOiIzMTE0YmM3Ni1kZmQxLTQ2ZjMtYWM0MS1iOWZkMWZmY2VjNzAiLCJhdF9oYXNoIjoiQzFnS0ZqSml3Um40ZzcwcHM1bWJBUSIsImFjciI6IjEiLCJzaWQiOiIzMTE0YmM3Ni1kZmQxLTQ2ZjMtYWM0MS1iOWZkMWZmY2VjNzAiLCJrdmsiOiIwMTIzNDU2NzgiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsInByZWZlcnJlZF91c2VybmFtZSI6InRlc3R1c2VyIiwiYnNuIjoiMDAwMDAwMDAwIn0.ZQD07QUSP1C4XjE_MOg05gwEtyMboZeeJ_9ybbOjF4_ZIKS21EPwARV9CVCiuaBaQweoZ3PYmef9EWuHMYQcLE9aoUa5IV5HdPbNJove-TfpSp1PQQVIzRTYw-C1nw3iLtoSx_TtGSOomUXCiqZQplXWN-FwcZL38q1szqzRu5zJ1MryhC8IerWB0qv3DUfwPy1sKDU07ZIKkiJvpoNvmge0ycU_uAoOvaoYGcVu3c6fP_chsBxt7keSV7LrinuMCoigRjxASw6lEkYjV6qqiIXxFBr1gnRHJyc1oGye6Q5HEPJIqjLPeXbRX4pvnUBLqe1blBWnq0TfQ1J_mlEq6A","not-before-policy":0,"session_state":"3114bc76-dfd1-46f3-ac41-b9fd1ffcec70","scope":"openid
+ email profile kvk bsn"}'
+ headers:
+ Cache-Control:
+ - no-store
+ Content-Type:
+ - application/json
+ Pragma:
+ - no-cache
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '3475'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/certs
+ response:
+ body:
+ string: '{"keys":[{"kid":"4UNQAcvUcv-DFUOx_4O1gt13OdJSotqEKPZurs2vQW8","kty":"RSA","alg":"RS256","use":"sig","n":"2DOZ0qHie73SuFVR7civrl6r82YUiAghfzaMowjCg0o06AF--2lIS7vNV_PbsVVznPAAMqVrNG-8CcevEzvVZMQD9nH4DI7xlOxK0lrYu8rmMeSfOvXVbBVsWBZe0jnGNukZqjwmRE5__ttJdxPfIBT5-2L6mguQbDfhSUEEdIW7y7UfOXvqLqEcBtoIEB-ORKDTUIQwGZM5mSCy-cY3cHvvZfZVgaUUy5NvujPRXTMje4n_hG0KfEV-40G9qC2_Xvx4EooJzBZ6FSThiWhCpwhIvzcQqB6M9lHW7nU6wADhYPNCa2OKWvphwZ_zbrF4B9dmS6Zli5rBvbox9Hh45w","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMLTANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANgzmdKh4nu90rhVUe3Ir65eq/NmFIgIIX82jKMIwoNKNOgBfvtpSEu7zVfz27FVc5zwADKlazRvvAnHrxM71WTEA/Zx+AyO8ZTsStJa2LvK5jHknzr11WwVbFgWXtI5xjbpGao8JkROf/7bSXcT3yAU+fti+poLkGw34UlBBHSFu8u1Hzl76i6hHAbaCBAfjkSg01CEMBmTOZkgsvnGN3B772X2VYGlFMuTb7oz0V0zI3uJ/4RtCnxFfuNBvagtv178eBKKCcwWehUk4YloQqcISL83EKgejPZR1u51OsAA4WDzQmtjilr6YcGf826xeAfXZkumZYuawb26MfR4eOcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAsnQG/Yi2g1XTCJn74hWv9MjxVAaZb4gBAc2AWm5VgAjhFEM9h6x6m1mQkq7JM4rIdAj8jw55Ok9CBVBIqq4G4cME3eUvVytkj2lC9zcRoAivjjZF2HPg7zNPa2TTR50asmHPRokppV6gewO/C+o5as+4P2zqDXBh61aRd/9kdQfkg14LBbH5/dYccAuvUqlTYC4IEPCvVmBNC1xsMjf0vohvoSjm9vL2bfqG/RJH0ScdCjOd5d2zju4/e2oVdluWm+vzKBQplc7tVMuKpn6LcLmVHiGNAl+EBIZH+WVLlTx0D1+kbHZsfLYG53lQg2LsvurRbWyF/a5fVM/oLTn5ag=="],"x5t":"H5xfs1pRtvX0HyVTskx7eTXx88U","x5t#S256":"XurVtKAIEyc4w9HCGOhnjoRHnYu4d9HCn_5YHmkScJg"},{"kid":"TV3Tl5jIY1nrJLSb53UKEubLR5gYiq9slq1SsDDg1HU","kty":"RSA","alg":"RSA-OAEP","use":"enc","n":"pNvU3ecpVHbJT4bCOEpw6cnV1yi65tB3I0bRF2ilLVOY944QRAGnjBBECPIzNbgqavghYp1j75F2nq6_ny1CYfoaxTV2iDpRUw8_f7sliYbl8FrLLat0S25ItlZrg5TEJHObvOqlG2_nXoeH36MRWwNhms2uCqfhn5VgtenIzpQIBolnM7zzGp21NvdJ1C_ZAUzkXC-l3oQ-BXTtpEVM4h2KpYh4gfZJWCbYij5d1e1YApKD6V61_Cs3Oa2OY7CAUyq5kgAWJZFDB6CpzIr226u3bV7F9RbrQu3Ybc_Lv33EwykscLznKWZY2Mbs3Iz_rFNv3sVX_vHpH4DHWlKu7Q","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMlzANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKTb1N3nKVR2yU+GwjhKcOnJ1dcouubQdyNG0RdopS1TmPeOEEQBp4wQRAjyMzW4Kmr4IWKdY++Rdp6uv58tQmH6GsU1dog6UVMPP3+7JYmG5fBayy2rdEtuSLZWa4OUxCRzm7zqpRtv516Hh9+jEVsDYZrNrgqn4Z+VYLXpyM6UCAaJZzO88xqdtTb3SdQv2QFM5Fwvpd6EPgV07aRFTOIdiqWIeIH2SVgm2Io+XdXtWAKSg+letfwrNzmtjmOwgFMquZIAFiWRQwegqcyK9turt21exfUW60Lt2G3Py799xMMpLHC85ylmWNjG7NyM/6xTb97FV/7x6R+Ax1pSru0CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAQGJHeTYSMvp0yndbIn7DLohO9lom5nRrx/bLyb7TiRfogyJEF6rQZ66CAkQFk5eMF878fsHTuMVjtmXVBnhojhVmK91HwjsNQu/8xR6QMXNKJQMvHR245vwUGxlWRw/36ObM1D7QjCd/q+FonpBEY4m5Y6Uz1U0HR2Cbh0E2afVlPLeV+F0LKrlyVMdIaWBGWftCGIKDAHaG/PD66zbAKtxerv2fBIDq100WHPhd57BZxX+2aGJp1IaRDgkxV0E/CjEy3+Knd8xbAgUSW0Tl6OTC75exIvlbzeluEBe0wlapAb7WvBKYsipSW8G8Ey7tjoolDT4AU82EaKUPstiMnA=="],"x5t":"AlfHDI0FOPQpt3RBAILt0dtW1yw","x5t#S256":"a7bhm8-JsnfY7bL_m8Yl72hgmp5516VZlFcVloKzk08"}]}'
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/json;charset=UTF-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '2909'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Authorization:
+ - Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTY0NjExMDAsImlhdCI6MTcxNjQ2MDgwMCwiYXV0aF90aW1lIjoxNzE2NDYwODAwLCJqdGkiOiI4MjVjNjA1Yi05MTY0LTQ3NTQtYmJiNy0wZmZkYjI2NmE5ZGEiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiYWExMGNmYzctMmM0ZC00MWY2LThmYWMtN2JmNDA1YzU3MmM0IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoidGVzdGlkIiwibm9uY2UiOiJub3QtYS1yYW5kb20tc3RyaW5nIiwic2Vzc2lvbl9zdGF0ZSI6IjMxMTRiYzc2LWRmZDEtNDZmMy1hYzQxLWI5ZmQxZmZjZWM3MCIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOlsiaHR0cDovLzEyNy4wLjAuMTo4MDAwIl0sInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJkZWZhdWx0LXJvbGVzLXRlc3QiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgZW1haWwgcHJvZmlsZSBrdmsgYnNuIiwic2lkIjoiMzExNGJjNzYtZGZkMS00NmYzLWFjNDEtYjlmZDFmZmNlYzcwIiwia3ZrIjoiMDEyMzQ1Njc4IiwiZW1haWxfdmVyaWZpZWQiOmZhbHNlLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJ0ZXN0dXNlciIsImJzbiI6IjAwMDAwMDAwMCJ9.lVo9LCUi_jPabEZ3lwTWwZe9_U0itZnoB-m9dI4qFFeOKq69XfgYWRrmycPiZQmBozDViHXEq9yHICCC09hPmyvReLZ383SOPIXuKRciSZ75JiqXcR_Iq6ZiZcr-vdBquPesH6CicPqsdhkWVf0UrOlUngVtBo74GTzF7rspskl__It_XpvsDbercF9TdkER6Qdcp6WRwZnv2y2JzmmXV7uRwZRw-Oi07pFG_PsU7zGMASZlzoZKeBotdT5ISaom5-TkqNziTjH1dDBwjjyVfbG30aXaYgaHOC8fCwr5ARrWpaWrZy56dy4RHa1IrxIsDXNRvnQ6pKvtAWpQ36HX6w
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/userinfo
+ response:
+ body:
+ string: eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJzdWIiOiJhYTEwY2ZjNy0yYzRkLTQxZjYtOGZhYy03YmY0MDVjNTcyYzQiLCJrdmsiOiIwMTIzNDU2NzgiLCJhdWQiOiJ0ZXN0aWQiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9yZWFsbXMvdGVzdCIsInByZWZlcnJlZF91c2VybmFtZSI6InRlc3R1c2VyIiwiYnNuIjoiMDAwMDAwMDAwIn0.CKub7h5He-7acsX5pli41jZiatfM3eM-f5bl6M9GaSSVJLy-NHH5RDSIvpNu4K3PA5uO1nn2sfiDWvfBgsqPxvssiqcmkenf1RpgaEdn7fS_bRn1ziAkYFq5tVEICluPeYELR8FNt7XGVGPakhezPnUwsdaUOBWf7ELTgbxVdBBy3Nkjg2op456glHO4C84zjABNK5grWfLCDDEwKnw4o1gz-QWAS1TPa7yQaPOJr71zjFT-o3P7EBBkASN_CiELOpno3bBxIeTa631m9BHZ8dECiffp_GQhxMqPS9bTwqTlffc-EkIamZr_90uHs3Dw8gVySYL7YTGoGDeq6w6jEw
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/jwt
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '714'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/certs
+ response:
+ body:
+ string: '{"keys":[{"kid":"4UNQAcvUcv-DFUOx_4O1gt13OdJSotqEKPZurs2vQW8","kty":"RSA","alg":"RS256","use":"sig","n":"2DOZ0qHie73SuFVR7civrl6r82YUiAghfzaMowjCg0o06AF--2lIS7vNV_PbsVVznPAAMqVrNG-8CcevEzvVZMQD9nH4DI7xlOxK0lrYu8rmMeSfOvXVbBVsWBZe0jnGNukZqjwmRE5__ttJdxPfIBT5-2L6mguQbDfhSUEEdIW7y7UfOXvqLqEcBtoIEB-ORKDTUIQwGZM5mSCy-cY3cHvvZfZVgaUUy5NvujPRXTMje4n_hG0KfEV-40G9qC2_Xvx4EooJzBZ6FSThiWhCpwhIvzcQqB6M9lHW7nU6wADhYPNCa2OKWvphwZ_zbrF4B9dmS6Zli5rBvbox9Hh45w","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMLTANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANgzmdKh4nu90rhVUe3Ir65eq/NmFIgIIX82jKMIwoNKNOgBfvtpSEu7zVfz27FVc5zwADKlazRvvAnHrxM71WTEA/Zx+AyO8ZTsStJa2LvK5jHknzr11WwVbFgWXtI5xjbpGao8JkROf/7bSXcT3yAU+fti+poLkGw34UlBBHSFu8u1Hzl76i6hHAbaCBAfjkSg01CEMBmTOZkgsvnGN3B772X2VYGlFMuTb7oz0V0zI3uJ/4RtCnxFfuNBvagtv178eBKKCcwWehUk4YloQqcISL83EKgejPZR1u51OsAA4WDzQmtjilr6YcGf826xeAfXZkumZYuawb26MfR4eOcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAsnQG/Yi2g1XTCJn74hWv9MjxVAaZb4gBAc2AWm5VgAjhFEM9h6x6m1mQkq7JM4rIdAj8jw55Ok9CBVBIqq4G4cME3eUvVytkj2lC9zcRoAivjjZF2HPg7zNPa2TTR50asmHPRokppV6gewO/C+o5as+4P2zqDXBh61aRd/9kdQfkg14LBbH5/dYccAuvUqlTYC4IEPCvVmBNC1xsMjf0vohvoSjm9vL2bfqG/RJH0ScdCjOd5d2zju4/e2oVdluWm+vzKBQplc7tVMuKpn6LcLmVHiGNAl+EBIZH+WVLlTx0D1+kbHZsfLYG53lQg2LsvurRbWyF/a5fVM/oLTn5ag=="],"x5t":"H5xfs1pRtvX0HyVTskx7eTXx88U","x5t#S256":"XurVtKAIEyc4w9HCGOhnjoRHnYu4d9HCn_5YHmkScJg"},{"kid":"TV3Tl5jIY1nrJLSb53UKEubLR5gYiq9slq1SsDDg1HU","kty":"RSA","alg":"RSA-OAEP","use":"enc","n":"pNvU3ecpVHbJT4bCOEpw6cnV1yi65tB3I0bRF2ilLVOY944QRAGnjBBECPIzNbgqavghYp1j75F2nq6_ny1CYfoaxTV2iDpRUw8_f7sliYbl8FrLLat0S25ItlZrg5TEJHObvOqlG2_nXoeH36MRWwNhms2uCqfhn5VgtenIzpQIBolnM7zzGp21NvdJ1C_ZAUzkXC-l3oQ-BXTtpEVM4h2KpYh4gfZJWCbYij5d1e1YApKD6V61_Cs3Oa2OY7CAUyq5kgAWJZFDB6CpzIr226u3bV7F9RbrQu3Ybc_Lv33EwykscLznKWZY2Mbs3Iz_rFNv3sVX_vHpH4DHWlKu7Q","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMlzANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKTb1N3nKVR2yU+GwjhKcOnJ1dcouubQdyNG0RdopS1TmPeOEEQBp4wQRAjyMzW4Kmr4IWKdY++Rdp6uv58tQmH6GsU1dog6UVMPP3+7JYmG5fBayy2rdEtuSLZWa4OUxCRzm7zqpRtv516Hh9+jEVsDYZrNrgqn4Z+VYLXpyM6UCAaJZzO88xqdtTb3SdQv2QFM5Fwvpd6EPgV07aRFTOIdiqWIeIH2SVgm2Io+XdXtWAKSg+letfwrNzmtjmOwgFMquZIAFiWRQwegqcyK9turt21exfUW60Lt2G3Py799xMMpLHC85ylmWNjG7NyM/6xTb97FV/7x6R+Ax1pSru0CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAQGJHeTYSMvp0yndbIn7DLohO9lom5nRrx/bLyb7TiRfogyJEF6rQZ66CAkQFk5eMF878fsHTuMVjtmXVBnhojhVmK91HwjsNQu/8xR6QMXNKJQMvHR245vwUGxlWRw/36ObM1D7QjCd/q+FonpBEY4m5Y6Uz1U0HR2Cbh0E2afVlPLeV+F0LKrlyVMdIaWBGWftCGIKDAHaG/PD66zbAKtxerv2fBIDq100WHPhd57BZxX+2aGJp1IaRDgkxV0E/CjEy3+Knd8xbAgUSW0Tl6OTC75exIvlbzeluEBe0wlapAb7WvBKYsipSW8G8Ey7tjoolDT4AU82EaKUPstiMnA=="],"x5t":"AlfHDI0FOPQpt3RBAILt0dtW1yw","x5t#S256":"a7bhm8-JsnfY7bL_m8Yl72hgmp5516VZlFcVloKzk08"}]}'
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/json;charset=UTF-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '2909'
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/DigiDInitTests/DigiDInitTests.test_idp_availability_check.yaml b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/DigiDInitTests/DigiDInitTests.test_idp_availability_check.yaml
new file mode 100644
index 0000000000..e786ba2dc4
--- /dev/null
+++ b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/DigiDInitTests/DigiDInitTests.test_idp_availability_check.yaml
@@ -0,0 +1,26 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/i-dont-exist
+ response:
+ body:
+ string: '{"error":"Unable to find matching target resource method"}'
+ headers:
+ Content-Type:
+ - application/json
+ content-length:
+ - '58'
+ status:
+ code: 404
+ message: Not Found
+version: 1
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/DigiDInitTests/DigiDInitTests.test_keycloak_idp_hint_is_respected.yaml b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/DigiDInitTests/DigiDInitTests.test_keycloak_idp_hint_is_respected.yaml
new file mode 100644
index 0000000000..7556222e57
--- /dev/null
+++ b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/DigiDInitTests/DigiDInitTests.test_keycloak_idp_hint_is_respected.yaml
@@ -0,0 +1,59 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n\n\n\n\n\n\n"
+ headers:
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '1573'
+ status:
+ code: 400
+ message: Bad Request
+version: 1
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/DigiDInitTests/DigiDInitTests.test_start_flow_redirects_to_oidc_provider.yaml b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/DigiDInitTests/DigiDInitTests.test_start_flow_redirects_to_oidc_provider.yaml
new file mode 100644
index 0000000000..7556222e57
--- /dev/null
+++ b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/DigiDInitTests/DigiDInitTests.test_start_flow_redirects_to_oidc_provider.yaml
@@ -0,0 +1,59 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n\n\n\n\n\n\n"
+ headers:
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '1573'
+ status:
+ code: 400
+ message: Bad Request
+version: 1
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/DigiDLogoutTests/DigiDLogoutTests.test_logout_also_logs_out_user_in_openid_provider.yaml b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/DigiDLogoutTests/DigiDLogoutTests.test_logout_also_logs_out_user_in_openid_provider.yaml
new file mode 100644
index 0000000000..62cbec7e9c
--- /dev/null
+++ b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/DigiDLogoutTests/DigiDLogoutTests.test_logout_also_logs_out_user_in_openid_provider.yaml
@@ -0,0 +1,727 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n\n\n\n\n\n\n"
+ headers:
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '1573'
+ status:
+ code: 400
+ message: Bad Request
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth?response_type=code&scope=openid+bsn&client_id=testid&redirect_uri=http%3A%2F%2Ftestserver%2Fdigid-oidc%2Fcallback%2F&state=not-a-random-string&nonce=not-a-random-string
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n \n\n\n\n\n
+ \ \n
\n
+ \ \n
\n
+ \
\n\n\n
\n \n\n\n\n\n\n
+ \
\n
\n\n
\n
\n\n\n"
+ headers:
+ Cache-Control:
+ - no-store, must-revalidate, max-age=0
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Set-Cookie:
+ - AUTH_SESSION_ID=1091d9c2-bcce-4411-b721-7d5510258857; Version=1; Path=/realms/test/;
+ SameSite=None; Secure; HttpOnly
+ - AUTH_SESSION_ID_LEGACY=1091d9c2-bcce-4411-b721-7d5510258857; Version=1; Path=/realms/test/;
+ HttpOnly
+ - KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJjaWQiOiJ0ZXN0aWQiLCJwdHkiOiJvcGVuaWQtY29ubmVjdCIsInJ1cmkiOiJodHRwOi8vdGVzdHNlcnZlci9kaWdpZC1vaWRjL2NhbGxiYWNrLyIsImFjdCI6IkFVVEhFTlRJQ0FURSIsIm5vdGVzIjp7InNjb3BlIjoib3BlbmlkIGJzbiIsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9yZWFsbXMvdGVzdCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwicmVkaXJlY3RfdXJpIjoiaHR0cDovL3Rlc3RzZXJ2ZXIvZGlnaWQtb2lkYy9jYWxsYmFjay8iLCJzdGF0ZSI6Im5vdC1hLXJhbmRvbS1zdHJpbmciLCJub25jZSI6Im5vdC1hLXJhbmRvbS1zdHJpbmcifX0.HScBoNNJvmVcGQXpymd_ftVGkGUJBQnuwqgk59VJnYI;
+ Version=1; Path=/realms/test/; HttpOnly
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '4466'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: username=testuser&password=testuser&credentialId=&login=Sign+In
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '63'
+ Content-Type:
+ - application/x-www-form-urlencoded
+ Cookie:
+ - AUTH_SESSION_ID_LEGACY=1091d9c2-bcce-4411-b721-7d5510258857; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJjaWQiOiJ0ZXN0aWQiLCJwdHkiOiJvcGVuaWQtY29ubmVjdCIsInJ1cmkiOiJodHRwOi8vdGVzdHNlcnZlci9kaWdpZC1vaWRjL2NhbGxiYWNrLyIsImFjdCI6IkFVVEhFTlRJQ0FURSIsIm5vdGVzIjp7InNjb3BlIjoib3BlbmlkIGJzbiIsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9yZWFsbXMvdGVzdCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwicmVkaXJlY3RfdXJpIjoiaHR0cDovL3Rlc3RzZXJ2ZXIvZGlnaWQtb2lkYy9jYWxsYmFjay8iLCJzdGF0ZSI6Im5vdC1hLXJhbmRvbS1zdHJpbmciLCJub25jZSI6Im5vdC1hLXJhbmRvbS1zdHJpbmcifX0.HScBoNNJvmVcGQXpymd_ftVGkGUJBQnuwqgk59VJnYI
+ User-Agent:
+ - python-requests/2.31.0
+ method: POST
+ uri: http://localhost:8080/realms/test/login-actions/authenticate?session_code=Ysrav870fVEtnC_GiQA2qPtU7gLvuDz6BWoq2Ey6Tmo&execution=d8b8778e-a545-45d4-8f72-fd69facf4b72&client_id=testid&tab_id=cDmFQs-WOzw
+ response:
+ body:
+ string: ''
+ headers:
+ Cache-Control:
+ - no-store, must-revalidate, max-age=0
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Location:
+ - http://testserver/digid-oidc/callback/?state=not-a-random-string&session_state=1091d9c2-bcce-4411-b721-7d5510258857&iss=http%3A%2F%2Flocalhost%3A8080%2Frealms%2Ftest&code=4b831994-466a-4efb-895d-192c4a0d61e0.1091d9c2-bcce-4411-b721-7d5510258857.adf4ad83-4550-4619-9231-73bd8d700f45
+ Referrer-Policy:
+ - no-referrer
+ Set-Cookie:
+ - KEYCLOAK_LOCALE=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test/; HttpOnly
+ - KC_RESTART=; Version=1; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0;
+ Path=/realms/test/; HttpOnly
+ - KC_AUTH_STATE=; Version=1; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0;
+ Path=/realms/test/
+ - KEYCLOAK_IDENTITY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTY0OTY4MDIsImlhdCI6MTcxNjQ2MDgwMiwianRpIjoiNGJiYmI2ZDYtZDA0NS00NjFjLThiZTMtMDk0MTExZWFhZjQyIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiYWExMGNmYzctMmM0ZC00MWY2LThmYWMtN2JmNDA1YzU3MmM0IiwidHlwIjoiU2VyaWFsaXplZC1JRCIsInNlc3Npb25fc3RhdGUiOiIxMDkxZDljMi1iY2NlLTQ0MTEtYjcyMS03ZDU1MTAyNTg4NTciLCJzaWQiOiIxMDkxZDljMi1iY2NlLTQ0MTEtYjcyMS03ZDU1MTAyNTg4NTciLCJzdGF0ZV9jaGVja2VyIjoiWm9QMEc0aDFlNmZkYUtiWTVqYXpsTE9PZ3hZYzJ6RXppNlVxMVByMmtwbyJ9.KTq3mw_EdHMWrrCSIZJr83TzGB0O-5-JAc2F9EgfnN0;
+ Version=1; Path=/realms/test/; SameSite=None; Secure; HttpOnly
+ - KEYCLOAK_IDENTITY_LEGACY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTY0OTY4MDIsImlhdCI6MTcxNjQ2MDgwMiwianRpIjoiNGJiYmI2ZDYtZDA0NS00NjFjLThiZTMtMDk0MTExZWFhZjQyIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiYWExMGNmYzctMmM0ZC00MWY2LThmYWMtN2JmNDA1YzU3MmM0IiwidHlwIjoiU2VyaWFsaXplZC1JRCIsInNlc3Npb25fc3RhdGUiOiIxMDkxZDljMi1iY2NlLTQ0MTEtYjcyMS03ZDU1MTAyNTg4NTciLCJzaWQiOiIxMDkxZDljMi1iY2NlLTQ0MTEtYjcyMS03ZDU1MTAyNTg4NTciLCJzdGF0ZV9jaGVja2VyIjoiWm9QMEc0aDFlNmZkYUtiWTVqYXpsTE9PZ3hZYzJ6RXppNlVxMVByMmtwbyJ9.KTq3mw_EdHMWrrCSIZJr83TzGB0O-5-JAc2F9EgfnN0;
+ Version=1; Path=/realms/test/; HttpOnly
+ - KEYCLOAK_SESSION=test/aa10cfc7-2c4d-41f6-8fac-7bf405c572c4/1091d9c2-bcce-4411-b721-7d5510258857;
+ Version=1; Expires=Thu, 23-May-2024 20:40:02 GMT; Max-Age=36000; Path=/realms/test/;
+ SameSite=None; Secure
+ - KEYCLOAK_SESSION_LEGACY=test/aa10cfc7-2c4d-41f6-8fac-7bf405c572c4/1091d9c2-bcce-4411-b721-7d5510258857;
+ Version=1; Expires=Thu, 23-May-2024 20:40:02 GMT; Max-Age=36000; Path=/realms/test/
+ - KEYCLOAK_REMEMBER_ME=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test/; HttpOnly
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '0'
+ status:
+ code: 302
+ message: Found
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n\n\n\n\n\n\n"
+ headers:
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '1573'
+ status:
+ code: 400
+ message: Bad Request
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ Cookie:
+ - AUTH_SESSION_ID_LEGACY=1091d9c2-bcce-4411-b721-7d5510258857; KEYCLOAK_IDENTITY_LEGACY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTY0OTY4MDIsImlhdCI6MTcxNjQ2MDgwMiwianRpIjoiNGJiYmI2ZDYtZDA0NS00NjFjLThiZTMtMDk0MTExZWFhZjQyIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiYWExMGNmYzctMmM0ZC00MWY2LThmYWMtN2JmNDA1YzU3MmM0IiwidHlwIjoiU2VyaWFsaXplZC1JRCIsInNlc3Npb25fc3RhdGUiOiIxMDkxZDljMi1iY2NlLTQ0MTEtYjcyMS03ZDU1MTAyNTg4NTciLCJzaWQiOiIxMDkxZDljMi1iY2NlLTQ0MTEtYjcyMS03ZDU1MTAyNTg4NTciLCJzdGF0ZV9jaGVja2VyIjoiWm9QMEc0aDFlNmZkYUtiWTVqYXpsTE9PZ3hZYzJ6RXppNlVxMVByMmtwbyJ9.KTq3mw_EdHMWrrCSIZJr83TzGB0O-5-JAc2F9EgfnN0;
+ KEYCLOAK_SESSION_LEGACY=test/aa10cfc7-2c4d-41f6-8fac-7bf405c572c4/1091d9c2-bcce-4411-b721-7d5510258857
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth?response_type=code&scope=openid+bsn&client_id=testid&redirect_uri=http%3A%2F%2Ftestserver%2Fdigid-oidc%2Fcallback%2F&state=not-a-random-string&nonce=not-a-random-string
+ response:
+ body:
+ string: ''
+ headers:
+ Cache-Control:
+ - no-store, must-revalidate, max-age=0
+ Location:
+ - http://testserver/digid-oidc/callback/?state=not-a-random-string&session_state=1091d9c2-bcce-4411-b721-7d5510258857&iss=http%3A%2F%2Flocalhost%3A8080%2Frealms%2Ftest&code=b41690e3-70b9-4d9f-b298-301c50a1c224.1091d9c2-bcce-4411-b721-7d5510258857.adf4ad83-4550-4619-9231-73bd8d700f45
+ Referrer-Policy:
+ - no-referrer
+ Set-Cookie:
+ - KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJjaWQiOiJ0ZXN0aWQiLCJwdHkiOiJvcGVuaWQtY29ubmVjdCIsInJ1cmkiOiJodHRwOi8vdGVzdHNlcnZlci9kaWdpZC1vaWRjL2NhbGxiYWNrLyIsImFjdCI6IkFVVEhFTlRJQ0FURSIsIm5vdGVzIjp7InNjb3BlIjoib3BlbmlkIGJzbiIsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9yZWFsbXMvdGVzdCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwicmVkaXJlY3RfdXJpIjoiaHR0cDovL3Rlc3RzZXJ2ZXIvZGlnaWQtb2lkYy9jYWxsYmFjay8iLCJzdGF0ZSI6Im5vdC1hLXJhbmRvbS1zdHJpbmciLCJub25jZSI6Im5vdC1hLXJhbmRvbS1zdHJpbmcifX0.HScBoNNJvmVcGQXpymd_ftVGkGUJBQnuwqgk59VJnYI;
+ Version=1; Path=/realms/test/; HttpOnly
+ - KEYCLOAK_LOCALE=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test/; HttpOnly
+ - KC_RESTART=; Version=1; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0;
+ Path=/realms/test/; HttpOnly
+ - KC_AUTH_STATE=; Version=1; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0;
+ Path=/realms/test/
+ - KEYCLOAK_IDENTITY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTY0OTY4MDIsImlhdCI6MTcxNjQ2MDgwMiwianRpIjoiYjcxZmFhNzQtOTI3Yy00MDQyLWFhOWUtMjU4NTc1ZjIyOGVhIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiYWExMGNmYzctMmM0ZC00MWY2LThmYWMtN2JmNDA1YzU3MmM0IiwidHlwIjoiU2VyaWFsaXplZC1JRCIsInNlc3Npb25fc3RhdGUiOiIxMDkxZDljMi1iY2NlLTQ0MTEtYjcyMS03ZDU1MTAyNTg4NTciLCJzaWQiOiIxMDkxZDljMi1iY2NlLTQ0MTEtYjcyMS03ZDU1MTAyNTg4NTciLCJzdGF0ZV9jaGVja2VyIjoiWm9QMEc0aDFlNmZkYUtiWTVqYXpsTE9PZ3hZYzJ6RXppNlVxMVByMmtwbyJ9.-ddPZrhtYlgeq1Ad8r7RXBPcZbNgn92EpCAS55FR0Jk;
+ Version=1; Path=/realms/test/; SameSite=None; Secure; HttpOnly
+ - KEYCLOAK_IDENTITY_LEGACY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTY0OTY4MDIsImlhdCI6MTcxNjQ2MDgwMiwianRpIjoiYjcxZmFhNzQtOTI3Yy00MDQyLWFhOWUtMjU4NTc1ZjIyOGVhIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiYWExMGNmYzctMmM0ZC00MWY2LThmYWMtN2JmNDA1YzU3MmM0IiwidHlwIjoiU2VyaWFsaXplZC1JRCIsInNlc3Npb25fc3RhdGUiOiIxMDkxZDljMi1iY2NlLTQ0MTEtYjcyMS03ZDU1MTAyNTg4NTciLCJzaWQiOiIxMDkxZDljMi1iY2NlLTQ0MTEtYjcyMS03ZDU1MTAyNTg4NTciLCJzdGF0ZV9jaGVja2VyIjoiWm9QMEc0aDFlNmZkYUtiWTVqYXpsTE9PZ3hZYzJ6RXppNlVxMVByMmtwbyJ9.-ddPZrhtYlgeq1Ad8r7RXBPcZbNgn92EpCAS55FR0Jk;
+ Version=1; Path=/realms/test/; HttpOnly
+ - KEYCLOAK_SESSION=test/aa10cfc7-2c4d-41f6-8fac-7bf405c572c4/1091d9c2-bcce-4411-b721-7d5510258857;
+ Version=1; Expires=Thu, 23-May-2024 20:40:02 GMT; Max-Age=36000; Path=/realms/test/;
+ SameSite=None; Secure
+ - KEYCLOAK_SESSION_LEGACY=test/aa10cfc7-2c4d-41f6-8fac-7bf405c572c4/1091d9c2-bcce-4411-b721-7d5510258857;
+ Version=1; Expires=Thu, 23-May-2024 20:40:02 GMT; Max-Age=36000; Path=/realms/test/
+ - KEYCLOAK_REMEMBER_ME=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test/; HttpOnly
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '0'
+ status:
+ code: 302
+ message: Found
+- request:
+ body: client_id=testid&client_secret=7DB3KUAAizYCcmZufpHRVOcD0TOkNO3I&grant_type=authorization_code&code=b41690e3-70b9-4d9f-b298-301c50a1c224.1091d9c2-bcce-4411-b721-7d5510258857.adf4ad83-4550-4619-9231-73bd8d700f45&redirect_uri=http%3A%2F%2Ftestserver%2Fdigid-oidc%2Fcallback%2F
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '273'
+ Content-Type:
+ - application/x-www-form-urlencoded
+ User-Agent:
+ - python-requests/2.31.0
+ method: POST
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/token
+ response:
+ body:
+ string: '{"access_token":"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTY0NjExMDIsImlhdCI6MTcxNjQ2MDgwMiwiYXV0aF90aW1lIjoxNzE2NDYwODAyLCJqdGkiOiIxMWExMTQ5YS05YTVmLTQwMTAtOWM3My0wOTk2NWU4ZmU1MjciLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiYWExMGNmYzctMmM0ZC00MWY2LThmYWMtN2JmNDA1YzU3MmM0IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoidGVzdGlkIiwibm9uY2UiOiJub3QtYS1yYW5kb20tc3RyaW5nIiwic2Vzc2lvbl9zdGF0ZSI6IjEwOTFkOWMyLWJjY2UtNDQxMS1iNzIxLTdkNTUxMDI1ODg1NyIsImFjciI6IjAiLCJhbGxvd2VkLW9yaWdpbnMiOlsiaHR0cDovLzEyNy4wLjAuMTo4MDAwIl0sInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJkZWZhdWx0LXJvbGVzLXRlc3QiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgZW1haWwgcHJvZmlsZSBrdmsgYnNuIiwic2lkIjoiMTA5MWQ5YzItYmNjZS00NDExLWI3MjEtN2Q1NTEwMjU4ODU3Iiwia3ZrIjoiMDEyMzQ1Njc4IiwiZW1haWxfdmVyaWZpZWQiOmZhbHNlLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJ0ZXN0dXNlciIsImJzbiI6IjAwMDAwMDAwMCJ9.n7J_SNIHKnkH71MCKRXxLl-n1ezrHGBzkhRmxeNKiDiln21BdBJ9Jz-2PUXqbCce_Ekt-pxNPzV6toCKuHYfwoX6vgvh0djjooh4N0XO-lvx9MYHskfQInrr3Ij09Pv1EHma1RQDrYMB8bRjt8DU3xLXmlDsp3CGvm8DBk6-6t1zAR9ZKYFRDOQirGYUnpAXj-ItagBiKRxPsymLSMCCcRZqu-yea9gYk-7fMZVdqempfZ3WypRXSU-zCwg9ldREwRE5GHEQg8O-rZyC6uv9WQ6UEiKhqKeKhWlvUbnk3NGUF_qUsstOTNDA3_6565rKId9d5ji0WhvyT05DgmiHeA","expires_in":300,"refresh_expires_in":1800,"refresh_token":"eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTY0NjI2MDIsImlhdCI6MTcxNjQ2MDgwMiwianRpIjoiNWU0NWFlMmUtZTkwMC00NDc4LTkzYjItZThjYmE5NDU3MTEzIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0IiwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiYWExMGNmYzctMmM0ZC00MWY2LThmYWMtN2JmNDA1YzU3MmM0IiwidHlwIjoiUmVmcmVzaCIsImF6cCI6InRlc3RpZCIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsInNlc3Npb25fc3RhdGUiOiIxMDkxZDljMi1iY2NlLTQ0MTEtYjcyMS03ZDU1MTAyNTg4NTciLCJzY29wZSI6Im9wZW5pZCBlbWFpbCBwcm9maWxlIGt2ayBic24iLCJzaWQiOiIxMDkxZDljMi1iY2NlLTQ0MTEtYjcyMS03ZDU1MTAyNTg4NTcifQ.yZWH4RA-kzIxGSRs4oCd_a5zMGFe-wM0buFzzDLh2iM","token_type":"Bearer","id_token":"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTY0NjExMDIsImlhdCI6MTcxNjQ2MDgwMiwiYXV0aF90aW1lIjoxNzE2NDYwODAyLCJqdGkiOiJjOTlmYWEzMi0wY2JkLTQ1MGEtOTg4Zi0xZjcxOTRmNTg1OTUiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJ0ZXN0aWQiLCJzdWIiOiJhYTEwY2ZjNy0yYzRkLTQxZjYtOGZhYy03YmY0MDVjNTcyYzQiLCJ0eXAiOiJJRCIsImF6cCI6InRlc3RpZCIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsInNlc3Npb25fc3RhdGUiOiIxMDkxZDljMi1iY2NlLTQ0MTEtYjcyMS03ZDU1MTAyNTg4NTciLCJhdF9oYXNoIjoiYlBEQ0lPcktfMDRTcDZsREdRUE8wUSIsImFjciI6IjAiLCJzaWQiOiIxMDkxZDljMi1iY2NlLTQ0MTEtYjcyMS03ZDU1MTAyNTg4NTciLCJrdmsiOiIwMTIzNDU2NzgiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsInByZWZlcnJlZF91c2VybmFtZSI6InRlc3R1c2VyIiwiYnNuIjoiMDAwMDAwMDAwIn0.gd-LkgxZsEOvVawJO-o8VpWGYLt5K00YVlJZjHlMBp1h-f8ErBTN1ijCkTWPEWbu7e8FN-UBBb02atxvdSBZNHNgwkawsyS0SVgKUzsRnH1fAOwsF4hlZDBVIJEmemWBMrf82qWYJ8FMA9sKL0aFUI9U5FaslwT8ywQMIIZYeymbbeIcFFID68-uVnhuJV2mB57BZgNsTc9iD3c70LZ8X0jfw63r_XLBYBvR11OMPRxsF0bwMtsdlxqrdrQemUYzrK6lBfZaPlBUuKMuIw7WBozgIq9G7VOGgreKr68lLDt0OAiaIQvt6v2R-1i2VSgywicc1M0oakVp1LBvCo31ug","not-before-policy":0,"session_state":"1091d9c2-bcce-4411-b721-7d5510258857","scope":"openid
+ email profile kvk bsn"}'
+ headers:
+ Cache-Control:
+ - no-store
+ Content-Type:
+ - application/json
+ Pragma:
+ - no-cache
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '3475'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/certs
+ response:
+ body:
+ string: '{"keys":[{"kid":"4UNQAcvUcv-DFUOx_4O1gt13OdJSotqEKPZurs2vQW8","kty":"RSA","alg":"RS256","use":"sig","n":"2DOZ0qHie73SuFVR7civrl6r82YUiAghfzaMowjCg0o06AF--2lIS7vNV_PbsVVznPAAMqVrNG-8CcevEzvVZMQD9nH4DI7xlOxK0lrYu8rmMeSfOvXVbBVsWBZe0jnGNukZqjwmRE5__ttJdxPfIBT5-2L6mguQbDfhSUEEdIW7y7UfOXvqLqEcBtoIEB-ORKDTUIQwGZM5mSCy-cY3cHvvZfZVgaUUy5NvujPRXTMje4n_hG0KfEV-40G9qC2_Xvx4EooJzBZ6FSThiWhCpwhIvzcQqB6M9lHW7nU6wADhYPNCa2OKWvphwZ_zbrF4B9dmS6Zli5rBvbox9Hh45w","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMLTANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANgzmdKh4nu90rhVUe3Ir65eq/NmFIgIIX82jKMIwoNKNOgBfvtpSEu7zVfz27FVc5zwADKlazRvvAnHrxM71WTEA/Zx+AyO8ZTsStJa2LvK5jHknzr11WwVbFgWXtI5xjbpGao8JkROf/7bSXcT3yAU+fti+poLkGw34UlBBHSFu8u1Hzl76i6hHAbaCBAfjkSg01CEMBmTOZkgsvnGN3B772X2VYGlFMuTb7oz0V0zI3uJ/4RtCnxFfuNBvagtv178eBKKCcwWehUk4YloQqcISL83EKgejPZR1u51OsAA4WDzQmtjilr6YcGf826xeAfXZkumZYuawb26MfR4eOcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAsnQG/Yi2g1XTCJn74hWv9MjxVAaZb4gBAc2AWm5VgAjhFEM9h6x6m1mQkq7JM4rIdAj8jw55Ok9CBVBIqq4G4cME3eUvVytkj2lC9zcRoAivjjZF2HPg7zNPa2TTR50asmHPRokppV6gewO/C+o5as+4P2zqDXBh61aRd/9kdQfkg14LBbH5/dYccAuvUqlTYC4IEPCvVmBNC1xsMjf0vohvoSjm9vL2bfqG/RJH0ScdCjOd5d2zju4/e2oVdluWm+vzKBQplc7tVMuKpn6LcLmVHiGNAl+EBIZH+WVLlTx0D1+kbHZsfLYG53lQg2LsvurRbWyF/a5fVM/oLTn5ag=="],"x5t":"H5xfs1pRtvX0HyVTskx7eTXx88U","x5t#S256":"XurVtKAIEyc4w9HCGOhnjoRHnYu4d9HCn_5YHmkScJg"},{"kid":"TV3Tl5jIY1nrJLSb53UKEubLR5gYiq9slq1SsDDg1HU","kty":"RSA","alg":"RSA-OAEP","use":"enc","n":"pNvU3ecpVHbJT4bCOEpw6cnV1yi65tB3I0bRF2ilLVOY944QRAGnjBBECPIzNbgqavghYp1j75F2nq6_ny1CYfoaxTV2iDpRUw8_f7sliYbl8FrLLat0S25ItlZrg5TEJHObvOqlG2_nXoeH36MRWwNhms2uCqfhn5VgtenIzpQIBolnM7zzGp21NvdJ1C_ZAUzkXC-l3oQ-BXTtpEVM4h2KpYh4gfZJWCbYij5d1e1YApKD6V61_Cs3Oa2OY7CAUyq5kgAWJZFDB6CpzIr226u3bV7F9RbrQu3Ybc_Lv33EwykscLznKWZY2Mbs3Iz_rFNv3sVX_vHpH4DHWlKu7Q","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMlzANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKTb1N3nKVR2yU+GwjhKcOnJ1dcouubQdyNG0RdopS1TmPeOEEQBp4wQRAjyMzW4Kmr4IWKdY++Rdp6uv58tQmH6GsU1dog6UVMPP3+7JYmG5fBayy2rdEtuSLZWa4OUxCRzm7zqpRtv516Hh9+jEVsDYZrNrgqn4Z+VYLXpyM6UCAaJZzO88xqdtTb3SdQv2QFM5Fwvpd6EPgV07aRFTOIdiqWIeIH2SVgm2Io+XdXtWAKSg+letfwrNzmtjmOwgFMquZIAFiWRQwegqcyK9turt21exfUW60Lt2G3Py799xMMpLHC85ylmWNjG7NyM/6xTb97FV/7x6R+Ax1pSru0CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAQGJHeTYSMvp0yndbIn7DLohO9lom5nRrx/bLyb7TiRfogyJEF6rQZ66CAkQFk5eMF878fsHTuMVjtmXVBnhojhVmK91HwjsNQu/8xR6QMXNKJQMvHR245vwUGxlWRw/36ObM1D7QjCd/q+FonpBEY4m5Y6Uz1U0HR2Cbh0E2afVlPLeV+F0LKrlyVMdIaWBGWftCGIKDAHaG/PD66zbAKtxerv2fBIDq100WHPhd57BZxX+2aGJp1IaRDgkxV0E/CjEy3+Knd8xbAgUSW0Tl6OTC75exIvlbzeluEBe0wlapAb7WvBKYsipSW8G8Ey7tjoolDT4AU82EaKUPstiMnA=="],"x5t":"AlfHDI0FOPQpt3RBAILt0dtW1yw","x5t#S256":"a7bhm8-JsnfY7bL_m8Yl72hgmp5516VZlFcVloKzk08"}]}'
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/json;charset=UTF-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '2909'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Authorization:
+ - Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTY0NjExMDIsImlhdCI6MTcxNjQ2MDgwMiwiYXV0aF90aW1lIjoxNzE2NDYwODAyLCJqdGkiOiIxMWExMTQ5YS05YTVmLTQwMTAtOWM3My0wOTk2NWU4ZmU1MjciLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiYWExMGNmYzctMmM0ZC00MWY2LThmYWMtN2JmNDA1YzU3MmM0IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoidGVzdGlkIiwibm9uY2UiOiJub3QtYS1yYW5kb20tc3RyaW5nIiwic2Vzc2lvbl9zdGF0ZSI6IjEwOTFkOWMyLWJjY2UtNDQxMS1iNzIxLTdkNTUxMDI1ODg1NyIsImFjciI6IjAiLCJhbGxvd2VkLW9yaWdpbnMiOlsiaHR0cDovLzEyNy4wLjAuMTo4MDAwIl0sInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJkZWZhdWx0LXJvbGVzLXRlc3QiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgZW1haWwgcHJvZmlsZSBrdmsgYnNuIiwic2lkIjoiMTA5MWQ5YzItYmNjZS00NDExLWI3MjEtN2Q1NTEwMjU4ODU3Iiwia3ZrIjoiMDEyMzQ1Njc4IiwiZW1haWxfdmVyaWZpZWQiOmZhbHNlLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJ0ZXN0dXNlciIsImJzbiI6IjAwMDAwMDAwMCJ9.n7J_SNIHKnkH71MCKRXxLl-n1ezrHGBzkhRmxeNKiDiln21BdBJ9Jz-2PUXqbCce_Ekt-pxNPzV6toCKuHYfwoX6vgvh0djjooh4N0XO-lvx9MYHskfQInrr3Ij09Pv1EHma1RQDrYMB8bRjt8DU3xLXmlDsp3CGvm8DBk6-6t1zAR9ZKYFRDOQirGYUnpAXj-ItagBiKRxPsymLSMCCcRZqu-yea9gYk-7fMZVdqempfZ3WypRXSU-zCwg9ldREwRE5GHEQg8O-rZyC6uv9WQ6UEiKhqKeKhWlvUbnk3NGUF_qUsstOTNDA3_6565rKId9d5ji0WhvyT05DgmiHeA
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/userinfo
+ response:
+ body:
+ string: eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJzdWIiOiJhYTEwY2ZjNy0yYzRkLTQxZjYtOGZhYy03YmY0MDVjNTcyYzQiLCJrdmsiOiIwMTIzNDU2NzgiLCJhdWQiOiJ0ZXN0aWQiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9yZWFsbXMvdGVzdCIsInByZWZlcnJlZF91c2VybmFtZSI6InRlc3R1c2VyIiwiYnNuIjoiMDAwMDAwMDAwIn0.CKub7h5He-7acsX5pli41jZiatfM3eM-f5bl6M9GaSSVJLy-NHH5RDSIvpNu4K3PA5uO1nn2sfiDWvfBgsqPxvssiqcmkenf1RpgaEdn7fS_bRn1ziAkYFq5tVEICluPeYELR8FNt7XGVGPakhezPnUwsdaUOBWf7ELTgbxVdBBy3Nkjg2op456glHO4C84zjABNK5grWfLCDDEwKnw4o1gz-QWAS1TPa7yQaPOJr71zjFT-o3P7EBBkASN_CiELOpno3bBxIeTa631m9BHZ8dECiffp_GQhxMqPS9bTwqTlffc-EkIamZr_90uHs3Dw8gVySYL7YTGoGDeq6w6jEw
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/jwt
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '714'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/certs
+ response:
+ body:
+ string: '{"keys":[{"kid":"4UNQAcvUcv-DFUOx_4O1gt13OdJSotqEKPZurs2vQW8","kty":"RSA","alg":"RS256","use":"sig","n":"2DOZ0qHie73SuFVR7civrl6r82YUiAghfzaMowjCg0o06AF--2lIS7vNV_PbsVVznPAAMqVrNG-8CcevEzvVZMQD9nH4DI7xlOxK0lrYu8rmMeSfOvXVbBVsWBZe0jnGNukZqjwmRE5__ttJdxPfIBT5-2L6mguQbDfhSUEEdIW7y7UfOXvqLqEcBtoIEB-ORKDTUIQwGZM5mSCy-cY3cHvvZfZVgaUUy5NvujPRXTMje4n_hG0KfEV-40G9qC2_Xvx4EooJzBZ6FSThiWhCpwhIvzcQqB6M9lHW7nU6wADhYPNCa2OKWvphwZ_zbrF4B9dmS6Zli5rBvbox9Hh45w","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMLTANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANgzmdKh4nu90rhVUe3Ir65eq/NmFIgIIX82jKMIwoNKNOgBfvtpSEu7zVfz27FVc5zwADKlazRvvAnHrxM71WTEA/Zx+AyO8ZTsStJa2LvK5jHknzr11WwVbFgWXtI5xjbpGao8JkROf/7bSXcT3yAU+fti+poLkGw34UlBBHSFu8u1Hzl76i6hHAbaCBAfjkSg01CEMBmTOZkgsvnGN3B772X2VYGlFMuTb7oz0V0zI3uJ/4RtCnxFfuNBvagtv178eBKKCcwWehUk4YloQqcISL83EKgejPZR1u51OsAA4WDzQmtjilr6YcGf826xeAfXZkumZYuawb26MfR4eOcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAsnQG/Yi2g1XTCJn74hWv9MjxVAaZb4gBAc2AWm5VgAjhFEM9h6x6m1mQkq7JM4rIdAj8jw55Ok9CBVBIqq4G4cME3eUvVytkj2lC9zcRoAivjjZF2HPg7zNPa2TTR50asmHPRokppV6gewO/C+o5as+4P2zqDXBh61aRd/9kdQfkg14LBbH5/dYccAuvUqlTYC4IEPCvVmBNC1xsMjf0vohvoSjm9vL2bfqG/RJH0ScdCjOd5d2zju4/e2oVdluWm+vzKBQplc7tVMuKpn6LcLmVHiGNAl+EBIZH+WVLlTx0D1+kbHZsfLYG53lQg2LsvurRbWyF/a5fVM/oLTn5ag=="],"x5t":"H5xfs1pRtvX0HyVTskx7eTXx88U","x5t#S256":"XurVtKAIEyc4w9HCGOhnjoRHnYu4d9HCn_5YHmkScJg"},{"kid":"TV3Tl5jIY1nrJLSb53UKEubLR5gYiq9slq1SsDDg1HU","kty":"RSA","alg":"RSA-OAEP","use":"enc","n":"pNvU3ecpVHbJT4bCOEpw6cnV1yi65tB3I0bRF2ilLVOY944QRAGnjBBECPIzNbgqavghYp1j75F2nq6_ny1CYfoaxTV2iDpRUw8_f7sliYbl8FrLLat0S25ItlZrg5TEJHObvOqlG2_nXoeH36MRWwNhms2uCqfhn5VgtenIzpQIBolnM7zzGp21NvdJ1C_ZAUzkXC-l3oQ-BXTtpEVM4h2KpYh4gfZJWCbYij5d1e1YApKD6V61_Cs3Oa2OY7CAUyq5kgAWJZFDB6CpzIr226u3bV7F9RbrQu3Ybc_Lv33EwykscLznKWZY2Mbs3Iz_rFNv3sVX_vHpH4DHWlKu7Q","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMlzANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKTb1N3nKVR2yU+GwjhKcOnJ1dcouubQdyNG0RdopS1TmPeOEEQBp4wQRAjyMzW4Kmr4IWKdY++Rdp6uv58tQmH6GsU1dog6UVMPP3+7JYmG5fBayy2rdEtuSLZWa4OUxCRzm7zqpRtv516Hh9+jEVsDYZrNrgqn4Z+VYLXpyM6UCAaJZzO88xqdtTb3SdQv2QFM5Fwvpd6EPgV07aRFTOIdiqWIeIH2SVgm2Io+XdXtWAKSg+letfwrNzmtjmOwgFMquZIAFiWRQwegqcyK9turt21exfUW60Lt2G3Py799xMMpLHC85ylmWNjG7NyM/6xTb97FV/7x6R+Ax1pSru0CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAQGJHeTYSMvp0yndbIn7DLohO9lom5nRrx/bLyb7TiRfogyJEF6rQZ66CAkQFk5eMF878fsHTuMVjtmXVBnhojhVmK91HwjsNQu/8xR6QMXNKJQMvHR245vwUGxlWRw/36ObM1D7QjCd/q+FonpBEY4m5Y6Uz1U0HR2Cbh0E2afVlPLeV+F0LKrlyVMdIaWBGWftCGIKDAHaG/PD66zbAKtxerv2fBIDq100WHPhd57BZxX+2aGJp1IaRDgkxV0E/CjEy3+Knd8xbAgUSW0Tl6OTC75exIvlbzeluEBe0wlapAb7WvBKYsipSW8G8Ey7tjoolDT4AU82EaKUPstiMnA=="],"x5t":"AlfHDI0FOPQpt3RBAILt0dtW1yw","x5t#S256":"a7bhm8-JsnfY7bL_m8Yl72hgmp5516VZlFcVloKzk08"}]}'
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/json;charset=UTF-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '2909'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: id_token_hint=eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTY0NjExMDIsImlhdCI6MTcxNjQ2MDgwMiwiYXV0aF90aW1lIjoxNzE2NDYwODAyLCJqdGkiOiJjOTlmYWEzMi0wY2JkLTQ1MGEtOTg4Zi0xZjcxOTRmNTg1OTUiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJ0ZXN0aWQiLCJzdWIiOiJhYTEwY2ZjNy0yYzRkLTQxZjYtOGZhYy03YmY0MDVjNTcyYzQiLCJ0eXAiOiJJRCIsImF6cCI6InRlc3RpZCIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsInNlc3Npb25fc3RhdGUiOiIxMDkxZDljMi1iY2NlLTQ0MTEtYjcyMS03ZDU1MTAyNTg4NTciLCJhdF9oYXNoIjoiYlBEQ0lPcktfMDRTcDZsREdRUE8wUSIsImFjciI6IjAiLCJzaWQiOiIxMDkxZDljMi1iY2NlLTQ0MTEtYjcyMS03ZDU1MTAyNTg4NTciLCJrdmsiOiIwMTIzNDU2NzgiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsInByZWZlcnJlZF91c2VybmFtZSI6InRlc3R1c2VyIiwiYnNuIjoiMDAwMDAwMDAwIn0.gd-LkgxZsEOvVawJO-o8VpWGYLt5K00YVlJZjHlMBp1h-f8ErBTN1ijCkTWPEWbu7e8FN-UBBb02atxvdSBZNHNgwkawsyS0SVgKUzsRnH1fAOwsF4hlZDBVIJEmemWBMrf82qWYJ8FMA9sKL0aFUI9U5FaslwT8ywQMIIZYeymbbeIcFFID68-uVnhuJV2mB57BZgNsTc9iD3c70LZ8X0jfw63r_XLBYBvR11OMPRxsF0bwMtsdlxqrdrQemUYzrK6lBfZaPlBUuKMuIw7WBozgIq9G7VOGgreKr68lLDt0OAiaIQvt6v2R-1i2VSgywicc1M0oakVp1LBvCo31ug
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '1132'
+ Content-Type:
+ - application/x-www-form-urlencoded
+ User-Agent:
+ - python-requests/2.31.0
+ method: POST
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/logout
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n\n\n\n\n
+ \ \n
\n
+ \ \n
\n
+ \
\n\n\n
\n
+ \
You are logged out
\n
\n\n\n\n
+ \
\n
\n\n
\n
\n\n\n"
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Set-Cookie:
+ - AUTH_SESSION_ID=472c01fb-4bd5-433e-b225-11803819980e; Version=1; Path=/realms/test/;
+ SameSite=None; Secure; HttpOnly
+ - AUTH_SESSION_ID_LEGACY=472c01fb-4bd5-433e-b225-11803819980e; Version=1; Path=/realms/test/;
+ HttpOnly
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '1566'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n\n\n\n\n\n\n"
+ headers:
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '1573'
+ status:
+ code: 400
+ message: Bad Request
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ Cookie:
+ - AUTH_SESSION_ID_LEGACY=1091d9c2-bcce-4411-b721-7d5510258857; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJjaWQiOiJ0ZXN0aWQiLCJwdHkiOiJvcGVuaWQtY29ubmVjdCIsInJ1cmkiOiJodHRwOi8vdGVzdHNlcnZlci9kaWdpZC1vaWRjL2NhbGxiYWNrLyIsImFjdCI6IkFVVEhFTlRJQ0FURSIsIm5vdGVzIjp7InNjb3BlIjoib3BlbmlkIGJzbiIsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9yZWFsbXMvdGVzdCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwicmVkaXJlY3RfdXJpIjoiaHR0cDovL3Rlc3RzZXJ2ZXIvZGlnaWQtb2lkYy9jYWxsYmFjay8iLCJzdGF0ZSI6Im5vdC1hLXJhbmRvbS1zdHJpbmciLCJub25jZSI6Im5vdC1hLXJhbmRvbS1zdHJpbmcifX0.HScBoNNJvmVcGQXpymd_ftVGkGUJBQnuwqgk59VJnYI;
+ KEYCLOAK_IDENTITY_LEGACY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTY0OTY4MDIsImlhdCI6MTcxNjQ2MDgwMiwianRpIjoiYjcxZmFhNzQtOTI3Yy00MDQyLWFhOWUtMjU4NTc1ZjIyOGVhIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiYWExMGNmYzctMmM0ZC00MWY2LThmYWMtN2JmNDA1YzU3MmM0IiwidHlwIjoiU2VyaWFsaXplZC1JRCIsInNlc3Npb25fc3RhdGUiOiIxMDkxZDljMi1iY2NlLTQ0MTEtYjcyMS03ZDU1MTAyNTg4NTciLCJzaWQiOiIxMDkxZDljMi1iY2NlLTQ0MTEtYjcyMS03ZDU1MTAyNTg4NTciLCJzdGF0ZV9jaGVja2VyIjoiWm9QMEc0aDFlNmZkYUtiWTVqYXpsTE9PZ3hZYzJ6RXppNlVxMVByMmtwbyJ9.-ddPZrhtYlgeq1Ad8r7RXBPcZbNgn92EpCAS55FR0Jk;
+ KEYCLOAK_SESSION_LEGACY=test/aa10cfc7-2c4d-41f6-8fac-7bf405c572c4/1091d9c2-bcce-4411-b721-7d5510258857
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth?response_type=code&scope=openid+bsn&client_id=testid&redirect_uri=http%3A%2F%2Ftestserver%2Fdigid-oidc%2Fcallback%2F&state=not-a-random-string&nonce=not-a-random-string
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n \n\n\n\n\n
+ \ \n
\n
+ \ \n
\n
+ \
\n\n\n
\n \n\n\n\n\n\n
+ \
\n
\n\n
\n
\n\n\n"
+ headers:
+ Cache-Control:
+ - no-store, must-revalidate, max-age=0
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Set-Cookie:
+ - KEYCLOAK_IDENTITY=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test/; HttpOnly
+ - KEYCLOAK_IDENTITY_LEGACY=; Version=1; Comment=Expiring cookie; Expires=Thu,
+ 01-Jan-1970 00:00:10 GMT; Max-Age=0; Path=/realms/test/; HttpOnly
+ - KEYCLOAK_SESSION=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test/
+ - KEYCLOAK_SESSION_LEGACY=; Version=1; Comment=Expiring cookie; Expires=Thu,
+ 01-Jan-1970 00:00:10 GMT; Max-Age=0; Path=/realms/test/
+ - KEYCLOAK_IDENTITY=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test; HttpOnly
+ - KEYCLOAK_IDENTITY_LEGACY=; Version=1; Comment=Expiring cookie; Expires=Thu,
+ 01-Jan-1970 00:00:10 GMT; Max-Age=0; Path=/realms/test; HttpOnly
+ - KEYCLOAK_SESSION=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test
+ - KEYCLOAK_SESSION_LEGACY=; Version=1; Comment=Expiring cookie; Expires=Thu,
+ 01-Jan-1970 00:00:10 GMT; Max-Age=0; Path=/realms/test
+ - AUTH_SESSION_ID=c54b1176-9247-4ec7-a196-fe68c22b633c; Version=1; Path=/realms/test/;
+ SameSite=None; Secure; HttpOnly
+ - AUTH_SESSION_ID_LEGACY=c54b1176-9247-4ec7-a196-fe68c22b633c; Version=1; Path=/realms/test/;
+ HttpOnly
+ - KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJjaWQiOiJ0ZXN0aWQiLCJwdHkiOiJvcGVuaWQtY29ubmVjdCIsInJ1cmkiOiJodHRwOi8vdGVzdHNlcnZlci9kaWdpZC1vaWRjL2NhbGxiYWNrLyIsImFjdCI6IkFVVEhFTlRJQ0FURSIsIm5vdGVzIjp7InNjb3BlIjoib3BlbmlkIGJzbiIsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9yZWFsbXMvdGVzdCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwicmVkaXJlY3RfdXJpIjoiaHR0cDovL3Rlc3RzZXJ2ZXIvZGlnaWQtb2lkYy9jYWxsYmFjay8iLCJzdGF0ZSI6Im5vdC1hLXJhbmRvbS1zdHJpbmciLCJub25jZSI6Im5vdC1hLXJhbmRvbS1zdHJpbmcifX0.HScBoNNJvmVcGQXpymd_ftVGkGUJBQnuwqgk59VJnYI;
+ Version=1; Path=/realms/test/; HttpOnly
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '4466'
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/DigiDMachtigenCallbackTests/DigiDMachtigenCallbackTests.test_digid_error_reported_for_cancelled_login_anon_django_user.yaml b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/DigiDMachtigenCallbackTests/DigiDMachtigenCallbackTests.test_digid_error_reported_for_cancelled_login_anon_django_user.yaml
new file mode 100644
index 0000000000..2b86cf7a33
--- /dev/null
+++ b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/DigiDMachtigenCallbackTests/DigiDMachtigenCallbackTests.test_digid_error_reported_for_cancelled_login_anon_django_user.yaml
@@ -0,0 +1,91 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n\n\n\n\n\n\n"
+ headers:
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '1573'
+ status:
+ code: 400
+ message: Bad Request
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth?response_type=code&scope=badscope&client_id=testid&redirect_uri=http%3A%2F%2Ftestserver%2Fdigid-machtigen-oidc%2Fcallback%2F&state=not-a-random-string&nonce=not-a-random-string
+ response:
+ body:
+ string: ''
+ headers:
+ Location:
+ - http://testserver/digid-machtigen-oidc/callback/?error=invalid_scope&error_description=Invalid+scopes%3A+badscope&state=not-a-random-string&iss=http%3A%2F%2Flocalhost%3A8080%2Frealms%2Ftest
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '0'
+ status:
+ code: 302
+ message: Found
+version: 1
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/DigiDMachtigenCallbackTests/DigiDMachtigenCallbackTests.test_digid_error_reported_for_cancelled_login_with_staff_django_user.yaml b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/DigiDMachtigenCallbackTests/DigiDMachtigenCallbackTests.test_digid_error_reported_for_cancelled_login_with_staff_django_user.yaml
new file mode 100644
index 0000000000..2b86cf7a33
--- /dev/null
+++ b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/DigiDMachtigenCallbackTests/DigiDMachtigenCallbackTests.test_digid_error_reported_for_cancelled_login_with_staff_django_user.yaml
@@ -0,0 +1,91 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n\n\n\n\n\n\n"
+ headers:
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '1573'
+ status:
+ code: 400
+ message: Bad Request
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth?response_type=code&scope=badscope&client_id=testid&redirect_uri=http%3A%2F%2Ftestserver%2Fdigid-machtigen-oidc%2Fcallback%2F&state=not-a-random-string&nonce=not-a-random-string
+ response:
+ body:
+ string: ''
+ headers:
+ Location:
+ - http://testserver/digid-machtigen-oidc/callback/?error=invalid_scope&error_description=Invalid+scopes%3A+badscope&state=not-a-random-string&iss=http%3A%2F%2Flocalhost%3A8080%2Frealms%2Ftest
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '0'
+ status:
+ code: 302
+ message: Found
+version: 1
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/DigiDMachtigenCallbackTests/DigiDMachtigenCallbackTests.test_failing_claim_verification.yaml b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/DigiDMachtigenCallbackTests/DigiDMachtigenCallbackTests.test_failing_claim_verification.yaml
new file mode 100644
index 0000000000..d4b7b149ca
--- /dev/null
+++ b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/DigiDMachtigenCallbackTests/DigiDMachtigenCallbackTests.test_failing_claim_verification.yaml
@@ -0,0 +1,371 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n\n\n\n\n\n\n"
+ headers:
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '1573'
+ status:
+ code: 400
+ message: Bad Request
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth?response_type=code&scope=openid+bsn&client_id=testid&redirect_uri=http%3A%2F%2Ftestserver%2Fdigid-machtigen-oidc%2Fcallback%2F&state=not-a-random-string&nonce=not-a-random-string
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n \n\n\n\n\n
+ \ \n
\n
+ \ \n
\n
+ \
\n\n\n
\n \n\n\n\n\n\n
+ \
\n
\n\n
\n
\n\n\n"
+ headers:
+ Cache-Control:
+ - no-store, must-revalidate, max-age=0
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Set-Cookie:
+ - AUTH_SESSION_ID=c36a7a4e-36d6-42b0-af35-87a487b825df; Version=1; Path=/realms/test/;
+ SameSite=None; Secure; HttpOnly
+ - AUTH_SESSION_ID_LEGACY=c36a7a4e-36d6-42b0-af35-87a487b825df; Version=1; Path=/realms/test/;
+ HttpOnly
+ - KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJjaWQiOiJ0ZXN0aWQiLCJwdHkiOiJvcGVuaWQtY29ubmVjdCIsInJ1cmkiOiJodHRwOi8vdGVzdHNlcnZlci9kaWdpZC1tYWNodGlnZW4tb2lkYy9jYWxsYmFjay8iLCJhY3QiOiJBVVRIRU5USUNBVEUiLCJub3RlcyI6eyJzY29wZSI6Im9wZW5pZCBic24iLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJyZXNwb25zZV90eXBlIjoiY29kZSIsInJlZGlyZWN0X3VyaSI6Imh0dHA6Ly90ZXN0c2VydmVyL2RpZ2lkLW1hY2h0aWdlbi1vaWRjL2NhbGxiYWNrLyIsInN0YXRlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyJ9fQ.CzIO8PEo0TtC0JUUGrAD0K0eHnesrWyKb05cHrA4S4k;
+ Version=1; Path=/realms/test/; HttpOnly
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '4466'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: username=digid-machtigen&password=digid-machtigen&credentialId=&login=Sign+In
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '77'
+ Content-Type:
+ - application/x-www-form-urlencoded
+ Cookie:
+ - AUTH_SESSION_ID_LEGACY=c36a7a4e-36d6-42b0-af35-87a487b825df; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJjaWQiOiJ0ZXN0aWQiLCJwdHkiOiJvcGVuaWQtY29ubmVjdCIsInJ1cmkiOiJodHRwOi8vdGVzdHNlcnZlci9kaWdpZC1tYWNodGlnZW4tb2lkYy9jYWxsYmFjay8iLCJhY3QiOiJBVVRIRU5USUNBVEUiLCJub3RlcyI6eyJzY29wZSI6Im9wZW5pZCBic24iLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJyZXNwb25zZV90eXBlIjoiY29kZSIsInJlZGlyZWN0X3VyaSI6Imh0dHA6Ly90ZXN0c2VydmVyL2RpZ2lkLW1hY2h0aWdlbi1vaWRjL2NhbGxiYWNrLyIsInN0YXRlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyJ9fQ.CzIO8PEo0TtC0JUUGrAD0K0eHnesrWyKb05cHrA4S4k
+ User-Agent:
+ - python-requests/2.31.0
+ method: POST
+ uri: http://localhost:8080/realms/test/login-actions/authenticate?session_code=F25xxo0mG99QQNJwNaKK6MM07ElvgvzN8ohn0r81PwU&execution=d8b8778e-a545-45d4-8f72-fd69facf4b72&client_id=testid&tab_id=XD0LfW4IC8Q
+ response:
+ body:
+ string: ''
+ headers:
+ Cache-Control:
+ - no-store, must-revalidate, max-age=0
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Location:
+ - http://testserver/digid-machtigen-oidc/callback/?state=not-a-random-string&session_state=c36a7a4e-36d6-42b0-af35-87a487b825df&iss=http%3A%2F%2Flocalhost%3A8080%2Frealms%2Ftest&code=629ab4a2-6315-45b2-9a2f-decfdcca7703.c36a7a4e-36d6-42b0-af35-87a487b825df.adf4ad83-4550-4619-9231-73bd8d700f45
+ Referrer-Policy:
+ - no-referrer
+ Set-Cookie:
+ - KEYCLOAK_LOCALE=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test/; HttpOnly
+ - KC_RESTART=; Version=1; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0;
+ Path=/realms/test/; HttpOnly
+ - KC_AUTH_STATE=; Version=1; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0;
+ Path=/realms/test/
+ - KEYCLOAK_IDENTITY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTY0OTY4MDAsImlhdCI6MTcxNjQ2MDgwMCwianRpIjoiYjgzMTIxNWItMDkxNC00ODRkLTkzZmUtZmI5M2NjYzQwNjk2IiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiZWM1YTFmNzAtM2QxMC00OGE4LWExOGItMmQxM2M5MjVjZDkyIiwidHlwIjoiU2VyaWFsaXplZC1JRCIsInNlc3Npb25fc3RhdGUiOiJjMzZhN2E0ZS0zNmQ2LTQyYjAtYWYzNS04N2E0ODdiODI1ZGYiLCJzaWQiOiJjMzZhN2E0ZS0zNmQ2LTQyYjAtYWYzNS04N2E0ODdiODI1ZGYiLCJzdGF0ZV9jaGVja2VyIjoiZlFuaWhYMWNvaUxna3VLWmZVWEV2ZVd1NmcwNW1fMDN6eDhHME4tMnpTQSJ9.viTfeSTzPDofSn-dy4CqDDqgMNCabB1uq-lhdt0T9ws;
+ Version=1; Path=/realms/test/; SameSite=None; Secure; HttpOnly
+ - KEYCLOAK_IDENTITY_LEGACY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTY0OTY4MDAsImlhdCI6MTcxNjQ2MDgwMCwianRpIjoiYjgzMTIxNWItMDkxNC00ODRkLTkzZmUtZmI5M2NjYzQwNjk2IiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiZWM1YTFmNzAtM2QxMC00OGE4LWExOGItMmQxM2M5MjVjZDkyIiwidHlwIjoiU2VyaWFsaXplZC1JRCIsInNlc3Npb25fc3RhdGUiOiJjMzZhN2E0ZS0zNmQ2LTQyYjAtYWYzNS04N2E0ODdiODI1ZGYiLCJzaWQiOiJjMzZhN2E0ZS0zNmQ2LTQyYjAtYWYzNS04N2E0ODdiODI1ZGYiLCJzdGF0ZV9jaGVja2VyIjoiZlFuaWhYMWNvaUxna3VLWmZVWEV2ZVd1NmcwNW1fMDN6eDhHME4tMnpTQSJ9.viTfeSTzPDofSn-dy4CqDDqgMNCabB1uq-lhdt0T9ws;
+ Version=1; Path=/realms/test/; HttpOnly
+ - KEYCLOAK_SESSION=test/ec5a1f70-3d10-48a8-a18b-2d13c925cd92/c36a7a4e-36d6-42b0-af35-87a487b825df;
+ Version=1; Expires=Thu, 23-May-2024 20:40:00 GMT; Max-Age=36000; Path=/realms/test/;
+ SameSite=None; Secure
+ - KEYCLOAK_SESSION_LEGACY=test/ec5a1f70-3d10-48a8-a18b-2d13c925cd92/c36a7a4e-36d6-42b0-af35-87a487b825df;
+ Version=1; Expires=Thu, 23-May-2024 20:40:00 GMT; Max-Age=36000; Path=/realms/test/
+ - KEYCLOAK_REMEMBER_ME=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test/; HttpOnly
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '0'
+ status:
+ code: 302
+ message: Found
+- request:
+ body: client_id=testid&client_secret=7DB3KUAAizYCcmZufpHRVOcD0TOkNO3I&grant_type=authorization_code&code=629ab4a2-6315-45b2-9a2f-decfdcca7703.c36a7a4e-36d6-42b0-af35-87a487b825df.adf4ad83-4550-4619-9231-73bd8d700f45&redirect_uri=http%3A%2F%2Ftestserver%2Fdigid-machtigen-oidc%2Fcallback%2F
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '283'
+ Content-Type:
+ - application/x-www-form-urlencoded
+ User-Agent:
+ - python-requests/2.31.0
+ method: POST
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/token
+ response:
+ body:
+ string: '{"access_token":"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTY0NjExMDAsImlhdCI6MTcxNjQ2MDgwMCwiYXV0aF90aW1lIjoxNzE2NDYwODAwLCJqdGkiOiI1ZWY1ZDNhNS1kZTk0LTRlNDYtOTJhOS05NTlkMzE3YzcxMzQiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiZWM1YTFmNzAtM2QxMC00OGE4LWExOGItMmQxM2M5MjVjZDkyIiwidHlwIjoiQmVhcmVyIiwiYXpwIjoidGVzdGlkIiwibm9uY2UiOiJub3QtYS1yYW5kb20tc3RyaW5nIiwic2Vzc2lvbl9zdGF0ZSI6ImMzNmE3YTRlLTM2ZDYtNDJiMC1hZjM1LTg3YTQ4N2I4MjVkZiIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOlsiaHR0cDovLzEyNy4wLjAuMTo4MDAwIl0sInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJkZWZhdWx0LXJvbGVzLXRlc3QiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgZW1haWwgcHJvZmlsZSBrdmsgYnNuIiwic2lkIjoiYzM2YTdhNGUtMzZkNi00MmIwLWFmMzUtODdhNDg3YjgyNWRmIiwiZW1haWxfdmVyaWZpZWQiOmZhbHNlLCJnZW1hY2h0aWdkZS5ic24iOiI5OTk5OTk5OTkiLCJhYW52cmFnZXIuYnNuIjoiMDAwMDAwMDAwIiwicHJlZmVycmVkX3VzZXJuYW1lIjoiZGlnaWQtbWFjaHRpZ2VuIn0.W8Sb9nC6j-wMw7omQOjy28t4GhMnUVSczpoOLW8Bcd-4jWCJBYSGwGBWQ-Qdg7JP8N-OTdfRfEfbE9U6cPFvld74Rh-sdmNf-bqLpYzdYy1NWIBGnQs0SRLuCmXmk4CZEFKnYb1e4aaxnk5uqitpWbafZclPQ-T4cCJ25S3oL17RRzIU_3SWIJo9FeCJTG9WzCYf-MhmGu411RZ9sU08Zzo7eE0poLXlyiHndTlqCt9vSIpfeZ6PeFzNdUR_QVE3zZzPYAWRI21u2eliV_56ia6-Vfy2xqopZ5z3JABgT2oMgSdf_E5KGvnPfxbymLMGNmoBZIh6MF77g6Ue9r0yWg","expires_in":300,"refresh_expires_in":1800,"refresh_token":"eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTY0NjI2MDAsImlhdCI6MTcxNjQ2MDgwMCwianRpIjoiZWVmZGVlMGYtNDliMS00YzNhLThmMmQtYTY3NjdkNjNjMGM1IiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0IiwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiZWM1YTFmNzAtM2QxMC00OGE4LWExOGItMmQxM2M5MjVjZDkyIiwidHlwIjoiUmVmcmVzaCIsImF6cCI6InRlc3RpZCIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsInNlc3Npb25fc3RhdGUiOiJjMzZhN2E0ZS0zNmQ2LTQyYjAtYWYzNS04N2E0ODdiODI1ZGYiLCJzY29wZSI6Im9wZW5pZCBlbWFpbCBwcm9maWxlIGt2ayBic24iLCJzaWQiOiJjMzZhN2E0ZS0zNmQ2LTQyYjAtYWYzNS04N2E0ODdiODI1ZGYifQ.UmYlfwf-rKrW0Su6luARcWH0lxURiflsSFn-ZJA9IfE","token_type":"Bearer","id_token":"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTY0NjExMDAsImlhdCI6MTcxNjQ2MDgwMCwiYXV0aF90aW1lIjoxNzE2NDYwODAwLCJqdGkiOiIxMDk5NDc5Zi0zM2RhLTQ1ZjktOWJiMC1jNTMzYjZjODM5Y2YiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJ0ZXN0aWQiLCJzdWIiOiJlYzVhMWY3MC0zZDEwLTQ4YTgtYTE4Yi0yZDEzYzkyNWNkOTIiLCJ0eXAiOiJJRCIsImF6cCI6InRlc3RpZCIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsInNlc3Npb25fc3RhdGUiOiJjMzZhN2E0ZS0zNmQ2LTQyYjAtYWYzNS04N2E0ODdiODI1ZGYiLCJhdF9oYXNoIjoiNGtId1hjX0FSZFZsOExkTF91dzlKQSIsImFjciI6IjEiLCJzaWQiOiJjMzZhN2E0ZS0zNmQ2LTQyYjAtYWYzNS04N2E0ODdiODI1ZGYiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsImdlbWFjaHRpZ2RlLmJzbiI6Ijk5OTk5OTk5OSIsImFhbnZyYWdlci5ic24iOiIwMDAwMDAwMDAiLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJkaWdpZC1tYWNodGlnZW4ifQ.gCEPEYxAAs4GRIdI0ymx-mpt8jmu7B8nymTwkSJBSUYWHknuxn8OL2btJL1EoaF3EqGS6VSlzZ4Yw5lMAqxlm077GUyhSMt6yOhs0afm2NDPa688OlihOvkuuRURcpZzPQfeNvKQbJta-zSWzZz0pCvTv0o5ir7SJgohMGmwfYI0lt4m75UGX_tqdI_ojVzJT7TTMmq9VzvVWVCn032SLH_IeDxuhnyJcbDpk3gII0gRPEArp0ATFdDHvUFqD1uCpulj7NLZyflB42fcGh41JqDexbKLfg_4uT85RtKh1npIPW3_TtxsGaryJGH89tWLkXnMaVdM7uOu9VZ2wCv5Xg","not-before-policy":0,"session_state":"c36a7a4e-36d6-42b0-af35-87a487b825df","scope":"openid
+ email profile kvk bsn"}'
+ headers:
+ Cache-Control:
+ - no-store
+ Content-Type:
+ - application/json
+ Pragma:
+ - no-cache
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '3553'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/certs
+ response:
+ body:
+ string: '{"keys":[{"kid":"4UNQAcvUcv-DFUOx_4O1gt13OdJSotqEKPZurs2vQW8","kty":"RSA","alg":"RS256","use":"sig","n":"2DOZ0qHie73SuFVR7civrl6r82YUiAghfzaMowjCg0o06AF--2lIS7vNV_PbsVVznPAAMqVrNG-8CcevEzvVZMQD9nH4DI7xlOxK0lrYu8rmMeSfOvXVbBVsWBZe0jnGNukZqjwmRE5__ttJdxPfIBT5-2L6mguQbDfhSUEEdIW7y7UfOXvqLqEcBtoIEB-ORKDTUIQwGZM5mSCy-cY3cHvvZfZVgaUUy5NvujPRXTMje4n_hG0KfEV-40G9qC2_Xvx4EooJzBZ6FSThiWhCpwhIvzcQqB6M9lHW7nU6wADhYPNCa2OKWvphwZ_zbrF4B9dmS6Zli5rBvbox9Hh45w","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMLTANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANgzmdKh4nu90rhVUe3Ir65eq/NmFIgIIX82jKMIwoNKNOgBfvtpSEu7zVfz27FVc5zwADKlazRvvAnHrxM71WTEA/Zx+AyO8ZTsStJa2LvK5jHknzr11WwVbFgWXtI5xjbpGao8JkROf/7bSXcT3yAU+fti+poLkGw34UlBBHSFu8u1Hzl76i6hHAbaCBAfjkSg01CEMBmTOZkgsvnGN3B772X2VYGlFMuTb7oz0V0zI3uJ/4RtCnxFfuNBvagtv178eBKKCcwWehUk4YloQqcISL83EKgejPZR1u51OsAA4WDzQmtjilr6YcGf826xeAfXZkumZYuawb26MfR4eOcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAsnQG/Yi2g1XTCJn74hWv9MjxVAaZb4gBAc2AWm5VgAjhFEM9h6x6m1mQkq7JM4rIdAj8jw55Ok9CBVBIqq4G4cME3eUvVytkj2lC9zcRoAivjjZF2HPg7zNPa2TTR50asmHPRokppV6gewO/C+o5as+4P2zqDXBh61aRd/9kdQfkg14LBbH5/dYccAuvUqlTYC4IEPCvVmBNC1xsMjf0vohvoSjm9vL2bfqG/RJH0ScdCjOd5d2zju4/e2oVdluWm+vzKBQplc7tVMuKpn6LcLmVHiGNAl+EBIZH+WVLlTx0D1+kbHZsfLYG53lQg2LsvurRbWyF/a5fVM/oLTn5ag=="],"x5t":"H5xfs1pRtvX0HyVTskx7eTXx88U","x5t#S256":"XurVtKAIEyc4w9HCGOhnjoRHnYu4d9HCn_5YHmkScJg"},{"kid":"TV3Tl5jIY1nrJLSb53UKEubLR5gYiq9slq1SsDDg1HU","kty":"RSA","alg":"RSA-OAEP","use":"enc","n":"pNvU3ecpVHbJT4bCOEpw6cnV1yi65tB3I0bRF2ilLVOY944QRAGnjBBECPIzNbgqavghYp1j75F2nq6_ny1CYfoaxTV2iDpRUw8_f7sliYbl8FrLLat0S25ItlZrg5TEJHObvOqlG2_nXoeH36MRWwNhms2uCqfhn5VgtenIzpQIBolnM7zzGp21NvdJ1C_ZAUzkXC-l3oQ-BXTtpEVM4h2KpYh4gfZJWCbYij5d1e1YApKD6V61_Cs3Oa2OY7CAUyq5kgAWJZFDB6CpzIr226u3bV7F9RbrQu3Ybc_Lv33EwykscLznKWZY2Mbs3Iz_rFNv3sVX_vHpH4DHWlKu7Q","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMlzANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKTb1N3nKVR2yU+GwjhKcOnJ1dcouubQdyNG0RdopS1TmPeOEEQBp4wQRAjyMzW4Kmr4IWKdY++Rdp6uv58tQmH6GsU1dog6UVMPP3+7JYmG5fBayy2rdEtuSLZWa4OUxCRzm7zqpRtv516Hh9+jEVsDYZrNrgqn4Z+VYLXpyM6UCAaJZzO88xqdtTb3SdQv2QFM5Fwvpd6EPgV07aRFTOIdiqWIeIH2SVgm2Io+XdXtWAKSg+letfwrNzmtjmOwgFMquZIAFiWRQwegqcyK9turt21exfUW60Lt2G3Py799xMMpLHC85ylmWNjG7NyM/6xTb97FV/7x6R+Ax1pSru0CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAQGJHeTYSMvp0yndbIn7DLohO9lom5nRrx/bLyb7TiRfogyJEF6rQZ66CAkQFk5eMF878fsHTuMVjtmXVBnhojhVmK91HwjsNQu/8xR6QMXNKJQMvHR245vwUGxlWRw/36ObM1D7QjCd/q+FonpBEY4m5Y6Uz1U0HR2Cbh0E2afVlPLeV+F0LKrlyVMdIaWBGWftCGIKDAHaG/PD66zbAKtxerv2fBIDq100WHPhd57BZxX+2aGJp1IaRDgkxV0E/CjEy3+Knd8xbAgUSW0Tl6OTC75exIvlbzeluEBe0wlapAb7WvBKYsipSW8G8Ey7tjoolDT4AU82EaKUPstiMnA=="],"x5t":"AlfHDI0FOPQpt3RBAILt0dtW1yw","x5t#S256":"a7bhm8-JsnfY7bL_m8Yl72hgmp5516VZlFcVloKzk08"}]}'
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/json;charset=UTF-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '2909'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Authorization:
+ - Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTY0NjExMDAsImlhdCI6MTcxNjQ2MDgwMCwiYXV0aF90aW1lIjoxNzE2NDYwODAwLCJqdGkiOiI1ZWY1ZDNhNS1kZTk0LTRlNDYtOTJhOS05NTlkMzE3YzcxMzQiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiZWM1YTFmNzAtM2QxMC00OGE4LWExOGItMmQxM2M5MjVjZDkyIiwidHlwIjoiQmVhcmVyIiwiYXpwIjoidGVzdGlkIiwibm9uY2UiOiJub3QtYS1yYW5kb20tc3RyaW5nIiwic2Vzc2lvbl9zdGF0ZSI6ImMzNmE3YTRlLTM2ZDYtNDJiMC1hZjM1LTg3YTQ4N2I4MjVkZiIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOlsiaHR0cDovLzEyNy4wLjAuMTo4MDAwIl0sInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJkZWZhdWx0LXJvbGVzLXRlc3QiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgZW1haWwgcHJvZmlsZSBrdmsgYnNuIiwic2lkIjoiYzM2YTdhNGUtMzZkNi00MmIwLWFmMzUtODdhNDg3YjgyNWRmIiwiZW1haWxfdmVyaWZpZWQiOmZhbHNlLCJnZW1hY2h0aWdkZS5ic24iOiI5OTk5OTk5OTkiLCJhYW52cmFnZXIuYnNuIjoiMDAwMDAwMDAwIiwicHJlZmVycmVkX3VzZXJuYW1lIjoiZGlnaWQtbWFjaHRpZ2VuIn0.W8Sb9nC6j-wMw7omQOjy28t4GhMnUVSczpoOLW8Bcd-4jWCJBYSGwGBWQ-Qdg7JP8N-OTdfRfEfbE9U6cPFvld74Rh-sdmNf-bqLpYzdYy1NWIBGnQs0SRLuCmXmk4CZEFKnYb1e4aaxnk5uqitpWbafZclPQ-T4cCJ25S3oL17RRzIU_3SWIJo9FeCJTG9WzCYf-MhmGu411RZ9sU08Zzo7eE0poLXlyiHndTlqCt9vSIpfeZ6PeFzNdUR_QVE3zZzPYAWRI21u2eliV_56ia6-Vfy2xqopZ5z3JABgT2oMgSdf_E5KGvnPfxbymLMGNmoBZIh6MF77g6Ue9r0yWg
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/userinfo
+ response:
+ body:
+ string: eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJzdWIiOiJlYzVhMWY3MC0zZDEwLTQ4YTgtYTE4Yi0yZDEzYzkyNWNkOTIiLCJhdWQiOiJ0ZXN0aWQiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9yZWFsbXMvdGVzdCIsImdlbWFjaHRpZ2RlLmJzbiI6Ijk5OTk5OTk5OSIsImFhbnZyYWdlci5ic24iOiIwMDAwMDAwMDAiLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJkaWdpZC1tYWNodGlnZW4ifQ.o49__EZYqQIn8ctrG7GKzzNx1fxyOQHbpxnIeT-swLVZNgP04xGwI-hcycw1Okb6CuRUjzsrXzI1gLzmUE2pFcpIbCkKBJuoeShH1rgiRXezcUDo8b0vDMyBrHwjrv3E8bCOJ8yI5bR4qBXR6uZDyY9ZrZLoWYyYz4f1ws6TNa3FBtVvx6j171tw14_V85jlLICOwTPFYqyQ8884n2-s4blRyVQgIl1X9fbziOsRRshsbwnh3Ldct-8wrW218Bnw_HKklxfoDj13w6xm39U0JLWb3wz9rLmfRPAuGffHEIePigCTy0NmObKWNqN7MyI2mEJf9h8cIRqgV4zVXYn_YQ
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/jwt
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '753'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/certs
+ response:
+ body:
+ string: '{"keys":[{"kid":"4UNQAcvUcv-DFUOx_4O1gt13OdJSotqEKPZurs2vQW8","kty":"RSA","alg":"RS256","use":"sig","n":"2DOZ0qHie73SuFVR7civrl6r82YUiAghfzaMowjCg0o06AF--2lIS7vNV_PbsVVznPAAMqVrNG-8CcevEzvVZMQD9nH4DI7xlOxK0lrYu8rmMeSfOvXVbBVsWBZe0jnGNukZqjwmRE5__ttJdxPfIBT5-2L6mguQbDfhSUEEdIW7y7UfOXvqLqEcBtoIEB-ORKDTUIQwGZM5mSCy-cY3cHvvZfZVgaUUy5NvujPRXTMje4n_hG0KfEV-40G9qC2_Xvx4EooJzBZ6FSThiWhCpwhIvzcQqB6M9lHW7nU6wADhYPNCa2OKWvphwZ_zbrF4B9dmS6Zli5rBvbox9Hh45w","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMLTANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANgzmdKh4nu90rhVUe3Ir65eq/NmFIgIIX82jKMIwoNKNOgBfvtpSEu7zVfz27FVc5zwADKlazRvvAnHrxM71WTEA/Zx+AyO8ZTsStJa2LvK5jHknzr11WwVbFgWXtI5xjbpGao8JkROf/7bSXcT3yAU+fti+poLkGw34UlBBHSFu8u1Hzl76i6hHAbaCBAfjkSg01CEMBmTOZkgsvnGN3B772X2VYGlFMuTb7oz0V0zI3uJ/4RtCnxFfuNBvagtv178eBKKCcwWehUk4YloQqcISL83EKgejPZR1u51OsAA4WDzQmtjilr6YcGf826xeAfXZkumZYuawb26MfR4eOcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAsnQG/Yi2g1XTCJn74hWv9MjxVAaZb4gBAc2AWm5VgAjhFEM9h6x6m1mQkq7JM4rIdAj8jw55Ok9CBVBIqq4G4cME3eUvVytkj2lC9zcRoAivjjZF2HPg7zNPa2TTR50asmHPRokppV6gewO/C+o5as+4P2zqDXBh61aRd/9kdQfkg14LBbH5/dYccAuvUqlTYC4IEPCvVmBNC1xsMjf0vohvoSjm9vL2bfqG/RJH0ScdCjOd5d2zju4/e2oVdluWm+vzKBQplc7tVMuKpn6LcLmVHiGNAl+EBIZH+WVLlTx0D1+kbHZsfLYG53lQg2LsvurRbWyF/a5fVM/oLTn5ag=="],"x5t":"H5xfs1pRtvX0HyVTskx7eTXx88U","x5t#S256":"XurVtKAIEyc4w9HCGOhnjoRHnYu4d9HCn_5YHmkScJg"},{"kid":"TV3Tl5jIY1nrJLSb53UKEubLR5gYiq9slq1SsDDg1HU","kty":"RSA","alg":"RSA-OAEP","use":"enc","n":"pNvU3ecpVHbJT4bCOEpw6cnV1yi65tB3I0bRF2ilLVOY944QRAGnjBBECPIzNbgqavghYp1j75F2nq6_ny1CYfoaxTV2iDpRUw8_f7sliYbl8FrLLat0S25ItlZrg5TEJHObvOqlG2_nXoeH36MRWwNhms2uCqfhn5VgtenIzpQIBolnM7zzGp21NvdJ1C_ZAUzkXC-l3oQ-BXTtpEVM4h2KpYh4gfZJWCbYij5d1e1YApKD6V61_Cs3Oa2OY7CAUyq5kgAWJZFDB6CpzIr226u3bV7F9RbrQu3Ybc_Lv33EwykscLznKWZY2Mbs3Iz_rFNv3sVX_vHpH4DHWlKu7Q","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMlzANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKTb1N3nKVR2yU+GwjhKcOnJ1dcouubQdyNG0RdopS1TmPeOEEQBp4wQRAjyMzW4Kmr4IWKdY++Rdp6uv58tQmH6GsU1dog6UVMPP3+7JYmG5fBayy2rdEtuSLZWa4OUxCRzm7zqpRtv516Hh9+jEVsDYZrNrgqn4Z+VYLXpyM6UCAaJZzO88xqdtTb3SdQv2QFM5Fwvpd6EPgV07aRFTOIdiqWIeIH2SVgm2Io+XdXtWAKSg+letfwrNzmtjmOwgFMquZIAFiWRQwegqcyK9turt21exfUW60Lt2G3Py799xMMpLHC85ylmWNjG7NyM/6xTb97FV/7x6R+Ax1pSru0CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAQGJHeTYSMvp0yndbIn7DLohO9lom5nRrx/bLyb7TiRfogyJEF6rQZ66CAkQFk5eMF878fsHTuMVjtmXVBnhojhVmK91HwjsNQu/8xR6QMXNKJQMvHR245vwUGxlWRw/36ObM1D7QjCd/q+FonpBEY4m5Y6Uz1U0HR2Cbh0E2afVlPLeV+F0LKrlyVMdIaWBGWftCGIKDAHaG/PD66zbAKtxerv2fBIDq100WHPhd57BZxX+2aGJp1IaRDgkxV0E/CjEy3+Knd8xbAgUSW0Tl6OTC75exIvlbzeluEBe0wlapAb7WvBKYsipSW8G8Ey7tjoolDT4AU82EaKUPstiMnA=="],"x5t":"AlfHDI0FOPQpt3RBAILt0dtW1yw","x5t#S256":"a7bhm8-JsnfY7bL_m8Yl72hgmp5516VZlFcVloKzk08"}]}'
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/json;charset=UTF-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '2909'
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/DigiDMachtigenCallbackTests/DigiDMachtigenCallbackTests.test_redirects_after_successful_auth.yaml b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/DigiDMachtigenCallbackTests/DigiDMachtigenCallbackTests.test_redirects_after_successful_auth.yaml
new file mode 100644
index 0000000000..800a32a787
--- /dev/null
+++ b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/DigiDMachtigenCallbackTests/DigiDMachtigenCallbackTests.test_redirects_after_successful_auth.yaml
@@ -0,0 +1,371 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.32.2
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n\n\n\n\n\n\n"
+ headers:
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '1573'
+ status:
+ code: 400
+ message: Bad Request
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.32.2
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth?response_type=code&scope=openid+bsn&client_id=testid&redirect_uri=http%3A%2F%2Ftestserver%2Fdigid-machtigen-oidc%2Fcallback%2F&state=not-a-random-string&nonce=not-a-random-string
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n \n\n\n\n\n
+ \ \n
\n
+ \ \n
\n
+ \
\n\n\n
\n \n\n\n\n\n\n
+ \
\n
\n\n
\n
\n\n\n"
+ headers:
+ Cache-Control:
+ - no-store, must-revalidate, max-age=0
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Set-Cookie:
+ - AUTH_SESSION_ID=8f3e71c1-4fcb-4660-8b90-d178424cebb5; Version=1; Path=/realms/test/;
+ SameSite=None; Secure; HttpOnly
+ - AUTH_SESSION_ID_LEGACY=8f3e71c1-4fcb-4660-8b90-d178424cebb5; Version=1; Path=/realms/test/;
+ HttpOnly
+ - KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJjaWQiOiJ0ZXN0aWQiLCJwdHkiOiJvcGVuaWQtY29ubmVjdCIsInJ1cmkiOiJodHRwOi8vdGVzdHNlcnZlci9kaWdpZC1tYWNodGlnZW4tb2lkYy9jYWxsYmFjay8iLCJhY3QiOiJBVVRIRU5USUNBVEUiLCJub3RlcyI6eyJzY29wZSI6Im9wZW5pZCBic24iLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJyZXNwb25zZV90eXBlIjoiY29kZSIsInJlZGlyZWN0X3VyaSI6Imh0dHA6Ly90ZXN0c2VydmVyL2RpZ2lkLW1hY2h0aWdlbi1vaWRjL2NhbGxiYWNrLyIsInN0YXRlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyJ9fQ.CzIO8PEo0TtC0JUUGrAD0K0eHnesrWyKb05cHrA4S4k;
+ Version=1; Path=/realms/test/; HttpOnly
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '4466'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: username=digid-machtigen&password=digid-machtigen&credentialId=&login=Sign+In
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '77'
+ Content-Type:
+ - application/x-www-form-urlencoded
+ Cookie:
+ - AUTH_SESSION_ID_LEGACY=8f3e71c1-4fcb-4660-8b90-d178424cebb5; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJjaWQiOiJ0ZXN0aWQiLCJwdHkiOiJvcGVuaWQtY29ubmVjdCIsInJ1cmkiOiJodHRwOi8vdGVzdHNlcnZlci9kaWdpZC1tYWNodGlnZW4tb2lkYy9jYWxsYmFjay8iLCJhY3QiOiJBVVRIRU5USUNBVEUiLCJub3RlcyI6eyJzY29wZSI6Im9wZW5pZCBic24iLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJyZXNwb25zZV90eXBlIjoiY29kZSIsInJlZGlyZWN0X3VyaSI6Imh0dHA6Ly90ZXN0c2VydmVyL2RpZ2lkLW1hY2h0aWdlbi1vaWRjL2NhbGxiYWNrLyIsInN0YXRlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyJ9fQ.CzIO8PEo0TtC0JUUGrAD0K0eHnesrWyKb05cHrA4S4k
+ User-Agent:
+ - python-requests/2.32.2
+ method: POST
+ uri: http://localhost:8080/realms/test/login-actions/authenticate?session_code=6CMvQ6zDcHRkQqbwqom5M7cyjlBFNUQj29VLQ2PKwqo&execution=d8b8778e-a545-45d4-8f72-fd69facf4b72&client_id=testid&tab_id=dEaqEGOtJ7c
+ response:
+ body:
+ string: ''
+ headers:
+ Cache-Control:
+ - no-store, must-revalidate, max-age=0
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Location:
+ - http://testserver/digid-machtigen-oidc/callback/?state=not-a-random-string&session_state=8f3e71c1-4fcb-4660-8b90-d178424cebb5&iss=http%3A%2F%2Flocalhost%3A8080%2Frealms%2Ftest&code=13ee42f0-cb33-4ce2-a1e0-2ef27746c7c0.8f3e71c1-4fcb-4660-8b90-d178424cebb5.adf4ad83-4550-4619-9231-73bd8d700f45
+ Referrer-Policy:
+ - no-referrer
+ Set-Cookie:
+ - KEYCLOAK_LOCALE=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test/; HttpOnly
+ - KC_RESTART=; Version=1; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0;
+ Path=/realms/test/; HttpOnly
+ - KC_AUTH_STATE=; Version=1; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0;
+ Path=/realms/test/
+ - KEYCLOAK_IDENTITY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTgyMzMzOTIsImlhdCI6MTcxODE5NzM5MiwianRpIjoiNzc2OTY5MDUtM2M2NS00ZjhkLTlmN2QtYTcxOTFhZWQ1MzkyIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiZWM1YTFmNzAtM2QxMC00OGE4LWExOGItMmQxM2M5MjVjZDkyIiwidHlwIjoiU2VyaWFsaXplZC1JRCIsInNlc3Npb25fc3RhdGUiOiI4ZjNlNzFjMS00ZmNiLTQ2NjAtOGI5MC1kMTc4NDI0Y2ViYjUiLCJzaWQiOiI4ZjNlNzFjMS00ZmNiLTQ2NjAtOGI5MC1kMTc4NDI0Y2ViYjUiLCJzdGF0ZV9jaGVja2VyIjoibWdxdE1hbG9kbzF4UzQ1QkNURHNvTDFkMHktdWVGSG5pSmhjdnJGUVdwZyJ9.TuFh8PHlxLKBcZXvYoW70DwyjI9gQiD7hFBbWwQ2leU;
+ Version=1; Path=/realms/test/; SameSite=None; Secure; HttpOnly
+ - KEYCLOAK_IDENTITY_LEGACY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTgyMzMzOTIsImlhdCI6MTcxODE5NzM5MiwianRpIjoiNzc2OTY5MDUtM2M2NS00ZjhkLTlmN2QtYTcxOTFhZWQ1MzkyIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiZWM1YTFmNzAtM2QxMC00OGE4LWExOGItMmQxM2M5MjVjZDkyIiwidHlwIjoiU2VyaWFsaXplZC1JRCIsInNlc3Npb25fc3RhdGUiOiI4ZjNlNzFjMS00ZmNiLTQ2NjAtOGI5MC1kMTc4NDI0Y2ViYjUiLCJzaWQiOiI4ZjNlNzFjMS00ZmNiLTQ2NjAtOGI5MC1kMTc4NDI0Y2ViYjUiLCJzdGF0ZV9jaGVja2VyIjoibWdxdE1hbG9kbzF4UzQ1QkNURHNvTDFkMHktdWVGSG5pSmhjdnJGUVdwZyJ9.TuFh8PHlxLKBcZXvYoW70DwyjI9gQiD7hFBbWwQ2leU;
+ Version=1; Path=/realms/test/; HttpOnly
+ - KEYCLOAK_SESSION=test/ec5a1f70-3d10-48a8-a18b-2d13c925cd92/8f3e71c1-4fcb-4660-8b90-d178424cebb5;
+ Version=1; Expires=Wed, 12-Jun-2024 23:03:12 GMT; Max-Age=36000; Path=/realms/test/;
+ SameSite=None; Secure
+ - KEYCLOAK_SESSION_LEGACY=test/ec5a1f70-3d10-48a8-a18b-2d13c925cd92/8f3e71c1-4fcb-4660-8b90-d178424cebb5;
+ Version=1; Expires=Wed, 12-Jun-2024 23:03:12 GMT; Max-Age=36000; Path=/realms/test/
+ - KEYCLOAK_REMEMBER_ME=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test/; HttpOnly
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '0'
+ status:
+ code: 302
+ message: Found
+- request:
+ body: client_id=testid&client_secret=7DB3KUAAizYCcmZufpHRVOcD0TOkNO3I&grant_type=authorization_code&code=13ee42f0-cb33-4ce2-a1e0-2ef27746c7c0.8f3e71c1-4fcb-4660-8b90-d178424cebb5.adf4ad83-4550-4619-9231-73bd8d700f45&redirect_uri=http%3A%2F%2Ftestserver%2Fdigid-machtigen-oidc%2Fcallback%2F
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '283'
+ Content-Type:
+ - application/x-www-form-urlencoded
+ User-Agent:
+ - python-requests/2.32.2
+ method: POST
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/token
+ response:
+ body:
+ string: '{"access_token":"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTgxOTc2OTIsImlhdCI6MTcxODE5NzM5MiwiYXV0aF90aW1lIjoxNzE4MTk3MzkyLCJqdGkiOiIyMjg3YWNkMy1mOGI5LTRkOGEtYjBlOS05YThkYmU5ZmEyZWQiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiZWM1YTFmNzAtM2QxMC00OGE4LWExOGItMmQxM2M5MjVjZDkyIiwidHlwIjoiQmVhcmVyIiwiYXpwIjoidGVzdGlkIiwibm9uY2UiOiJub3QtYS1yYW5kb20tc3RyaW5nIiwic2Vzc2lvbl9zdGF0ZSI6IjhmM2U3MWMxLTRmY2ItNDY2MC04YjkwLWQxNzg0MjRjZWJiNSIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOlsiaHR0cDovLzEyNy4wLjAuMTo4MDAwIl0sInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJkZWZhdWx0LXJvbGVzLXRlc3QiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgZW1haWwgcHJvZmlsZSBrdmsgZ3JvdXBzIGJzbiIsInNpZCI6IjhmM2U3MWMxLTRmY2ItNDY2MC04YjkwLWQxNzg0MjRjZWJiNSIsImVtYWlsX3ZlcmlmaWVkIjpmYWxzZSwic2VydmljZV9pZCI6ImIxOGRkNzNmLTNkY2EtNGI2Ny1hNGZiLTA2Y2I0ZWJiZTJlYiIsImdlbWFjaHRpZ2RlLmJzbiI6Ijk5OTk5OTk5OSIsImdyb3VwcyI6WyJkZWZhdWx0LXJvbGVzLXRlc3QiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl0sImFhbnZyYWdlci5ic24iOiIwMDAwMDAwMDAiLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJkaWdpZC1tYWNodGlnZW4ifQ.NtRFCj5l1Dx5EMaioY6WStp2-UDmEv3gYJFnoPT_KVRifI6luWWOvxlBkJUe_FxsO5tLi80kwSUZ74TKPkMTeA6ql0TAZDKznn6UlwR1fyl4ILtSSwzBFSgE8fhAugnho8hriLxHS288DSCLbnebzCUhacypOJW1LSXqnO8KPfoShG2wJZjxlOfdmaZiWI2-ruvswzA-qDPxYkqR5qEp-ns8zKUY1KL5g_Xc_8zKiiVksR9LISe6B7UKie3CgXnrwxyxPjjYanQAHBbuB5UfExCfTl37lg3uO6ypKcXF2HTkKYxxYaYLhgKTcdqzSSjrwAWC-QsHqGhIXL-lA08IiA","expires_in":300,"refresh_expires_in":1800,"refresh_token":"eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTgxOTkxOTIsImlhdCI6MTcxODE5NzM5MiwianRpIjoiMTM2MmY0NjYtNjg2ZC00YmEwLTk4NGYtNzE4MDA3MmIxNDI2IiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0IiwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiZWM1YTFmNzAtM2QxMC00OGE4LWExOGItMmQxM2M5MjVjZDkyIiwidHlwIjoiUmVmcmVzaCIsImF6cCI6InRlc3RpZCIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsInNlc3Npb25fc3RhdGUiOiI4ZjNlNzFjMS00ZmNiLTQ2NjAtOGI5MC1kMTc4NDI0Y2ViYjUiLCJzY29wZSI6Im9wZW5pZCBlbWFpbCBwcm9maWxlIGt2ayBncm91cHMgYnNuIiwic2lkIjoiOGYzZTcxYzEtNGZjYi00NjYwLThiOTAtZDE3ODQyNGNlYmI1In0.a-mNtQ8M9vn6pan33p24XFZjdQeVGOxRigi-L6o3K7c","token_type":"Bearer","id_token":"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTgxOTc2OTIsImlhdCI6MTcxODE5NzM5MiwiYXV0aF90aW1lIjoxNzE4MTk3MzkyLCJqdGkiOiJhMmZmYWI1Yy1jYWFhLTQxNDUtYjU3Mi04NTdlZGQxODgwMDciLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJ0ZXN0aWQiLCJzdWIiOiJlYzVhMWY3MC0zZDEwLTQ4YTgtYTE4Yi0yZDEzYzkyNWNkOTIiLCJ0eXAiOiJJRCIsImF6cCI6InRlc3RpZCIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsInNlc3Npb25fc3RhdGUiOiI4ZjNlNzFjMS00ZmNiLTQ2NjAtOGI5MC1kMTc4NDI0Y2ViYjUiLCJhdF9oYXNoIjoiRDlpckd4eGF2ekExd3ZFZnNSeVZidyIsImFjciI6IjEiLCJzaWQiOiI4ZjNlNzFjMS00ZmNiLTQ2NjAtOGI5MC1kMTc4NDI0Y2ViYjUiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsInNlcnZpY2VfaWQiOiJiMThkZDczZi0zZGNhLTRiNjctYTRmYi0wNmNiNGViYmUyZWIiLCJnZW1hY2h0aWdkZS5ic24iOiI5OTk5OTk5OTkiLCJncm91cHMiOlsiZGVmYXVsdC1yb2xlcy10ZXN0Iiwib2ZmbGluZV9hY2Nlc3MiLCJ1bWFfYXV0aG9yaXphdGlvbiJdLCJhYW52cmFnZXIuYnNuIjoiMDAwMDAwMDAwIiwicHJlZmVycmVkX3VzZXJuYW1lIjoiZGlnaWQtbWFjaHRpZ2VuIn0.pkeNAzhUvqteF-mZka8NHpXd7TMnWmsnbLXzx4T6WEYSQhcDw4bTKGPGscfWjqo2RoiLPPX0R0B4Zcfv6J2LhaDPeYl2Whw_tpiVpNkspFFSLuBVx8J2LeirQtXrxOwk4Hx1sgYFusD7XpWNOYKlSuoIlMeTjPsDqa_ulrbeBmCvwdK0Au_x4izYVKPSjf7hu9QvCueo2owAJ0zrkNzOZpuSGNCyaRyjqDm2hUKcxnRSMHrYD61i8gmMH6Hw4jVT6ss80WZJ5OmQBna5YrNrHEgD9e5Dg3110O_nP1uGrWf-dZvByezuBVIfnYDEHJiTbtkkkE9wR5MwESruB5at_Q","not-before-policy":0,"session_state":"8f3e71c1-4fcb-4660-8b90-d178424cebb5","scope":"openid
+ email profile kvk groups bsn"}'
+ headers:
+ Cache-Control:
+ - no-store
+ Content-Type:
+ - application/json
+ Pragma:
+ - no-cache
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '3901'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.32.2
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/certs
+ response:
+ body:
+ string: '{"keys":[{"kid":"4UNQAcvUcv-DFUOx_4O1gt13OdJSotqEKPZurs2vQW8","kty":"RSA","alg":"RS256","use":"sig","n":"2DOZ0qHie73SuFVR7civrl6r82YUiAghfzaMowjCg0o06AF--2lIS7vNV_PbsVVznPAAMqVrNG-8CcevEzvVZMQD9nH4DI7xlOxK0lrYu8rmMeSfOvXVbBVsWBZe0jnGNukZqjwmRE5__ttJdxPfIBT5-2L6mguQbDfhSUEEdIW7y7UfOXvqLqEcBtoIEB-ORKDTUIQwGZM5mSCy-cY3cHvvZfZVgaUUy5NvujPRXTMje4n_hG0KfEV-40G9qC2_Xvx4EooJzBZ6FSThiWhCpwhIvzcQqB6M9lHW7nU6wADhYPNCa2OKWvphwZ_zbrF4B9dmS6Zli5rBvbox9Hh45w","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMLTANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANgzmdKh4nu90rhVUe3Ir65eq/NmFIgIIX82jKMIwoNKNOgBfvtpSEu7zVfz27FVc5zwADKlazRvvAnHrxM71WTEA/Zx+AyO8ZTsStJa2LvK5jHknzr11WwVbFgWXtI5xjbpGao8JkROf/7bSXcT3yAU+fti+poLkGw34UlBBHSFu8u1Hzl76i6hHAbaCBAfjkSg01CEMBmTOZkgsvnGN3B772X2VYGlFMuTb7oz0V0zI3uJ/4RtCnxFfuNBvagtv178eBKKCcwWehUk4YloQqcISL83EKgejPZR1u51OsAA4WDzQmtjilr6YcGf826xeAfXZkumZYuawb26MfR4eOcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAsnQG/Yi2g1XTCJn74hWv9MjxVAaZb4gBAc2AWm5VgAjhFEM9h6x6m1mQkq7JM4rIdAj8jw55Ok9CBVBIqq4G4cME3eUvVytkj2lC9zcRoAivjjZF2HPg7zNPa2TTR50asmHPRokppV6gewO/C+o5as+4P2zqDXBh61aRd/9kdQfkg14LBbH5/dYccAuvUqlTYC4IEPCvVmBNC1xsMjf0vohvoSjm9vL2bfqG/RJH0ScdCjOd5d2zju4/e2oVdluWm+vzKBQplc7tVMuKpn6LcLmVHiGNAl+EBIZH+WVLlTx0D1+kbHZsfLYG53lQg2LsvurRbWyF/a5fVM/oLTn5ag=="],"x5t":"H5xfs1pRtvX0HyVTskx7eTXx88U","x5t#S256":"XurVtKAIEyc4w9HCGOhnjoRHnYu4d9HCn_5YHmkScJg"},{"kid":"TV3Tl5jIY1nrJLSb53UKEubLR5gYiq9slq1SsDDg1HU","kty":"RSA","alg":"RSA-OAEP","use":"enc","n":"pNvU3ecpVHbJT4bCOEpw6cnV1yi65tB3I0bRF2ilLVOY944QRAGnjBBECPIzNbgqavghYp1j75F2nq6_ny1CYfoaxTV2iDpRUw8_f7sliYbl8FrLLat0S25ItlZrg5TEJHObvOqlG2_nXoeH36MRWwNhms2uCqfhn5VgtenIzpQIBolnM7zzGp21NvdJ1C_ZAUzkXC-l3oQ-BXTtpEVM4h2KpYh4gfZJWCbYij5d1e1YApKD6V61_Cs3Oa2OY7CAUyq5kgAWJZFDB6CpzIr226u3bV7F9RbrQu3Ybc_Lv33EwykscLznKWZY2Mbs3Iz_rFNv3sVX_vHpH4DHWlKu7Q","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMlzANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKTb1N3nKVR2yU+GwjhKcOnJ1dcouubQdyNG0RdopS1TmPeOEEQBp4wQRAjyMzW4Kmr4IWKdY++Rdp6uv58tQmH6GsU1dog6UVMPP3+7JYmG5fBayy2rdEtuSLZWa4OUxCRzm7zqpRtv516Hh9+jEVsDYZrNrgqn4Z+VYLXpyM6UCAaJZzO88xqdtTb3SdQv2QFM5Fwvpd6EPgV07aRFTOIdiqWIeIH2SVgm2Io+XdXtWAKSg+letfwrNzmtjmOwgFMquZIAFiWRQwegqcyK9turt21exfUW60Lt2G3Py799xMMpLHC85ylmWNjG7NyM/6xTb97FV/7x6R+Ax1pSru0CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAQGJHeTYSMvp0yndbIn7DLohO9lom5nRrx/bLyb7TiRfogyJEF6rQZ66CAkQFk5eMF878fsHTuMVjtmXVBnhojhVmK91HwjsNQu/8xR6QMXNKJQMvHR245vwUGxlWRw/36ObM1D7QjCd/q+FonpBEY4m5Y6Uz1U0HR2Cbh0E2afVlPLeV+F0LKrlyVMdIaWBGWftCGIKDAHaG/PD66zbAKtxerv2fBIDq100WHPhd57BZxX+2aGJp1IaRDgkxV0E/CjEy3+Knd8xbAgUSW0Tl6OTC75exIvlbzeluEBe0wlapAb7WvBKYsipSW8G8Ey7tjoolDT4AU82EaKUPstiMnA=="],"x5t":"AlfHDI0FOPQpt3RBAILt0dtW1yw","x5t#S256":"a7bhm8-JsnfY7bL_m8Yl72hgmp5516VZlFcVloKzk08"}]}'
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/json;charset=UTF-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '2909'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Authorization:
+ - Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTgxOTc2OTIsImlhdCI6MTcxODE5NzM5MiwiYXV0aF90aW1lIjoxNzE4MTk3MzkyLCJqdGkiOiIyMjg3YWNkMy1mOGI5LTRkOGEtYjBlOS05YThkYmU5ZmEyZWQiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiZWM1YTFmNzAtM2QxMC00OGE4LWExOGItMmQxM2M5MjVjZDkyIiwidHlwIjoiQmVhcmVyIiwiYXpwIjoidGVzdGlkIiwibm9uY2UiOiJub3QtYS1yYW5kb20tc3RyaW5nIiwic2Vzc2lvbl9zdGF0ZSI6IjhmM2U3MWMxLTRmY2ItNDY2MC04YjkwLWQxNzg0MjRjZWJiNSIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOlsiaHR0cDovLzEyNy4wLjAuMTo4MDAwIl0sInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJkZWZhdWx0LXJvbGVzLXRlc3QiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgZW1haWwgcHJvZmlsZSBrdmsgZ3JvdXBzIGJzbiIsInNpZCI6IjhmM2U3MWMxLTRmY2ItNDY2MC04YjkwLWQxNzg0MjRjZWJiNSIsImVtYWlsX3ZlcmlmaWVkIjpmYWxzZSwic2VydmljZV9pZCI6ImIxOGRkNzNmLTNkY2EtNGI2Ny1hNGZiLTA2Y2I0ZWJiZTJlYiIsImdlbWFjaHRpZ2RlLmJzbiI6Ijk5OTk5OTk5OSIsImdyb3VwcyI6WyJkZWZhdWx0LXJvbGVzLXRlc3QiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl0sImFhbnZyYWdlci5ic24iOiIwMDAwMDAwMDAiLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJkaWdpZC1tYWNodGlnZW4ifQ.NtRFCj5l1Dx5EMaioY6WStp2-UDmEv3gYJFnoPT_KVRifI6luWWOvxlBkJUe_FxsO5tLi80kwSUZ74TKPkMTeA6ql0TAZDKznn6UlwR1fyl4ILtSSwzBFSgE8fhAugnho8hriLxHS288DSCLbnebzCUhacypOJW1LSXqnO8KPfoShG2wJZjxlOfdmaZiWI2-ruvswzA-qDPxYkqR5qEp-ns8zKUY1KL5g_Xc_8zKiiVksR9LISe6B7UKie3CgXnrwxyxPjjYanQAHBbuB5UfExCfTl37lg3uO6ypKcXF2HTkKYxxYaYLhgKTcdqzSSjrwAWC-QsHqGhIXL-lA08IiA
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.32.2
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/userinfo
+ response:
+ body:
+ string: eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJzdWIiOiJlYzVhMWY3MC0zZDEwLTQ4YTgtYTE4Yi0yZDEzYzkyNWNkOTIiLCJhdWQiOiJ0ZXN0aWQiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsInNlcnZpY2VfaWQiOiJiMThkZDczZi0zZGNhLTRiNjctYTRmYi0wNmNiNGViYmUyZWIiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJnZW1hY2h0aWdkZS5ic24iOiI5OTk5OTk5OTkiLCJncm91cHMiOlsiZGVmYXVsdC1yb2xlcy10ZXN0Iiwib2ZmbGluZV9hY2Nlc3MiLCJ1bWFfYXV0aG9yaXphdGlvbiJdLCJhYW52cmFnZXIuYnNuIjoiMDAwMDAwMDAwIiwicHJlZmVycmVkX3VzZXJuYW1lIjoiZGlnaWQtbWFjaHRpZ2VuIn0.blFPktS9rVX0fSXLqkNGT3UciAHQ5EKKqk_JK2qQ5D6Wlj6TC6BI7s5OLiTjMMXyLUOXZmfR__0_kEJBx3Em9_mM3_QTNrQvErY2yYLszx5CZnAJjp-PXKfh7pgeqFCpeYkr-pM0h13IvuqhCtqGgVHZCHg2M3k7yoHz7mqIwD1wY3XnS8gP6P6YcBO0FIgxS2sc8J3qhqhxMZQxs94yFTpSt0iiYZiCUmc72iQOH3KtdJIEvJl3Xa6AnYPqG95PdVtuRVRN0ap2ZOMZ5wK3qVW0yIBQTbpMLRl1lcXSrWsCyAcSjZG7rSzkU9dkroZUumbO45uDiJdb1GMasIyBEQ
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/jwt
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '914'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.32.2
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/certs
+ response:
+ body:
+ string: '{"keys":[{"kid":"4UNQAcvUcv-DFUOx_4O1gt13OdJSotqEKPZurs2vQW8","kty":"RSA","alg":"RS256","use":"sig","n":"2DOZ0qHie73SuFVR7civrl6r82YUiAghfzaMowjCg0o06AF--2lIS7vNV_PbsVVznPAAMqVrNG-8CcevEzvVZMQD9nH4DI7xlOxK0lrYu8rmMeSfOvXVbBVsWBZe0jnGNukZqjwmRE5__ttJdxPfIBT5-2L6mguQbDfhSUEEdIW7y7UfOXvqLqEcBtoIEB-ORKDTUIQwGZM5mSCy-cY3cHvvZfZVgaUUy5NvujPRXTMje4n_hG0KfEV-40G9qC2_Xvx4EooJzBZ6FSThiWhCpwhIvzcQqB6M9lHW7nU6wADhYPNCa2OKWvphwZ_zbrF4B9dmS6Zli5rBvbox9Hh45w","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMLTANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANgzmdKh4nu90rhVUe3Ir65eq/NmFIgIIX82jKMIwoNKNOgBfvtpSEu7zVfz27FVc5zwADKlazRvvAnHrxM71WTEA/Zx+AyO8ZTsStJa2LvK5jHknzr11WwVbFgWXtI5xjbpGao8JkROf/7bSXcT3yAU+fti+poLkGw34UlBBHSFu8u1Hzl76i6hHAbaCBAfjkSg01CEMBmTOZkgsvnGN3B772X2VYGlFMuTb7oz0V0zI3uJ/4RtCnxFfuNBvagtv178eBKKCcwWehUk4YloQqcISL83EKgejPZR1u51OsAA4WDzQmtjilr6YcGf826xeAfXZkumZYuawb26MfR4eOcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAsnQG/Yi2g1XTCJn74hWv9MjxVAaZb4gBAc2AWm5VgAjhFEM9h6x6m1mQkq7JM4rIdAj8jw55Ok9CBVBIqq4G4cME3eUvVytkj2lC9zcRoAivjjZF2HPg7zNPa2TTR50asmHPRokppV6gewO/C+o5as+4P2zqDXBh61aRd/9kdQfkg14LBbH5/dYccAuvUqlTYC4IEPCvVmBNC1xsMjf0vohvoSjm9vL2bfqG/RJH0ScdCjOd5d2zju4/e2oVdluWm+vzKBQplc7tVMuKpn6LcLmVHiGNAl+EBIZH+WVLlTx0D1+kbHZsfLYG53lQg2LsvurRbWyF/a5fVM/oLTn5ag=="],"x5t":"H5xfs1pRtvX0HyVTskx7eTXx88U","x5t#S256":"XurVtKAIEyc4w9HCGOhnjoRHnYu4d9HCn_5YHmkScJg"},{"kid":"TV3Tl5jIY1nrJLSb53UKEubLR5gYiq9slq1SsDDg1HU","kty":"RSA","alg":"RSA-OAEP","use":"enc","n":"pNvU3ecpVHbJT4bCOEpw6cnV1yi65tB3I0bRF2ilLVOY944QRAGnjBBECPIzNbgqavghYp1j75F2nq6_ny1CYfoaxTV2iDpRUw8_f7sliYbl8FrLLat0S25ItlZrg5TEJHObvOqlG2_nXoeH36MRWwNhms2uCqfhn5VgtenIzpQIBolnM7zzGp21NvdJ1C_ZAUzkXC-l3oQ-BXTtpEVM4h2KpYh4gfZJWCbYij5d1e1YApKD6V61_Cs3Oa2OY7CAUyq5kgAWJZFDB6CpzIr226u3bV7F9RbrQu3Ybc_Lv33EwykscLznKWZY2Mbs3Iz_rFNv3sVX_vHpH4DHWlKu7Q","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMlzANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKTb1N3nKVR2yU+GwjhKcOnJ1dcouubQdyNG0RdopS1TmPeOEEQBp4wQRAjyMzW4Kmr4IWKdY++Rdp6uv58tQmH6GsU1dog6UVMPP3+7JYmG5fBayy2rdEtuSLZWa4OUxCRzm7zqpRtv516Hh9+jEVsDYZrNrgqn4Z+VYLXpyM6UCAaJZzO88xqdtTb3SdQv2QFM5Fwvpd6EPgV07aRFTOIdiqWIeIH2SVgm2Io+XdXtWAKSg+letfwrNzmtjmOwgFMquZIAFiWRQwegqcyK9turt21exfUW60Lt2G3Py799xMMpLHC85ylmWNjG7NyM/6xTb97FV/7x6R+Ax1pSru0CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAQGJHeTYSMvp0yndbIn7DLohO9lom5nRrx/bLyb7TiRfogyJEF6rQZ66CAkQFk5eMF878fsHTuMVjtmXVBnhojhVmK91HwjsNQu/8xR6QMXNKJQMvHR245vwUGxlWRw/36ObM1D7QjCd/q+FonpBEY4m5Y6Uz1U0HR2Cbh0E2afVlPLeV+F0LKrlyVMdIaWBGWftCGIKDAHaG/PD66zbAKtxerv2fBIDq100WHPhd57BZxX+2aGJp1IaRDgkxV0E/CjEy3+Knd8xbAgUSW0Tl6OTC75exIvlbzeluEBe0wlapAb7WvBKYsipSW8G8Ey7tjoolDT4AU82EaKUPstiMnA=="],"x5t":"AlfHDI0FOPQpt3RBAILt0dtW1yw","x5t#S256":"a7bhm8-JsnfY7bL_m8Yl72hgmp5516VZlFcVloKzk08"}]}'
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/json;charset=UTF-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '2909'
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/DigiDMachtigenInitTests/DigiDMachtigenInitTests.test_idp_availability_check.yaml b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/DigiDMachtigenInitTests/DigiDMachtigenInitTests.test_idp_availability_check.yaml
new file mode 100644
index 0000000000..e786ba2dc4
--- /dev/null
+++ b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/DigiDMachtigenInitTests/DigiDMachtigenInitTests.test_idp_availability_check.yaml
@@ -0,0 +1,26 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/i-dont-exist
+ response:
+ body:
+ string: '{"error":"Unable to find matching target resource method"}'
+ headers:
+ Content-Type:
+ - application/json
+ content-length:
+ - '58'
+ status:
+ code: 404
+ message: Not Found
+version: 1
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/DigiDMachtigenInitTests/DigiDMachtigenInitTests.test_keycloak_idp_hint_is_respected.yaml b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/DigiDMachtigenInitTests/DigiDMachtigenInitTests.test_keycloak_idp_hint_is_respected.yaml
new file mode 100644
index 0000000000..7556222e57
--- /dev/null
+++ b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/DigiDMachtigenInitTests/DigiDMachtigenInitTests.test_keycloak_idp_hint_is_respected.yaml
@@ -0,0 +1,59 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n\n\n\n\n\n\n"
+ headers:
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '1573'
+ status:
+ code: 400
+ message: Bad Request
+version: 1
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/DigiDMachtigenInitTests/DigiDMachtigenInitTests.test_start_flow_redirects_to_oidc_provider.yaml b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/DigiDMachtigenInitTests/DigiDMachtigenInitTests.test_start_flow_redirects_to_oidc_provider.yaml
new file mode 100644
index 0000000000..7556222e57
--- /dev/null
+++ b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/DigiDMachtigenInitTests/DigiDMachtigenInitTests.test_start_flow_redirects_to_oidc_provider.yaml
@@ -0,0 +1,59 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n\n\n\n\n\n\n"
+ headers:
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '1573'
+ status:
+ code: 400
+ message: Bad Request
+version: 1
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/DigiDMachtigenLogoutTests/DigiDMachtigenLogoutTests.test_logout_also_logs_out_user_in_openid_provider.yaml b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/DigiDMachtigenLogoutTests/DigiDMachtigenLogoutTests.test_logout_also_logs_out_user_in_openid_provider.yaml
new file mode 100644
index 0000000000..2c4de37fd9
--- /dev/null
+++ b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/DigiDMachtigenLogoutTests/DigiDMachtigenLogoutTests.test_logout_also_logs_out_user_in_openid_provider.yaml
@@ -0,0 +1,727 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n\n\n\n\n\n\n"
+ headers:
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '1573'
+ status:
+ code: 400
+ message: Bad Request
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth?response_type=code&scope=openid+bsn&client_id=testid&redirect_uri=http%3A%2F%2Ftestserver%2Fdigid-machtigen-oidc%2Fcallback%2F&state=not-a-random-string&nonce=not-a-random-string
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n \n\n\n\n\n
+ \ \n
\n
+ \ \n
\n
+ \
\n\n\n
\n \n\n\n\n\n\n
+ \
\n
\n\n
\n
\n\n\n"
+ headers:
+ Cache-Control:
+ - no-store, must-revalidate, max-age=0
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Set-Cookie:
+ - AUTH_SESSION_ID=f81002bb-ea5e-4439-9a22-c2a573783986; Version=1; Path=/realms/test/;
+ SameSite=None; Secure; HttpOnly
+ - AUTH_SESSION_ID_LEGACY=f81002bb-ea5e-4439-9a22-c2a573783986; Version=1; Path=/realms/test/;
+ HttpOnly
+ - KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJjaWQiOiJ0ZXN0aWQiLCJwdHkiOiJvcGVuaWQtY29ubmVjdCIsInJ1cmkiOiJodHRwOi8vdGVzdHNlcnZlci9kaWdpZC1tYWNodGlnZW4tb2lkYy9jYWxsYmFjay8iLCJhY3QiOiJBVVRIRU5USUNBVEUiLCJub3RlcyI6eyJzY29wZSI6Im9wZW5pZCBic24iLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJyZXNwb25zZV90eXBlIjoiY29kZSIsInJlZGlyZWN0X3VyaSI6Imh0dHA6Ly90ZXN0c2VydmVyL2RpZ2lkLW1hY2h0aWdlbi1vaWRjL2NhbGxiYWNrLyIsInN0YXRlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyJ9fQ.CzIO8PEo0TtC0JUUGrAD0K0eHnesrWyKb05cHrA4S4k;
+ Version=1; Path=/realms/test/; HttpOnly
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '4466'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: username=digid-machtigen&password=digid-machtigen&credentialId=&login=Sign+In
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '77'
+ Content-Type:
+ - application/x-www-form-urlencoded
+ Cookie:
+ - AUTH_SESSION_ID_LEGACY=f81002bb-ea5e-4439-9a22-c2a573783986; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJjaWQiOiJ0ZXN0aWQiLCJwdHkiOiJvcGVuaWQtY29ubmVjdCIsInJ1cmkiOiJodHRwOi8vdGVzdHNlcnZlci9kaWdpZC1tYWNodGlnZW4tb2lkYy9jYWxsYmFjay8iLCJhY3QiOiJBVVRIRU5USUNBVEUiLCJub3RlcyI6eyJzY29wZSI6Im9wZW5pZCBic24iLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJyZXNwb25zZV90eXBlIjoiY29kZSIsInJlZGlyZWN0X3VyaSI6Imh0dHA6Ly90ZXN0c2VydmVyL2RpZ2lkLW1hY2h0aWdlbi1vaWRjL2NhbGxiYWNrLyIsInN0YXRlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyJ9fQ.CzIO8PEo0TtC0JUUGrAD0K0eHnesrWyKb05cHrA4S4k
+ User-Agent:
+ - python-requests/2.31.0
+ method: POST
+ uri: http://localhost:8080/realms/test/login-actions/authenticate?session_code=YsMJJfYRlkMqfg7BM9x5BGxQfaUK8YXSLynnsGrg_Rc&execution=d8b8778e-a545-45d4-8f72-fd69facf4b72&client_id=testid&tab_id=1A_wSCIsnrw
+ response:
+ body:
+ string: ''
+ headers:
+ Cache-Control:
+ - no-store, must-revalidate, max-age=0
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Location:
+ - http://testserver/digid-machtigen-oidc/callback/?state=not-a-random-string&session_state=f81002bb-ea5e-4439-9a22-c2a573783986&iss=http%3A%2F%2Flocalhost%3A8080%2Frealms%2Ftest&code=a31fe888-300d-44d1-b48e-4b2e60c52064.f81002bb-ea5e-4439-9a22-c2a573783986.adf4ad83-4550-4619-9231-73bd8d700f45
+ Referrer-Policy:
+ - no-referrer
+ Set-Cookie:
+ - KEYCLOAK_LOCALE=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test/; HttpOnly
+ - KC_RESTART=; Version=1; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0;
+ Path=/realms/test/; HttpOnly
+ - KC_AUTH_STATE=; Version=1; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0;
+ Path=/realms/test/
+ - KEYCLOAK_IDENTITY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTY0OTY4MDIsImlhdCI6MTcxNjQ2MDgwMiwianRpIjoiNzUxYWJlNzUtMjliNS00ZGZiLWJlZWMtODAyZWEwMTZiZmI3IiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiZWM1YTFmNzAtM2QxMC00OGE4LWExOGItMmQxM2M5MjVjZDkyIiwidHlwIjoiU2VyaWFsaXplZC1JRCIsInNlc3Npb25fc3RhdGUiOiJmODEwMDJiYi1lYTVlLTQ0MzktOWEyMi1jMmE1NzM3ODM5ODYiLCJzaWQiOiJmODEwMDJiYi1lYTVlLTQ0MzktOWEyMi1jMmE1NzM3ODM5ODYiLCJzdGF0ZV9jaGVja2VyIjoib2ZfM1dKck01UzZkU3JESHJWT2Ztall3ZHgtbHlPWDRpa0cweFRma0xYbyJ9.09qPIXCSix1bOHLQvbsEiBUb9ySV1SktTqMUJ9IA1u4;
+ Version=1; Path=/realms/test/; SameSite=None; Secure; HttpOnly
+ - KEYCLOAK_IDENTITY_LEGACY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTY0OTY4MDIsImlhdCI6MTcxNjQ2MDgwMiwianRpIjoiNzUxYWJlNzUtMjliNS00ZGZiLWJlZWMtODAyZWEwMTZiZmI3IiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiZWM1YTFmNzAtM2QxMC00OGE4LWExOGItMmQxM2M5MjVjZDkyIiwidHlwIjoiU2VyaWFsaXplZC1JRCIsInNlc3Npb25fc3RhdGUiOiJmODEwMDJiYi1lYTVlLTQ0MzktOWEyMi1jMmE1NzM3ODM5ODYiLCJzaWQiOiJmODEwMDJiYi1lYTVlLTQ0MzktOWEyMi1jMmE1NzM3ODM5ODYiLCJzdGF0ZV9jaGVja2VyIjoib2ZfM1dKck01UzZkU3JESHJWT2Ztall3ZHgtbHlPWDRpa0cweFRma0xYbyJ9.09qPIXCSix1bOHLQvbsEiBUb9ySV1SktTqMUJ9IA1u4;
+ Version=1; Path=/realms/test/; HttpOnly
+ - KEYCLOAK_SESSION=test/ec5a1f70-3d10-48a8-a18b-2d13c925cd92/f81002bb-ea5e-4439-9a22-c2a573783986;
+ Version=1; Expires=Thu, 23-May-2024 20:40:02 GMT; Max-Age=36000; Path=/realms/test/;
+ SameSite=None; Secure
+ - KEYCLOAK_SESSION_LEGACY=test/ec5a1f70-3d10-48a8-a18b-2d13c925cd92/f81002bb-ea5e-4439-9a22-c2a573783986;
+ Version=1; Expires=Thu, 23-May-2024 20:40:02 GMT; Max-Age=36000; Path=/realms/test/
+ - KEYCLOAK_REMEMBER_ME=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test/; HttpOnly
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '0'
+ status:
+ code: 302
+ message: Found
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n\n\n\n\n\n\n"
+ headers:
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '1573'
+ status:
+ code: 400
+ message: Bad Request
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ Cookie:
+ - AUTH_SESSION_ID_LEGACY=f81002bb-ea5e-4439-9a22-c2a573783986; KEYCLOAK_IDENTITY_LEGACY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTY0OTY4MDIsImlhdCI6MTcxNjQ2MDgwMiwianRpIjoiNzUxYWJlNzUtMjliNS00ZGZiLWJlZWMtODAyZWEwMTZiZmI3IiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiZWM1YTFmNzAtM2QxMC00OGE4LWExOGItMmQxM2M5MjVjZDkyIiwidHlwIjoiU2VyaWFsaXplZC1JRCIsInNlc3Npb25fc3RhdGUiOiJmODEwMDJiYi1lYTVlLTQ0MzktOWEyMi1jMmE1NzM3ODM5ODYiLCJzaWQiOiJmODEwMDJiYi1lYTVlLTQ0MzktOWEyMi1jMmE1NzM3ODM5ODYiLCJzdGF0ZV9jaGVja2VyIjoib2ZfM1dKck01UzZkU3JESHJWT2Ztall3ZHgtbHlPWDRpa0cweFRma0xYbyJ9.09qPIXCSix1bOHLQvbsEiBUb9ySV1SktTqMUJ9IA1u4;
+ KEYCLOAK_SESSION_LEGACY=test/ec5a1f70-3d10-48a8-a18b-2d13c925cd92/f81002bb-ea5e-4439-9a22-c2a573783986
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth?response_type=code&scope=openid+bsn&client_id=testid&redirect_uri=http%3A%2F%2Ftestserver%2Fdigid-machtigen-oidc%2Fcallback%2F&state=not-a-random-string&nonce=not-a-random-string
+ response:
+ body:
+ string: ''
+ headers:
+ Cache-Control:
+ - no-store, must-revalidate, max-age=0
+ Location:
+ - http://testserver/digid-machtigen-oidc/callback/?state=not-a-random-string&session_state=f81002bb-ea5e-4439-9a22-c2a573783986&iss=http%3A%2F%2Flocalhost%3A8080%2Frealms%2Ftest&code=8a0feebb-483f-4e3a-aab3-72ca24ff10fc.f81002bb-ea5e-4439-9a22-c2a573783986.adf4ad83-4550-4619-9231-73bd8d700f45
+ Referrer-Policy:
+ - no-referrer
+ Set-Cookie:
+ - KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJjaWQiOiJ0ZXN0aWQiLCJwdHkiOiJvcGVuaWQtY29ubmVjdCIsInJ1cmkiOiJodHRwOi8vdGVzdHNlcnZlci9kaWdpZC1tYWNodGlnZW4tb2lkYy9jYWxsYmFjay8iLCJhY3QiOiJBVVRIRU5USUNBVEUiLCJub3RlcyI6eyJzY29wZSI6Im9wZW5pZCBic24iLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJyZXNwb25zZV90eXBlIjoiY29kZSIsInJlZGlyZWN0X3VyaSI6Imh0dHA6Ly90ZXN0c2VydmVyL2RpZ2lkLW1hY2h0aWdlbi1vaWRjL2NhbGxiYWNrLyIsInN0YXRlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyJ9fQ.CzIO8PEo0TtC0JUUGrAD0K0eHnesrWyKb05cHrA4S4k;
+ Version=1; Path=/realms/test/; HttpOnly
+ - KEYCLOAK_LOCALE=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test/; HttpOnly
+ - KC_RESTART=; Version=1; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0;
+ Path=/realms/test/; HttpOnly
+ - KC_AUTH_STATE=; Version=1; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0;
+ Path=/realms/test/
+ - KEYCLOAK_IDENTITY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTY0OTY4MDIsImlhdCI6MTcxNjQ2MDgwMiwianRpIjoiOTg4NDdjMDAtYjM3Ny00OTNkLWFlOWItNzU4ZTdhOTgxMThiIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiZWM1YTFmNzAtM2QxMC00OGE4LWExOGItMmQxM2M5MjVjZDkyIiwidHlwIjoiU2VyaWFsaXplZC1JRCIsInNlc3Npb25fc3RhdGUiOiJmODEwMDJiYi1lYTVlLTQ0MzktOWEyMi1jMmE1NzM3ODM5ODYiLCJzaWQiOiJmODEwMDJiYi1lYTVlLTQ0MzktOWEyMi1jMmE1NzM3ODM5ODYiLCJzdGF0ZV9jaGVja2VyIjoib2ZfM1dKck01UzZkU3JESHJWT2Ztall3ZHgtbHlPWDRpa0cweFRma0xYbyJ9.BXeZkKDXi8_1y5BMHBoHAv4fUROc-Bt2fvwATjjxG9A;
+ Version=1; Path=/realms/test/; SameSite=None; Secure; HttpOnly
+ - KEYCLOAK_IDENTITY_LEGACY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTY0OTY4MDIsImlhdCI6MTcxNjQ2MDgwMiwianRpIjoiOTg4NDdjMDAtYjM3Ny00OTNkLWFlOWItNzU4ZTdhOTgxMThiIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiZWM1YTFmNzAtM2QxMC00OGE4LWExOGItMmQxM2M5MjVjZDkyIiwidHlwIjoiU2VyaWFsaXplZC1JRCIsInNlc3Npb25fc3RhdGUiOiJmODEwMDJiYi1lYTVlLTQ0MzktOWEyMi1jMmE1NzM3ODM5ODYiLCJzaWQiOiJmODEwMDJiYi1lYTVlLTQ0MzktOWEyMi1jMmE1NzM3ODM5ODYiLCJzdGF0ZV9jaGVja2VyIjoib2ZfM1dKck01UzZkU3JESHJWT2Ztall3ZHgtbHlPWDRpa0cweFRma0xYbyJ9.BXeZkKDXi8_1y5BMHBoHAv4fUROc-Bt2fvwATjjxG9A;
+ Version=1; Path=/realms/test/; HttpOnly
+ - KEYCLOAK_SESSION=test/ec5a1f70-3d10-48a8-a18b-2d13c925cd92/f81002bb-ea5e-4439-9a22-c2a573783986;
+ Version=1; Expires=Thu, 23-May-2024 20:40:02 GMT; Max-Age=36000; Path=/realms/test/;
+ SameSite=None; Secure
+ - KEYCLOAK_SESSION_LEGACY=test/ec5a1f70-3d10-48a8-a18b-2d13c925cd92/f81002bb-ea5e-4439-9a22-c2a573783986;
+ Version=1; Expires=Thu, 23-May-2024 20:40:02 GMT; Max-Age=36000; Path=/realms/test/
+ - KEYCLOAK_REMEMBER_ME=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test/; HttpOnly
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '0'
+ status:
+ code: 302
+ message: Found
+- request:
+ body: client_id=testid&client_secret=7DB3KUAAizYCcmZufpHRVOcD0TOkNO3I&grant_type=authorization_code&code=8a0feebb-483f-4e3a-aab3-72ca24ff10fc.f81002bb-ea5e-4439-9a22-c2a573783986.adf4ad83-4550-4619-9231-73bd8d700f45&redirect_uri=http%3A%2F%2Ftestserver%2Fdigid-machtigen-oidc%2Fcallback%2F
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '283'
+ Content-Type:
+ - application/x-www-form-urlencoded
+ User-Agent:
+ - python-requests/2.31.0
+ method: POST
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/token
+ response:
+ body:
+ string: '{"access_token":"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTY0NjExMDIsImlhdCI6MTcxNjQ2MDgwMiwiYXV0aF90aW1lIjoxNzE2NDYwODAyLCJqdGkiOiI2ZmQzNTEyNS03NzQzLTRkOWEtYWNjNS0xMWVmODhkM2MxODMiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiZWM1YTFmNzAtM2QxMC00OGE4LWExOGItMmQxM2M5MjVjZDkyIiwidHlwIjoiQmVhcmVyIiwiYXpwIjoidGVzdGlkIiwibm9uY2UiOiJub3QtYS1yYW5kb20tc3RyaW5nIiwic2Vzc2lvbl9zdGF0ZSI6ImY4MTAwMmJiLWVhNWUtNDQzOS05YTIyLWMyYTU3Mzc4Mzk4NiIsImFjciI6IjAiLCJhbGxvd2VkLW9yaWdpbnMiOlsiaHR0cDovLzEyNy4wLjAuMTo4MDAwIl0sInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJkZWZhdWx0LXJvbGVzLXRlc3QiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgZW1haWwgcHJvZmlsZSBrdmsgYnNuIiwic2lkIjoiZjgxMDAyYmItZWE1ZS00NDM5LTlhMjItYzJhNTczNzgzOTg2IiwiZW1haWxfdmVyaWZpZWQiOmZhbHNlLCJnZW1hY2h0aWdkZS5ic24iOiI5OTk5OTk5OTkiLCJhYW52cmFnZXIuYnNuIjoiMDAwMDAwMDAwIiwicHJlZmVycmVkX3VzZXJuYW1lIjoiZGlnaWQtbWFjaHRpZ2VuIn0.JN_G-BYrqgbyP_gxGhtlVTDEOc-cqSeLfzLQwDFDnxt2wGNKXbDGvtbscujaEQM8jr0D7Ch3JrBg-dj6vyrSVSZDS7byvq7WcprJTbEA4D6ds3S5haTRnf1HriqCX19mLJYe_F4h5i3MHc2eG2W1qUh1L5Df4ve4_j0ckpnzVAtDeJ3DIw5liyG4raxQ5cF7xgVgfTarPkoJvnP-Bu8Lc4WG1pm6yb1eROGhZF-B8Kf10yxBLpu7bNnYxVbzAem-8zthnM8ny6RccqOIbZE_pz1cOOFqdg_9fVkvB6W5PkbEDahg9mVqlfH8ff6KKPgSB0J_1f-__0kiWqBPcY0h0Q","expires_in":300,"refresh_expires_in":1800,"refresh_token":"eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTY0NjI2MDIsImlhdCI6MTcxNjQ2MDgwMiwianRpIjoiMGE2ZGZmOTAtODc1Ni00OTZiLTkzNWQtYmYxNDBlYWUwMmYzIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0IiwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiZWM1YTFmNzAtM2QxMC00OGE4LWExOGItMmQxM2M5MjVjZDkyIiwidHlwIjoiUmVmcmVzaCIsImF6cCI6InRlc3RpZCIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsInNlc3Npb25fc3RhdGUiOiJmODEwMDJiYi1lYTVlLTQ0MzktOWEyMi1jMmE1NzM3ODM5ODYiLCJzY29wZSI6Im9wZW5pZCBlbWFpbCBwcm9maWxlIGt2ayBic24iLCJzaWQiOiJmODEwMDJiYi1lYTVlLTQ0MzktOWEyMi1jMmE1NzM3ODM5ODYifQ.cBuveTYRN8Ic_ziO9nuvFgHAUi3EyBGiOml0zvPXgo4","token_type":"Bearer","id_token":"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTY0NjExMDIsImlhdCI6MTcxNjQ2MDgwMiwiYXV0aF90aW1lIjoxNzE2NDYwODAyLCJqdGkiOiI0Njg2YTIxMS04ZDc0LTRhMmYtOTkyYi00MDhlMzJjZjdmOGYiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJ0ZXN0aWQiLCJzdWIiOiJlYzVhMWY3MC0zZDEwLTQ4YTgtYTE4Yi0yZDEzYzkyNWNkOTIiLCJ0eXAiOiJJRCIsImF6cCI6InRlc3RpZCIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsInNlc3Npb25fc3RhdGUiOiJmODEwMDJiYi1lYTVlLTQ0MzktOWEyMi1jMmE1NzM3ODM5ODYiLCJhdF9oYXNoIjoibkx4M21sbUNuYnRKSjBoZ24xMjVrQSIsImFjciI6IjAiLCJzaWQiOiJmODEwMDJiYi1lYTVlLTQ0MzktOWEyMi1jMmE1NzM3ODM5ODYiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsImdlbWFjaHRpZ2RlLmJzbiI6Ijk5OTk5OTk5OSIsImFhbnZyYWdlci5ic24iOiIwMDAwMDAwMDAiLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJkaWdpZC1tYWNodGlnZW4ifQ.q0jDrz6NUPvaBzoJ-Kgygo4-kW_YFau77jKtxdvjwtrrLzRXKIK7t5s_O50XrdTb4e6a_Rmf48BzlurYbEPbhyEIit2mOoXyEKr_XoQuMDfO91pmhOCwyX-YBs7SMltTgqWcVi99bdFgvskxo9iusjWlcy0pp43LRtGrJZK5_GVvN5ApAwsWGjJ6v0gXka6xYZcsoxPcVfBUffApy_Slxfd3M1XH9m0oITSUPoWsOSja5lBEmNOeMhkXU3EGNSW9-Pwit2bWr9-fAYDO5lj0oZsQwVZHcROf35-_-1X-xH6in4f2CUGgaGB3ox3z9HtklfddmapyMU6VLMgbddZLfw","not-before-policy":0,"session_state":"f81002bb-ea5e-4439-9a22-c2a573783986","scope":"openid
+ email profile kvk bsn"}'
+ headers:
+ Cache-Control:
+ - no-store
+ Content-Type:
+ - application/json
+ Pragma:
+ - no-cache
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '3553'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/certs
+ response:
+ body:
+ string: '{"keys":[{"kid":"4UNQAcvUcv-DFUOx_4O1gt13OdJSotqEKPZurs2vQW8","kty":"RSA","alg":"RS256","use":"sig","n":"2DOZ0qHie73SuFVR7civrl6r82YUiAghfzaMowjCg0o06AF--2lIS7vNV_PbsVVznPAAMqVrNG-8CcevEzvVZMQD9nH4DI7xlOxK0lrYu8rmMeSfOvXVbBVsWBZe0jnGNukZqjwmRE5__ttJdxPfIBT5-2L6mguQbDfhSUEEdIW7y7UfOXvqLqEcBtoIEB-ORKDTUIQwGZM5mSCy-cY3cHvvZfZVgaUUy5NvujPRXTMje4n_hG0KfEV-40G9qC2_Xvx4EooJzBZ6FSThiWhCpwhIvzcQqB6M9lHW7nU6wADhYPNCa2OKWvphwZ_zbrF4B9dmS6Zli5rBvbox9Hh45w","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMLTANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANgzmdKh4nu90rhVUe3Ir65eq/NmFIgIIX82jKMIwoNKNOgBfvtpSEu7zVfz27FVc5zwADKlazRvvAnHrxM71WTEA/Zx+AyO8ZTsStJa2LvK5jHknzr11WwVbFgWXtI5xjbpGao8JkROf/7bSXcT3yAU+fti+poLkGw34UlBBHSFu8u1Hzl76i6hHAbaCBAfjkSg01CEMBmTOZkgsvnGN3B772X2VYGlFMuTb7oz0V0zI3uJ/4RtCnxFfuNBvagtv178eBKKCcwWehUk4YloQqcISL83EKgejPZR1u51OsAA4WDzQmtjilr6YcGf826xeAfXZkumZYuawb26MfR4eOcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAsnQG/Yi2g1XTCJn74hWv9MjxVAaZb4gBAc2AWm5VgAjhFEM9h6x6m1mQkq7JM4rIdAj8jw55Ok9CBVBIqq4G4cME3eUvVytkj2lC9zcRoAivjjZF2HPg7zNPa2TTR50asmHPRokppV6gewO/C+o5as+4P2zqDXBh61aRd/9kdQfkg14LBbH5/dYccAuvUqlTYC4IEPCvVmBNC1xsMjf0vohvoSjm9vL2bfqG/RJH0ScdCjOd5d2zju4/e2oVdluWm+vzKBQplc7tVMuKpn6LcLmVHiGNAl+EBIZH+WVLlTx0D1+kbHZsfLYG53lQg2LsvurRbWyF/a5fVM/oLTn5ag=="],"x5t":"H5xfs1pRtvX0HyVTskx7eTXx88U","x5t#S256":"XurVtKAIEyc4w9HCGOhnjoRHnYu4d9HCn_5YHmkScJg"},{"kid":"TV3Tl5jIY1nrJLSb53UKEubLR5gYiq9slq1SsDDg1HU","kty":"RSA","alg":"RSA-OAEP","use":"enc","n":"pNvU3ecpVHbJT4bCOEpw6cnV1yi65tB3I0bRF2ilLVOY944QRAGnjBBECPIzNbgqavghYp1j75F2nq6_ny1CYfoaxTV2iDpRUw8_f7sliYbl8FrLLat0S25ItlZrg5TEJHObvOqlG2_nXoeH36MRWwNhms2uCqfhn5VgtenIzpQIBolnM7zzGp21NvdJ1C_ZAUzkXC-l3oQ-BXTtpEVM4h2KpYh4gfZJWCbYij5d1e1YApKD6V61_Cs3Oa2OY7CAUyq5kgAWJZFDB6CpzIr226u3bV7F9RbrQu3Ybc_Lv33EwykscLznKWZY2Mbs3Iz_rFNv3sVX_vHpH4DHWlKu7Q","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMlzANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKTb1N3nKVR2yU+GwjhKcOnJ1dcouubQdyNG0RdopS1TmPeOEEQBp4wQRAjyMzW4Kmr4IWKdY++Rdp6uv58tQmH6GsU1dog6UVMPP3+7JYmG5fBayy2rdEtuSLZWa4OUxCRzm7zqpRtv516Hh9+jEVsDYZrNrgqn4Z+VYLXpyM6UCAaJZzO88xqdtTb3SdQv2QFM5Fwvpd6EPgV07aRFTOIdiqWIeIH2SVgm2Io+XdXtWAKSg+letfwrNzmtjmOwgFMquZIAFiWRQwegqcyK9turt21exfUW60Lt2G3Py799xMMpLHC85ylmWNjG7NyM/6xTb97FV/7x6R+Ax1pSru0CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAQGJHeTYSMvp0yndbIn7DLohO9lom5nRrx/bLyb7TiRfogyJEF6rQZ66CAkQFk5eMF878fsHTuMVjtmXVBnhojhVmK91HwjsNQu/8xR6QMXNKJQMvHR245vwUGxlWRw/36ObM1D7QjCd/q+FonpBEY4m5Y6Uz1U0HR2Cbh0E2afVlPLeV+F0LKrlyVMdIaWBGWftCGIKDAHaG/PD66zbAKtxerv2fBIDq100WHPhd57BZxX+2aGJp1IaRDgkxV0E/CjEy3+Knd8xbAgUSW0Tl6OTC75exIvlbzeluEBe0wlapAb7WvBKYsipSW8G8Ey7tjoolDT4AU82EaKUPstiMnA=="],"x5t":"AlfHDI0FOPQpt3RBAILt0dtW1yw","x5t#S256":"a7bhm8-JsnfY7bL_m8Yl72hgmp5516VZlFcVloKzk08"}]}'
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/json;charset=UTF-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '2909'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Authorization:
+ - Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTY0NjExMDIsImlhdCI6MTcxNjQ2MDgwMiwiYXV0aF90aW1lIjoxNzE2NDYwODAyLCJqdGkiOiI2ZmQzNTEyNS03NzQzLTRkOWEtYWNjNS0xMWVmODhkM2MxODMiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiZWM1YTFmNzAtM2QxMC00OGE4LWExOGItMmQxM2M5MjVjZDkyIiwidHlwIjoiQmVhcmVyIiwiYXpwIjoidGVzdGlkIiwibm9uY2UiOiJub3QtYS1yYW5kb20tc3RyaW5nIiwic2Vzc2lvbl9zdGF0ZSI6ImY4MTAwMmJiLWVhNWUtNDQzOS05YTIyLWMyYTU3Mzc4Mzk4NiIsImFjciI6IjAiLCJhbGxvd2VkLW9yaWdpbnMiOlsiaHR0cDovLzEyNy4wLjAuMTo4MDAwIl0sInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJkZWZhdWx0LXJvbGVzLXRlc3QiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgZW1haWwgcHJvZmlsZSBrdmsgYnNuIiwic2lkIjoiZjgxMDAyYmItZWE1ZS00NDM5LTlhMjItYzJhNTczNzgzOTg2IiwiZW1haWxfdmVyaWZpZWQiOmZhbHNlLCJnZW1hY2h0aWdkZS5ic24iOiI5OTk5OTk5OTkiLCJhYW52cmFnZXIuYnNuIjoiMDAwMDAwMDAwIiwicHJlZmVycmVkX3VzZXJuYW1lIjoiZGlnaWQtbWFjaHRpZ2VuIn0.JN_G-BYrqgbyP_gxGhtlVTDEOc-cqSeLfzLQwDFDnxt2wGNKXbDGvtbscujaEQM8jr0D7Ch3JrBg-dj6vyrSVSZDS7byvq7WcprJTbEA4D6ds3S5haTRnf1HriqCX19mLJYe_F4h5i3MHc2eG2W1qUh1L5Df4ve4_j0ckpnzVAtDeJ3DIw5liyG4raxQ5cF7xgVgfTarPkoJvnP-Bu8Lc4WG1pm6yb1eROGhZF-B8Kf10yxBLpu7bNnYxVbzAem-8zthnM8ny6RccqOIbZE_pz1cOOFqdg_9fVkvB6W5PkbEDahg9mVqlfH8ff6KKPgSB0J_1f-__0kiWqBPcY0h0Q
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/userinfo
+ response:
+ body:
+ string: eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJzdWIiOiJlYzVhMWY3MC0zZDEwLTQ4YTgtYTE4Yi0yZDEzYzkyNWNkOTIiLCJhdWQiOiJ0ZXN0aWQiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9yZWFsbXMvdGVzdCIsImdlbWFjaHRpZ2RlLmJzbiI6Ijk5OTk5OTk5OSIsImFhbnZyYWdlci5ic24iOiIwMDAwMDAwMDAiLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJkaWdpZC1tYWNodGlnZW4ifQ.o49__EZYqQIn8ctrG7GKzzNx1fxyOQHbpxnIeT-swLVZNgP04xGwI-hcycw1Okb6CuRUjzsrXzI1gLzmUE2pFcpIbCkKBJuoeShH1rgiRXezcUDo8b0vDMyBrHwjrv3E8bCOJ8yI5bR4qBXR6uZDyY9ZrZLoWYyYz4f1ws6TNa3FBtVvx6j171tw14_V85jlLICOwTPFYqyQ8884n2-s4blRyVQgIl1X9fbziOsRRshsbwnh3Ldct-8wrW218Bnw_HKklxfoDj13w6xm39U0JLWb3wz9rLmfRPAuGffHEIePigCTy0NmObKWNqN7MyI2mEJf9h8cIRqgV4zVXYn_YQ
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/jwt
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '753'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/certs
+ response:
+ body:
+ string: '{"keys":[{"kid":"4UNQAcvUcv-DFUOx_4O1gt13OdJSotqEKPZurs2vQW8","kty":"RSA","alg":"RS256","use":"sig","n":"2DOZ0qHie73SuFVR7civrl6r82YUiAghfzaMowjCg0o06AF--2lIS7vNV_PbsVVznPAAMqVrNG-8CcevEzvVZMQD9nH4DI7xlOxK0lrYu8rmMeSfOvXVbBVsWBZe0jnGNukZqjwmRE5__ttJdxPfIBT5-2L6mguQbDfhSUEEdIW7y7UfOXvqLqEcBtoIEB-ORKDTUIQwGZM5mSCy-cY3cHvvZfZVgaUUy5NvujPRXTMje4n_hG0KfEV-40G9qC2_Xvx4EooJzBZ6FSThiWhCpwhIvzcQqB6M9lHW7nU6wADhYPNCa2OKWvphwZ_zbrF4B9dmS6Zli5rBvbox9Hh45w","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMLTANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANgzmdKh4nu90rhVUe3Ir65eq/NmFIgIIX82jKMIwoNKNOgBfvtpSEu7zVfz27FVc5zwADKlazRvvAnHrxM71WTEA/Zx+AyO8ZTsStJa2LvK5jHknzr11WwVbFgWXtI5xjbpGao8JkROf/7bSXcT3yAU+fti+poLkGw34UlBBHSFu8u1Hzl76i6hHAbaCBAfjkSg01CEMBmTOZkgsvnGN3B772X2VYGlFMuTb7oz0V0zI3uJ/4RtCnxFfuNBvagtv178eBKKCcwWehUk4YloQqcISL83EKgejPZR1u51OsAA4WDzQmtjilr6YcGf826xeAfXZkumZYuawb26MfR4eOcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAsnQG/Yi2g1XTCJn74hWv9MjxVAaZb4gBAc2AWm5VgAjhFEM9h6x6m1mQkq7JM4rIdAj8jw55Ok9CBVBIqq4G4cME3eUvVytkj2lC9zcRoAivjjZF2HPg7zNPa2TTR50asmHPRokppV6gewO/C+o5as+4P2zqDXBh61aRd/9kdQfkg14LBbH5/dYccAuvUqlTYC4IEPCvVmBNC1xsMjf0vohvoSjm9vL2bfqG/RJH0ScdCjOd5d2zju4/e2oVdluWm+vzKBQplc7tVMuKpn6LcLmVHiGNAl+EBIZH+WVLlTx0D1+kbHZsfLYG53lQg2LsvurRbWyF/a5fVM/oLTn5ag=="],"x5t":"H5xfs1pRtvX0HyVTskx7eTXx88U","x5t#S256":"XurVtKAIEyc4w9HCGOhnjoRHnYu4d9HCn_5YHmkScJg"},{"kid":"TV3Tl5jIY1nrJLSb53UKEubLR5gYiq9slq1SsDDg1HU","kty":"RSA","alg":"RSA-OAEP","use":"enc","n":"pNvU3ecpVHbJT4bCOEpw6cnV1yi65tB3I0bRF2ilLVOY944QRAGnjBBECPIzNbgqavghYp1j75F2nq6_ny1CYfoaxTV2iDpRUw8_f7sliYbl8FrLLat0S25ItlZrg5TEJHObvOqlG2_nXoeH36MRWwNhms2uCqfhn5VgtenIzpQIBolnM7zzGp21NvdJ1C_ZAUzkXC-l3oQ-BXTtpEVM4h2KpYh4gfZJWCbYij5d1e1YApKD6V61_Cs3Oa2OY7CAUyq5kgAWJZFDB6CpzIr226u3bV7F9RbrQu3Ybc_Lv33EwykscLznKWZY2Mbs3Iz_rFNv3sVX_vHpH4DHWlKu7Q","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMlzANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKTb1N3nKVR2yU+GwjhKcOnJ1dcouubQdyNG0RdopS1TmPeOEEQBp4wQRAjyMzW4Kmr4IWKdY++Rdp6uv58tQmH6GsU1dog6UVMPP3+7JYmG5fBayy2rdEtuSLZWa4OUxCRzm7zqpRtv516Hh9+jEVsDYZrNrgqn4Z+VYLXpyM6UCAaJZzO88xqdtTb3SdQv2QFM5Fwvpd6EPgV07aRFTOIdiqWIeIH2SVgm2Io+XdXtWAKSg+letfwrNzmtjmOwgFMquZIAFiWRQwegqcyK9turt21exfUW60Lt2G3Py799xMMpLHC85ylmWNjG7NyM/6xTb97FV/7x6R+Ax1pSru0CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAQGJHeTYSMvp0yndbIn7DLohO9lom5nRrx/bLyb7TiRfogyJEF6rQZ66CAkQFk5eMF878fsHTuMVjtmXVBnhojhVmK91HwjsNQu/8xR6QMXNKJQMvHR245vwUGxlWRw/36ObM1D7QjCd/q+FonpBEY4m5Y6Uz1U0HR2Cbh0E2afVlPLeV+F0LKrlyVMdIaWBGWftCGIKDAHaG/PD66zbAKtxerv2fBIDq100WHPhd57BZxX+2aGJp1IaRDgkxV0E/CjEy3+Knd8xbAgUSW0Tl6OTC75exIvlbzeluEBe0wlapAb7WvBKYsipSW8G8Ey7tjoolDT4AU82EaKUPstiMnA=="],"x5t":"AlfHDI0FOPQpt3RBAILt0dtW1yw","x5t#S256":"a7bhm8-JsnfY7bL_m8Yl72hgmp5516VZlFcVloKzk08"}]}'
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/json;charset=UTF-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '2909'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: id_token_hint=eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTY0NjExMDIsImlhdCI6MTcxNjQ2MDgwMiwiYXV0aF90aW1lIjoxNzE2NDYwODAyLCJqdGkiOiI0Njg2YTIxMS04ZDc0LTRhMmYtOTkyYi00MDhlMzJjZjdmOGYiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJ0ZXN0aWQiLCJzdWIiOiJlYzVhMWY3MC0zZDEwLTQ4YTgtYTE4Yi0yZDEzYzkyNWNkOTIiLCJ0eXAiOiJJRCIsImF6cCI6InRlc3RpZCIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsInNlc3Npb25fc3RhdGUiOiJmODEwMDJiYi1lYTVlLTQ0MzktOWEyMi1jMmE1NzM3ODM5ODYiLCJhdF9oYXNoIjoibkx4M21sbUNuYnRKSjBoZ24xMjVrQSIsImFjciI6IjAiLCJzaWQiOiJmODEwMDJiYi1lYTVlLTQ0MzktOWEyMi1jMmE1NzM3ODM5ODYiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsImdlbWFjaHRpZ2RlLmJzbiI6Ijk5OTk5OTk5OSIsImFhbnZyYWdlci5ic24iOiIwMDAwMDAwMDAiLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJkaWdpZC1tYWNodGlnZW4ifQ.q0jDrz6NUPvaBzoJ-Kgygo4-kW_YFau77jKtxdvjwtrrLzRXKIK7t5s_O50XrdTb4e6a_Rmf48BzlurYbEPbhyEIit2mOoXyEKr_XoQuMDfO91pmhOCwyX-YBs7SMltTgqWcVi99bdFgvskxo9iusjWlcy0pp43LRtGrJZK5_GVvN5ApAwsWGjJ6v0gXka6xYZcsoxPcVfBUffApy_Slxfd3M1XH9m0oITSUPoWsOSja5lBEmNOeMhkXU3EGNSW9-Pwit2bWr9-fAYDO5lj0oZsQwVZHcROf35-_-1X-xH6in4f2CUGgaGB3ox3z9HtklfddmapyMU6VLMgbddZLfw
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '1171'
+ Content-Type:
+ - application/x-www-form-urlencoded
+ User-Agent:
+ - python-requests/2.31.0
+ method: POST
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/logout
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n\n\n\n\n
+ \ \n
\n
+ \ \n
\n
+ \
\n\n\n
\n
+ \
You are logged out
\n
\n\n\n\n
+ \
\n
\n\n
\n
\n\n\n"
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Set-Cookie:
+ - AUTH_SESSION_ID=019db403-873f-4e2e-82b8-41b7e6ba9477; Version=1; Path=/realms/test/;
+ SameSite=None; Secure; HttpOnly
+ - AUTH_SESSION_ID_LEGACY=019db403-873f-4e2e-82b8-41b7e6ba9477; Version=1; Path=/realms/test/;
+ HttpOnly
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '1566'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n\n\n\n\n\n\n"
+ headers:
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '1573'
+ status:
+ code: 400
+ message: Bad Request
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ Cookie:
+ - AUTH_SESSION_ID_LEGACY=f81002bb-ea5e-4439-9a22-c2a573783986; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJjaWQiOiJ0ZXN0aWQiLCJwdHkiOiJvcGVuaWQtY29ubmVjdCIsInJ1cmkiOiJodHRwOi8vdGVzdHNlcnZlci9kaWdpZC1tYWNodGlnZW4tb2lkYy9jYWxsYmFjay8iLCJhY3QiOiJBVVRIRU5USUNBVEUiLCJub3RlcyI6eyJzY29wZSI6Im9wZW5pZCBic24iLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJyZXNwb25zZV90eXBlIjoiY29kZSIsInJlZGlyZWN0X3VyaSI6Imh0dHA6Ly90ZXN0c2VydmVyL2RpZ2lkLW1hY2h0aWdlbi1vaWRjL2NhbGxiYWNrLyIsInN0YXRlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyJ9fQ.CzIO8PEo0TtC0JUUGrAD0K0eHnesrWyKb05cHrA4S4k;
+ KEYCLOAK_IDENTITY_LEGACY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTY0OTY4MDIsImlhdCI6MTcxNjQ2MDgwMiwianRpIjoiOTg4NDdjMDAtYjM3Ny00OTNkLWFlOWItNzU4ZTdhOTgxMThiIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiZWM1YTFmNzAtM2QxMC00OGE4LWExOGItMmQxM2M5MjVjZDkyIiwidHlwIjoiU2VyaWFsaXplZC1JRCIsInNlc3Npb25fc3RhdGUiOiJmODEwMDJiYi1lYTVlLTQ0MzktOWEyMi1jMmE1NzM3ODM5ODYiLCJzaWQiOiJmODEwMDJiYi1lYTVlLTQ0MzktOWEyMi1jMmE1NzM3ODM5ODYiLCJzdGF0ZV9jaGVja2VyIjoib2ZfM1dKck01UzZkU3JESHJWT2Ztall3ZHgtbHlPWDRpa0cweFRma0xYbyJ9.BXeZkKDXi8_1y5BMHBoHAv4fUROc-Bt2fvwATjjxG9A;
+ KEYCLOAK_SESSION_LEGACY=test/ec5a1f70-3d10-48a8-a18b-2d13c925cd92/f81002bb-ea5e-4439-9a22-c2a573783986
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth?response_type=code&scope=openid+bsn&client_id=testid&redirect_uri=http%3A%2F%2Ftestserver%2Fdigid-machtigen-oidc%2Fcallback%2F&state=not-a-random-string&nonce=not-a-random-string
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n \n\n\n\n\n
+ \ \n
\n
+ \ \n
\n
+ \
\n\n\n
\n \n\n\n\n\n\n
+ \
\n
\n\n
\n
\n\n\n"
+ headers:
+ Cache-Control:
+ - no-store, must-revalidate, max-age=0
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Set-Cookie:
+ - KEYCLOAK_IDENTITY=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test/; HttpOnly
+ - KEYCLOAK_IDENTITY_LEGACY=; Version=1; Comment=Expiring cookie; Expires=Thu,
+ 01-Jan-1970 00:00:10 GMT; Max-Age=0; Path=/realms/test/; HttpOnly
+ - KEYCLOAK_SESSION=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test/
+ - KEYCLOAK_SESSION_LEGACY=; Version=1; Comment=Expiring cookie; Expires=Thu,
+ 01-Jan-1970 00:00:10 GMT; Max-Age=0; Path=/realms/test/
+ - KEYCLOAK_IDENTITY=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test; HttpOnly
+ - KEYCLOAK_IDENTITY_LEGACY=; Version=1; Comment=Expiring cookie; Expires=Thu,
+ 01-Jan-1970 00:00:10 GMT; Max-Age=0; Path=/realms/test; HttpOnly
+ - KEYCLOAK_SESSION=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test
+ - KEYCLOAK_SESSION_LEGACY=; Version=1; Comment=Expiring cookie; Expires=Thu,
+ 01-Jan-1970 00:00:10 GMT; Max-Age=0; Path=/realms/test
+ - AUTH_SESSION_ID=3cf31a3a-15a7-4f19-8d23-9d318b9ab640; Version=1; Path=/realms/test/;
+ SameSite=None; Secure; HttpOnly
+ - AUTH_SESSION_ID_LEGACY=3cf31a3a-15a7-4f19-8d23-9d318b9ab640; Version=1; Path=/realms/test/;
+ HttpOnly
+ - KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJjaWQiOiJ0ZXN0aWQiLCJwdHkiOiJvcGVuaWQtY29ubmVjdCIsInJ1cmkiOiJodHRwOi8vdGVzdHNlcnZlci9kaWdpZC1tYWNodGlnZW4tb2lkYy9jYWxsYmFjay8iLCJhY3QiOiJBVVRIRU5USUNBVEUiLCJub3RlcyI6eyJzY29wZSI6Im9wZW5pZCBic24iLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJyZXNwb25zZV90eXBlIjoiY29kZSIsInJlZGlyZWN0X3VyaSI6Imh0dHA6Ly90ZXN0c2VydmVyL2RpZ2lkLW1hY2h0aWdlbi1vaWRjL2NhbGxiYWNrLyIsInN0YXRlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyJ9fQ.CzIO8PEo0TtC0JUUGrAD0K0eHnesrWyKb05cHrA4S4k;
+ Version=1; Path=/realms/test/; HttpOnly
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '4466'
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/EHerkenningBewindvoeringCallbackTests/EHerkenningBewindvoeringCallbackTests.test_eherkenning_error_reported_for_cancelled_login_anon_django_user.yaml b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/EHerkenningBewindvoeringCallbackTests/EHerkenningBewindvoeringCallbackTests.test_eherkenning_error_reported_for_cancelled_login_anon_django_user.yaml
new file mode 100644
index 0000000000..2d269fb4ab
--- /dev/null
+++ b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/EHerkenningBewindvoeringCallbackTests/EHerkenningBewindvoeringCallbackTests.test_eherkenning_error_reported_for_cancelled_login_anon_django_user.yaml
@@ -0,0 +1,91 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n\n\n\n\n\n\n"
+ headers:
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '1573'
+ status:
+ code: 400
+ message: Bad Request
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth?response_type=code&scope=badscope&client_id=testid&redirect_uri=http%3A%2F%2Ftestserver%2Feherkenning-bewindvoering-oidc%2Fcallback%2F&state=not-a-random-string&nonce=not-a-random-string
+ response:
+ body:
+ string: ''
+ headers:
+ Location:
+ - http://testserver/eherkenning-bewindvoering-oidc/callback/?error=invalid_scope&error_description=Invalid+scopes%3A+badscope&state=not-a-random-string&iss=http%3A%2F%2Flocalhost%3A8080%2Frealms%2Ftest
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '0'
+ status:
+ code: 302
+ message: Found
+version: 1
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/EHerkenningBewindvoeringCallbackTests/EHerkenningBewindvoeringCallbackTests.test_eherkenning_error_reported_for_cancelled_login_with_staff_django_user.yaml b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/EHerkenningBewindvoeringCallbackTests/EHerkenningBewindvoeringCallbackTests.test_eherkenning_error_reported_for_cancelled_login_with_staff_django_user.yaml
new file mode 100644
index 0000000000..2d269fb4ab
--- /dev/null
+++ b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/EHerkenningBewindvoeringCallbackTests/EHerkenningBewindvoeringCallbackTests.test_eherkenning_error_reported_for_cancelled_login_with_staff_django_user.yaml
@@ -0,0 +1,91 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n\n\n\n\n\n\n"
+ headers:
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '1573'
+ status:
+ code: 400
+ message: Bad Request
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth?response_type=code&scope=badscope&client_id=testid&redirect_uri=http%3A%2F%2Ftestserver%2Feherkenning-bewindvoering-oidc%2Fcallback%2F&state=not-a-random-string&nonce=not-a-random-string
+ response:
+ body:
+ string: ''
+ headers:
+ Location:
+ - http://testserver/eherkenning-bewindvoering-oidc/callback/?error=invalid_scope&error_description=Invalid+scopes%3A+badscope&state=not-a-random-string&iss=http%3A%2F%2Flocalhost%3A8080%2Frealms%2Ftest
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '0'
+ status:
+ code: 302
+ message: Found
+version: 1
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/EHerkenningBewindvoeringCallbackTests/EHerkenningBewindvoeringCallbackTests.test_failing_claim_verification.yaml b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/EHerkenningBewindvoeringCallbackTests/EHerkenningBewindvoeringCallbackTests.test_failing_claim_verification.yaml
new file mode 100644
index 0000000000..535f715b14
--- /dev/null
+++ b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/EHerkenningBewindvoeringCallbackTests/EHerkenningBewindvoeringCallbackTests.test_failing_claim_verification.yaml
@@ -0,0 +1,371 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n\n\n\n\n\n\n"
+ headers:
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '1573'
+ status:
+ code: 400
+ message: Bad Request
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth?response_type=code&scope=openid+bsn&client_id=testid&redirect_uri=http%3A%2F%2Ftestserver%2Feherkenning-bewindvoering-oidc%2Fcallback%2F&state=not-a-random-string&nonce=not-a-random-string
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n \n\n\n\n\n
+ \ \n
\n
+ \ \n
\n
+ \
\n\n\n
\n \n\n\n\n\n\n
+ \
\n
\n\n
\n
\n\n\n"
+ headers:
+ Cache-Control:
+ - no-store, must-revalidate, max-age=0
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Set-Cookie:
+ - AUTH_SESSION_ID=4e0775ac-68c4-4f7d-a637-073a8b0f98fb; Version=1; Path=/realms/test/;
+ SameSite=None; Secure; HttpOnly
+ - AUTH_SESSION_ID_LEGACY=4e0775ac-68c4-4f7d-a637-073a8b0f98fb; Version=1; Path=/realms/test/;
+ HttpOnly
+ - KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJjaWQiOiJ0ZXN0aWQiLCJwdHkiOiJvcGVuaWQtY29ubmVjdCIsInJ1cmkiOiJodHRwOi8vdGVzdHNlcnZlci9laGVya2VubmluZy1iZXdpbmR2b2VyaW5nLW9pZGMvY2FsbGJhY2svIiwiYWN0IjoiQVVUSEVOVElDQVRFIiwibm90ZXMiOnsic2NvcGUiOiJvcGVuaWQgYnNuIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0IiwicmVzcG9uc2VfdHlwZSI6ImNvZGUiLCJyZWRpcmVjdF91cmkiOiJodHRwOi8vdGVzdHNlcnZlci9laGVya2VubmluZy1iZXdpbmR2b2VyaW5nLW9pZGMvY2FsbGJhY2svIiwic3RhdGUiOiJub3QtYS1yYW5kb20tc3RyaW5nIiwibm9uY2UiOiJub3QtYS1yYW5kb20tc3RyaW5nIn19.ohW_ibsZCPn53GegGr49538xdqveI5gt43AvtPXb9ro;
+ Version=1; Path=/realms/test/; HttpOnly
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '4466'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: username=eherkenning-bewindvoering&password=eherkenning-bewindvoering&credentialId=&login=Sign+In
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '97'
+ Content-Type:
+ - application/x-www-form-urlencoded
+ Cookie:
+ - AUTH_SESSION_ID_LEGACY=4e0775ac-68c4-4f7d-a637-073a8b0f98fb; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJjaWQiOiJ0ZXN0aWQiLCJwdHkiOiJvcGVuaWQtY29ubmVjdCIsInJ1cmkiOiJodHRwOi8vdGVzdHNlcnZlci9laGVya2VubmluZy1iZXdpbmR2b2VyaW5nLW9pZGMvY2FsbGJhY2svIiwiYWN0IjoiQVVUSEVOVElDQVRFIiwibm90ZXMiOnsic2NvcGUiOiJvcGVuaWQgYnNuIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0IiwicmVzcG9uc2VfdHlwZSI6ImNvZGUiLCJyZWRpcmVjdF91cmkiOiJodHRwOi8vdGVzdHNlcnZlci9laGVya2VubmluZy1iZXdpbmR2b2VyaW5nLW9pZGMvY2FsbGJhY2svIiwic3RhdGUiOiJub3QtYS1yYW5kb20tc3RyaW5nIiwibm9uY2UiOiJub3QtYS1yYW5kb20tc3RyaW5nIn19.ohW_ibsZCPn53GegGr49538xdqveI5gt43AvtPXb9ro
+ User-Agent:
+ - python-requests/2.31.0
+ method: POST
+ uri: http://localhost:8080/realms/test/login-actions/authenticate?session_code=J_O_RmaBYKvnz269m5ssZQMpySZ8_aAobpKJd_h39fk&execution=d8b8778e-a545-45d4-8f72-fd69facf4b72&client_id=testid&tab_id=3vXx-XMXf3o
+ response:
+ body:
+ string: ''
+ headers:
+ Cache-Control:
+ - no-store, must-revalidate, max-age=0
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Location:
+ - http://testserver/eherkenning-bewindvoering-oidc/callback/?state=not-a-random-string&session_state=4e0775ac-68c4-4f7d-a637-073a8b0f98fb&iss=http%3A%2F%2Flocalhost%3A8080%2Frealms%2Ftest&code=d5216ea5-9d20-44ca-9c8d-49a0d6472b0f.4e0775ac-68c4-4f7d-a637-073a8b0f98fb.adf4ad83-4550-4619-9231-73bd8d700f45
+ Referrer-Policy:
+ - no-referrer
+ Set-Cookie:
+ - KEYCLOAK_LOCALE=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test/; HttpOnly
+ - KC_RESTART=; Version=1; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0;
+ Path=/realms/test/; HttpOnly
+ - KC_AUTH_STATE=; Version=1; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0;
+ Path=/realms/test/
+ - KEYCLOAK_IDENTITY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTY0OTY4MDAsImlhdCI6MTcxNjQ2MDgwMCwianRpIjoiNGFlMDE0NWUtNjc3ZC00ZWYzLWE3ZmYtYWU0OTFjZjMyZGI2IiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiNjQ2ZTI3YzYtMWI0Mi00ZTExLWE1YzYtZDlmYWU0YzNjZWE2IiwidHlwIjoiU2VyaWFsaXplZC1JRCIsInNlc3Npb25fc3RhdGUiOiI0ZTA3NzVhYy02OGM0LTRmN2QtYTYzNy0wNzNhOGIwZjk4ZmIiLCJzaWQiOiI0ZTA3NzVhYy02OGM0LTRmN2QtYTYzNy0wNzNhOGIwZjk4ZmIiLCJzdGF0ZV9jaGVja2VyIjoiNEJ2RjIyM2QySUVPcUNtTmozQXZiQ21QdjQ4TmloanBSMjNhUTNxQlAwcyJ9.tF06GFTWa4AIvdve747blfScBSO9qtposVDdwqCbvfs;
+ Version=1; Path=/realms/test/; SameSite=None; Secure; HttpOnly
+ - KEYCLOAK_IDENTITY_LEGACY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTY0OTY4MDAsImlhdCI6MTcxNjQ2MDgwMCwianRpIjoiNGFlMDE0NWUtNjc3ZC00ZWYzLWE3ZmYtYWU0OTFjZjMyZGI2IiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiNjQ2ZTI3YzYtMWI0Mi00ZTExLWE1YzYtZDlmYWU0YzNjZWE2IiwidHlwIjoiU2VyaWFsaXplZC1JRCIsInNlc3Npb25fc3RhdGUiOiI0ZTA3NzVhYy02OGM0LTRmN2QtYTYzNy0wNzNhOGIwZjk4ZmIiLCJzaWQiOiI0ZTA3NzVhYy02OGM0LTRmN2QtYTYzNy0wNzNhOGIwZjk4ZmIiLCJzdGF0ZV9jaGVja2VyIjoiNEJ2RjIyM2QySUVPcUNtTmozQXZiQ21QdjQ4TmloanBSMjNhUTNxQlAwcyJ9.tF06GFTWa4AIvdve747blfScBSO9qtposVDdwqCbvfs;
+ Version=1; Path=/realms/test/; HttpOnly
+ - KEYCLOAK_SESSION=test/646e27c6-1b42-4e11-a5c6-d9fae4c3cea6/4e0775ac-68c4-4f7d-a637-073a8b0f98fb;
+ Version=1; Expires=Thu, 23-May-2024 20:40:00 GMT; Max-Age=36000; Path=/realms/test/;
+ SameSite=None; Secure
+ - KEYCLOAK_SESSION_LEGACY=test/646e27c6-1b42-4e11-a5c6-d9fae4c3cea6/4e0775ac-68c4-4f7d-a637-073a8b0f98fb;
+ Version=1; Expires=Thu, 23-May-2024 20:40:00 GMT; Max-Age=36000; Path=/realms/test/
+ - KEYCLOAK_REMEMBER_ME=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test/; HttpOnly
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '0'
+ status:
+ code: 302
+ message: Found
+- request:
+ body: client_id=testid&client_secret=7DB3KUAAizYCcmZufpHRVOcD0TOkNO3I&grant_type=authorization_code&code=d5216ea5-9d20-44ca-9c8d-49a0d6472b0f.4e0775ac-68c4-4f7d-a637-073a8b0f98fb.adf4ad83-4550-4619-9231-73bd8d700f45&redirect_uri=http%3A%2F%2Ftestserver%2Feherkenning-bewindvoering-oidc%2Fcallback%2F
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '293'
+ Content-Type:
+ - application/x-www-form-urlencoded
+ User-Agent:
+ - python-requests/2.31.0
+ method: POST
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/token
+ response:
+ body:
+ string: '{"access_token":"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTY0NjExMDAsImlhdCI6MTcxNjQ2MDgwMCwiYXV0aF90aW1lIjoxNzE2NDYwODAwLCJqdGkiOiJiMGY2NDQyOS1hYWQ0LTQxMjAtYWQ4ZC1jMzAwNDU2Mzk2MGEiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiNjQ2ZTI3YzYtMWI0Mi00ZTExLWE1YzYtZDlmYWU0YzNjZWE2IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoidGVzdGlkIiwibm9uY2UiOiJub3QtYS1yYW5kb20tc3RyaW5nIiwic2Vzc2lvbl9zdGF0ZSI6IjRlMDc3NWFjLTY4YzQtNGY3ZC1hNjM3LTA3M2E4YjBmOThmYiIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOlsiaHR0cDovLzEyNy4wLjAuMTo4MDAwIl0sInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJkZWZhdWx0LXJvbGVzLXRlc3QiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgZW1haWwgcHJvZmlsZSBrdmsgYnNuIiwic2lkIjoiNGUwNzc1YWMtNjhjNC00ZjdkLWE2MzctMDczYThiMGY5OGZiIiwiZW1haWxfdmVyaWZpZWQiOmZhbHNlLCJhYW52cmFnZXIua3ZrIjoiMTIzNDU2NzgiLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJlaGVya2VubmluZy1iZXdpbmR2b2VyaW5nIiwiZ2VtYWNodGlnZGUucHNldWRvSUQiOiI0Qjc1QTBFQTEwN0IzRDM2In0.DBieG0ZboNo4A_42fjW6PIj1LuKnQHZdMTYTsvmMoXU0AHB4oPRDehYLcPuuts-_OIit8JKDR_-3yE7nHyQ1qqHZKQNRbzz9oZ-pt2KFQkYwy02IZNcTmYlosU3DHNiZtXo5OgsFamC0rLkHHqQOZSMiVyW0gPAggTGOeBDoe45mbaH4wi-QG_3_4aMMML0ThrR1caX_ebRr95BJwH8PMTdbpNOvw8zJmbCMr5urhexZmo_rA7YdwNwJTIzwTqLG9HLCwf_jYy2CW2IQ8s3w2OSpA1wBi7EkSFr1TpUsmEeMVIO6TkrQ9MZXPsR0KKxscLFxXKc-q3wKvTDVXP1czA","expires_in":300,"refresh_expires_in":1800,"refresh_token":"eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTY0NjI2MDAsImlhdCI6MTcxNjQ2MDgwMCwianRpIjoiNDg1Y2Q2ZjEtMmIwMS00ZjYwLWI3YzItMDkzMmQ4MTc5OTM2IiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0IiwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiNjQ2ZTI3YzYtMWI0Mi00ZTExLWE1YzYtZDlmYWU0YzNjZWE2IiwidHlwIjoiUmVmcmVzaCIsImF6cCI6InRlc3RpZCIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsInNlc3Npb25fc3RhdGUiOiI0ZTA3NzVhYy02OGM0LTRmN2QtYTYzNy0wNzNhOGIwZjk4ZmIiLCJzY29wZSI6Im9wZW5pZCBlbWFpbCBwcm9maWxlIGt2ayBic24iLCJzaWQiOiI0ZTA3NzVhYy02OGM0LTRmN2QtYTYzNy0wNzNhOGIwZjk4ZmIifQ.pi1ytUZgBsmwEFHG_x-6FUzKRTq_D6hsFcU0OdnyINc","token_type":"Bearer","id_token":"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTY0NjExMDAsImlhdCI6MTcxNjQ2MDgwMCwiYXV0aF90aW1lIjoxNzE2NDYwODAwLCJqdGkiOiI0N2JiYjBkNy1jM2Y2LTQwZjQtOTU4ZS0zNjJhMjMzZWZlZGEiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJ0ZXN0aWQiLCJzdWIiOiI2NDZlMjdjNi0xYjQyLTRlMTEtYTVjNi1kOWZhZTRjM2NlYTYiLCJ0eXAiOiJJRCIsImF6cCI6InRlc3RpZCIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsInNlc3Npb25fc3RhdGUiOiI0ZTA3NzVhYy02OGM0LTRmN2QtYTYzNy0wNzNhOGIwZjk4ZmIiLCJhdF9oYXNoIjoic3pMNm1KQlpvOFplOHM1b3lFRmVidyIsImFjciI6IjEiLCJzaWQiOiI0ZTA3NzVhYy02OGM0LTRmN2QtYTYzNy0wNzNhOGIwZjk4ZmIiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsImFhbnZyYWdlci5rdmsiOiIxMjM0NTY3OCIsInByZWZlcnJlZF91c2VybmFtZSI6ImVoZXJrZW5uaW5nLWJld2luZHZvZXJpbmciLCJnZW1hY2h0aWdkZS5wc2V1ZG9JRCI6IjRCNzVBMEVBMTA3QjNEMzYifQ.lXDLUKy6dqlk2RAWnNiCv6fcubamF9qZpNoCwSVv2erOnLsvOoyOo9ydglMhOKDlGMkGe5AbgV2yvd4UemxXuiG2EDTUaoOHCb4ztJTlZML62027SIWAJk7h69M01GePOlmPqrVutphgD6cd3VQy4fyM835hcwk9HD-fIA9yD04MKamxrdtde_biZYNbDqfhGEkUWTDd2y0uTJ5RsrJtJ2V5Tv4R3n8SOURnbLlOQt3S1SZ99QDLB7C1PiVswTnhqabw27E2oWiGcmhx2lhOK98dggVsOjGbTdScu6RQYFeZBH2qchFdrhFBsizxg9vrKqv9M69gVo7CmTUOwrcJIA","not-before-policy":0,"session_state":"4e0775ac-68c4-4f7d-a637-073a8b0f98fb","scope":"openid
+ email profile kvk bsn"}'
+ headers:
+ Cache-Control:
+ - no-store
+ Content-Type:
+ - application/json
+ Pragma:
+ - no-cache
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '3609'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/certs
+ response:
+ body:
+ string: '{"keys":[{"kid":"4UNQAcvUcv-DFUOx_4O1gt13OdJSotqEKPZurs2vQW8","kty":"RSA","alg":"RS256","use":"sig","n":"2DOZ0qHie73SuFVR7civrl6r82YUiAghfzaMowjCg0o06AF--2lIS7vNV_PbsVVznPAAMqVrNG-8CcevEzvVZMQD9nH4DI7xlOxK0lrYu8rmMeSfOvXVbBVsWBZe0jnGNukZqjwmRE5__ttJdxPfIBT5-2L6mguQbDfhSUEEdIW7y7UfOXvqLqEcBtoIEB-ORKDTUIQwGZM5mSCy-cY3cHvvZfZVgaUUy5NvujPRXTMje4n_hG0KfEV-40G9qC2_Xvx4EooJzBZ6FSThiWhCpwhIvzcQqB6M9lHW7nU6wADhYPNCa2OKWvphwZ_zbrF4B9dmS6Zli5rBvbox9Hh45w","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMLTANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANgzmdKh4nu90rhVUe3Ir65eq/NmFIgIIX82jKMIwoNKNOgBfvtpSEu7zVfz27FVc5zwADKlazRvvAnHrxM71WTEA/Zx+AyO8ZTsStJa2LvK5jHknzr11WwVbFgWXtI5xjbpGao8JkROf/7bSXcT3yAU+fti+poLkGw34UlBBHSFu8u1Hzl76i6hHAbaCBAfjkSg01CEMBmTOZkgsvnGN3B772X2VYGlFMuTb7oz0V0zI3uJ/4RtCnxFfuNBvagtv178eBKKCcwWehUk4YloQqcISL83EKgejPZR1u51OsAA4WDzQmtjilr6YcGf826xeAfXZkumZYuawb26MfR4eOcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAsnQG/Yi2g1XTCJn74hWv9MjxVAaZb4gBAc2AWm5VgAjhFEM9h6x6m1mQkq7JM4rIdAj8jw55Ok9CBVBIqq4G4cME3eUvVytkj2lC9zcRoAivjjZF2HPg7zNPa2TTR50asmHPRokppV6gewO/C+o5as+4P2zqDXBh61aRd/9kdQfkg14LBbH5/dYccAuvUqlTYC4IEPCvVmBNC1xsMjf0vohvoSjm9vL2bfqG/RJH0ScdCjOd5d2zju4/e2oVdluWm+vzKBQplc7tVMuKpn6LcLmVHiGNAl+EBIZH+WVLlTx0D1+kbHZsfLYG53lQg2LsvurRbWyF/a5fVM/oLTn5ag=="],"x5t":"H5xfs1pRtvX0HyVTskx7eTXx88U","x5t#S256":"XurVtKAIEyc4w9HCGOhnjoRHnYu4d9HCn_5YHmkScJg"},{"kid":"TV3Tl5jIY1nrJLSb53UKEubLR5gYiq9slq1SsDDg1HU","kty":"RSA","alg":"RSA-OAEP","use":"enc","n":"pNvU3ecpVHbJT4bCOEpw6cnV1yi65tB3I0bRF2ilLVOY944QRAGnjBBECPIzNbgqavghYp1j75F2nq6_ny1CYfoaxTV2iDpRUw8_f7sliYbl8FrLLat0S25ItlZrg5TEJHObvOqlG2_nXoeH36MRWwNhms2uCqfhn5VgtenIzpQIBolnM7zzGp21NvdJ1C_ZAUzkXC-l3oQ-BXTtpEVM4h2KpYh4gfZJWCbYij5d1e1YApKD6V61_Cs3Oa2OY7CAUyq5kgAWJZFDB6CpzIr226u3bV7F9RbrQu3Ybc_Lv33EwykscLznKWZY2Mbs3Iz_rFNv3sVX_vHpH4DHWlKu7Q","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMlzANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKTb1N3nKVR2yU+GwjhKcOnJ1dcouubQdyNG0RdopS1TmPeOEEQBp4wQRAjyMzW4Kmr4IWKdY++Rdp6uv58tQmH6GsU1dog6UVMPP3+7JYmG5fBayy2rdEtuSLZWa4OUxCRzm7zqpRtv516Hh9+jEVsDYZrNrgqn4Z+VYLXpyM6UCAaJZzO88xqdtTb3SdQv2QFM5Fwvpd6EPgV07aRFTOIdiqWIeIH2SVgm2Io+XdXtWAKSg+letfwrNzmtjmOwgFMquZIAFiWRQwegqcyK9turt21exfUW60Lt2G3Py799xMMpLHC85ylmWNjG7NyM/6xTb97FV/7x6R+Ax1pSru0CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAQGJHeTYSMvp0yndbIn7DLohO9lom5nRrx/bLyb7TiRfogyJEF6rQZ66CAkQFk5eMF878fsHTuMVjtmXVBnhojhVmK91HwjsNQu/8xR6QMXNKJQMvHR245vwUGxlWRw/36ObM1D7QjCd/q+FonpBEY4m5Y6Uz1U0HR2Cbh0E2afVlPLeV+F0LKrlyVMdIaWBGWftCGIKDAHaG/PD66zbAKtxerv2fBIDq100WHPhd57BZxX+2aGJp1IaRDgkxV0E/CjEy3+Knd8xbAgUSW0Tl6OTC75exIvlbzeluEBe0wlapAb7WvBKYsipSW8G8Ey7tjoolDT4AU82EaKUPstiMnA=="],"x5t":"AlfHDI0FOPQpt3RBAILt0dtW1yw","x5t#S256":"a7bhm8-JsnfY7bL_m8Yl72hgmp5516VZlFcVloKzk08"}]}'
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/json;charset=UTF-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '2909'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Authorization:
+ - Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTY0NjExMDAsImlhdCI6MTcxNjQ2MDgwMCwiYXV0aF90aW1lIjoxNzE2NDYwODAwLCJqdGkiOiJiMGY2NDQyOS1hYWQ0LTQxMjAtYWQ4ZC1jMzAwNDU2Mzk2MGEiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiNjQ2ZTI3YzYtMWI0Mi00ZTExLWE1YzYtZDlmYWU0YzNjZWE2IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoidGVzdGlkIiwibm9uY2UiOiJub3QtYS1yYW5kb20tc3RyaW5nIiwic2Vzc2lvbl9zdGF0ZSI6IjRlMDc3NWFjLTY4YzQtNGY3ZC1hNjM3LTA3M2E4YjBmOThmYiIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOlsiaHR0cDovLzEyNy4wLjAuMTo4MDAwIl0sInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJkZWZhdWx0LXJvbGVzLXRlc3QiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgZW1haWwgcHJvZmlsZSBrdmsgYnNuIiwic2lkIjoiNGUwNzc1YWMtNjhjNC00ZjdkLWE2MzctMDczYThiMGY5OGZiIiwiZW1haWxfdmVyaWZpZWQiOmZhbHNlLCJhYW52cmFnZXIua3ZrIjoiMTIzNDU2NzgiLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJlaGVya2VubmluZy1iZXdpbmR2b2VyaW5nIiwiZ2VtYWNodGlnZGUucHNldWRvSUQiOiI0Qjc1QTBFQTEwN0IzRDM2In0.DBieG0ZboNo4A_42fjW6PIj1LuKnQHZdMTYTsvmMoXU0AHB4oPRDehYLcPuuts-_OIit8JKDR_-3yE7nHyQ1qqHZKQNRbzz9oZ-pt2KFQkYwy02IZNcTmYlosU3DHNiZtXo5OgsFamC0rLkHHqQOZSMiVyW0gPAggTGOeBDoe45mbaH4wi-QG_3_4aMMML0ThrR1caX_ebRr95BJwH8PMTdbpNOvw8zJmbCMr5urhexZmo_rA7YdwNwJTIzwTqLG9HLCwf_jYy2CW2IQ8s3w2OSpA1wBi7EkSFr1TpUsmEeMVIO6TkrQ9MZXPsR0KKxscLFxXKc-q3wKvTDVXP1czA
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/userinfo
+ response:
+ body:
+ string: eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJzdWIiOiI2NDZlMjdjNi0xYjQyLTRlMTEtYTVjNi1kOWZhZTRjM2NlYTYiLCJhdWQiOiJ0ZXN0aWQiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsImFhbnZyYWdlci5rdmsiOiIxMjM0NTY3OCIsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9yZWFsbXMvdGVzdCIsInByZWZlcnJlZF91c2VybmFtZSI6ImVoZXJrZW5uaW5nLWJld2luZHZvZXJpbmciLCJnZW1hY2h0aWdkZS5wc2V1ZG9JRCI6IjRCNzVBMEVBMTA3QjNEMzYifQ.gMZorJmAINBiyhnEo5115UNw48hW3-17kjfMI0-5NDO4dpmNt8kRMZesq7vHO6sgqN23CgEqiiRGK6nn1FaMRoSunA8CvVa8IYMlVWq_Vgykb32nNpiyyQlFMUzpJfNycog3-Qjbpr6dhfLlABumKwaAFI5TVg355hZEDcKtn5OMuv_Vei6bI9UBWJECUfa4a5zImsla0OxAUK_6lDCSNxvC-mjtfyggLZHGkKIwSG7jt3bMLp8bNSqfe2FUM8u4nJz5f6UB1QAf35PErp2hXbW3Bu8iNB6KK5FTJuDKsU9WE0jJdUom7CQOZZWupmw5jMRVKxPht18U1l1W_jhAeA
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/jwt
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '781'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/certs
+ response:
+ body:
+ string: '{"keys":[{"kid":"4UNQAcvUcv-DFUOx_4O1gt13OdJSotqEKPZurs2vQW8","kty":"RSA","alg":"RS256","use":"sig","n":"2DOZ0qHie73SuFVR7civrl6r82YUiAghfzaMowjCg0o06AF--2lIS7vNV_PbsVVznPAAMqVrNG-8CcevEzvVZMQD9nH4DI7xlOxK0lrYu8rmMeSfOvXVbBVsWBZe0jnGNukZqjwmRE5__ttJdxPfIBT5-2L6mguQbDfhSUEEdIW7y7UfOXvqLqEcBtoIEB-ORKDTUIQwGZM5mSCy-cY3cHvvZfZVgaUUy5NvujPRXTMje4n_hG0KfEV-40G9qC2_Xvx4EooJzBZ6FSThiWhCpwhIvzcQqB6M9lHW7nU6wADhYPNCa2OKWvphwZ_zbrF4B9dmS6Zli5rBvbox9Hh45w","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMLTANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANgzmdKh4nu90rhVUe3Ir65eq/NmFIgIIX82jKMIwoNKNOgBfvtpSEu7zVfz27FVc5zwADKlazRvvAnHrxM71WTEA/Zx+AyO8ZTsStJa2LvK5jHknzr11WwVbFgWXtI5xjbpGao8JkROf/7bSXcT3yAU+fti+poLkGw34UlBBHSFu8u1Hzl76i6hHAbaCBAfjkSg01CEMBmTOZkgsvnGN3B772X2VYGlFMuTb7oz0V0zI3uJ/4RtCnxFfuNBvagtv178eBKKCcwWehUk4YloQqcISL83EKgejPZR1u51OsAA4WDzQmtjilr6YcGf826xeAfXZkumZYuawb26MfR4eOcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAsnQG/Yi2g1XTCJn74hWv9MjxVAaZb4gBAc2AWm5VgAjhFEM9h6x6m1mQkq7JM4rIdAj8jw55Ok9CBVBIqq4G4cME3eUvVytkj2lC9zcRoAivjjZF2HPg7zNPa2TTR50asmHPRokppV6gewO/C+o5as+4P2zqDXBh61aRd/9kdQfkg14LBbH5/dYccAuvUqlTYC4IEPCvVmBNC1xsMjf0vohvoSjm9vL2bfqG/RJH0ScdCjOd5d2zju4/e2oVdluWm+vzKBQplc7tVMuKpn6LcLmVHiGNAl+EBIZH+WVLlTx0D1+kbHZsfLYG53lQg2LsvurRbWyF/a5fVM/oLTn5ag=="],"x5t":"H5xfs1pRtvX0HyVTskx7eTXx88U","x5t#S256":"XurVtKAIEyc4w9HCGOhnjoRHnYu4d9HCn_5YHmkScJg"},{"kid":"TV3Tl5jIY1nrJLSb53UKEubLR5gYiq9slq1SsDDg1HU","kty":"RSA","alg":"RSA-OAEP","use":"enc","n":"pNvU3ecpVHbJT4bCOEpw6cnV1yi65tB3I0bRF2ilLVOY944QRAGnjBBECPIzNbgqavghYp1j75F2nq6_ny1CYfoaxTV2iDpRUw8_f7sliYbl8FrLLat0S25ItlZrg5TEJHObvOqlG2_nXoeH36MRWwNhms2uCqfhn5VgtenIzpQIBolnM7zzGp21NvdJ1C_ZAUzkXC-l3oQ-BXTtpEVM4h2KpYh4gfZJWCbYij5d1e1YApKD6V61_Cs3Oa2OY7CAUyq5kgAWJZFDB6CpzIr226u3bV7F9RbrQu3Ybc_Lv33EwykscLznKWZY2Mbs3Iz_rFNv3sVX_vHpH4DHWlKu7Q","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMlzANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKTb1N3nKVR2yU+GwjhKcOnJ1dcouubQdyNG0RdopS1TmPeOEEQBp4wQRAjyMzW4Kmr4IWKdY++Rdp6uv58tQmH6GsU1dog6UVMPP3+7JYmG5fBayy2rdEtuSLZWa4OUxCRzm7zqpRtv516Hh9+jEVsDYZrNrgqn4Z+VYLXpyM6UCAaJZzO88xqdtTb3SdQv2QFM5Fwvpd6EPgV07aRFTOIdiqWIeIH2SVgm2Io+XdXtWAKSg+letfwrNzmtjmOwgFMquZIAFiWRQwegqcyK9turt21exfUW60Lt2G3Py799xMMpLHC85ylmWNjG7NyM/6xTb97FV/7x6R+Ax1pSru0CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAQGJHeTYSMvp0yndbIn7DLohO9lom5nRrx/bLyb7TiRfogyJEF6rQZ66CAkQFk5eMF878fsHTuMVjtmXVBnhojhVmK91HwjsNQu/8xR6QMXNKJQMvHR245vwUGxlWRw/36ObM1D7QjCd/q+FonpBEY4m5Y6Uz1U0HR2Cbh0E2afVlPLeV+F0LKrlyVMdIaWBGWftCGIKDAHaG/PD66zbAKtxerv2fBIDq100WHPhd57BZxX+2aGJp1IaRDgkxV0E/CjEy3+Knd8xbAgUSW0Tl6OTC75exIvlbzeluEBe0wlapAb7WvBKYsipSW8G8Ey7tjoolDT4AU82EaKUPstiMnA=="],"x5t":"AlfHDI0FOPQpt3RBAILt0dtW1yw","x5t#S256":"a7bhm8-JsnfY7bL_m8Yl72hgmp5516VZlFcVloKzk08"}]}'
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/json;charset=UTF-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '2909'
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/EHerkenningBewindvoeringCallbackTests/EHerkenningBewindvoeringCallbackTests.test_redirects_after_successful_auth.yaml b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/EHerkenningBewindvoeringCallbackTests/EHerkenningBewindvoeringCallbackTests.test_redirects_after_successful_auth.yaml
new file mode 100644
index 0000000000..ff10d8982a
--- /dev/null
+++ b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/EHerkenningBewindvoeringCallbackTests/EHerkenningBewindvoeringCallbackTests.test_redirects_after_successful_auth.yaml
@@ -0,0 +1,371 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.32.2
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n\n\n\n\n\n\n"
+ headers:
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '1573'
+ status:
+ code: 400
+ message: Bad Request
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.32.2
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth?response_type=code&scope=openid+bsn&client_id=testid&redirect_uri=http%3A%2F%2Ftestserver%2Feherkenning-bewindvoering-oidc%2Fcallback%2F&state=not-a-random-string&nonce=not-a-random-string
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n \n\n\n\n\n
+ \ \n
\n
+ \ \n
\n
+ \
\n\n\n
\n \n\n\n\n\n\n
+ \
\n
\n\n
\n
\n\n\n"
+ headers:
+ Cache-Control:
+ - no-store, must-revalidate, max-age=0
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Set-Cookie:
+ - AUTH_SESSION_ID=59467342-87eb-43f5-bbd2-6058d44413fd; Version=1; Path=/realms/test/;
+ SameSite=None; Secure; HttpOnly
+ - AUTH_SESSION_ID_LEGACY=59467342-87eb-43f5-bbd2-6058d44413fd; Version=1; Path=/realms/test/;
+ HttpOnly
+ - KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJjaWQiOiJ0ZXN0aWQiLCJwdHkiOiJvcGVuaWQtY29ubmVjdCIsInJ1cmkiOiJodHRwOi8vdGVzdHNlcnZlci9laGVya2VubmluZy1iZXdpbmR2b2VyaW5nLW9pZGMvY2FsbGJhY2svIiwiYWN0IjoiQVVUSEVOVElDQVRFIiwibm90ZXMiOnsic2NvcGUiOiJvcGVuaWQgYnNuIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0IiwicmVzcG9uc2VfdHlwZSI6ImNvZGUiLCJyZWRpcmVjdF91cmkiOiJodHRwOi8vdGVzdHNlcnZlci9laGVya2VubmluZy1iZXdpbmR2b2VyaW5nLW9pZGMvY2FsbGJhY2svIiwic3RhdGUiOiJub3QtYS1yYW5kb20tc3RyaW5nIiwibm9uY2UiOiJub3QtYS1yYW5kb20tc3RyaW5nIn19.ohW_ibsZCPn53GegGr49538xdqveI5gt43AvtPXb9ro;
+ Version=1; Path=/realms/test/; HttpOnly
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '4466'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: username=eherkenning-bewindvoering&password=eherkenning-bewindvoering&credentialId=&login=Sign+In
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '97'
+ Content-Type:
+ - application/x-www-form-urlencoded
+ Cookie:
+ - AUTH_SESSION_ID_LEGACY=59467342-87eb-43f5-bbd2-6058d44413fd; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJjaWQiOiJ0ZXN0aWQiLCJwdHkiOiJvcGVuaWQtY29ubmVjdCIsInJ1cmkiOiJodHRwOi8vdGVzdHNlcnZlci9laGVya2VubmluZy1iZXdpbmR2b2VyaW5nLW9pZGMvY2FsbGJhY2svIiwiYWN0IjoiQVVUSEVOVElDQVRFIiwibm90ZXMiOnsic2NvcGUiOiJvcGVuaWQgYnNuIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0IiwicmVzcG9uc2VfdHlwZSI6ImNvZGUiLCJyZWRpcmVjdF91cmkiOiJodHRwOi8vdGVzdHNlcnZlci9laGVya2VubmluZy1iZXdpbmR2b2VyaW5nLW9pZGMvY2FsbGJhY2svIiwic3RhdGUiOiJub3QtYS1yYW5kb20tc3RyaW5nIiwibm9uY2UiOiJub3QtYS1yYW5kb20tc3RyaW5nIn19.ohW_ibsZCPn53GegGr49538xdqveI5gt43AvtPXb9ro
+ User-Agent:
+ - python-requests/2.32.2
+ method: POST
+ uri: http://localhost:8080/realms/test/login-actions/authenticate?session_code=lxSZ4LdYPPFJdAcPYzRF6cylhp-omS1jca2ajqE7P78&execution=d8b8778e-a545-45d4-8f72-fd69facf4b72&client_id=testid&tab_id=B8DLpYWeCfE
+ response:
+ body:
+ string: ''
+ headers:
+ Cache-Control:
+ - no-store, must-revalidate, max-age=0
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Location:
+ - http://testserver/eherkenning-bewindvoering-oidc/callback/?state=not-a-random-string&session_state=59467342-87eb-43f5-bbd2-6058d44413fd&iss=http%3A%2F%2Flocalhost%3A8080%2Frealms%2Ftest&code=b8243d6b-a424-4789-9220-3b240309d7d9.59467342-87eb-43f5-bbd2-6058d44413fd.adf4ad83-4550-4619-9231-73bd8d700f45
+ Referrer-Policy:
+ - no-referrer
+ Set-Cookie:
+ - KEYCLOAK_LOCALE=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test/; HttpOnly
+ - KC_RESTART=; Version=1; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0;
+ Path=/realms/test/; HttpOnly
+ - KC_AUTH_STATE=; Version=1; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0;
+ Path=/realms/test/
+ - KEYCLOAK_IDENTITY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTgyMzc0MTQsImlhdCI6MTcxODIwMTQxNCwianRpIjoiMWFmOWFlZmYtZDQ1Ny00YWQ4LWEwZDItZThkMjg1ZDAwNDYxIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiNjQ2ZTI3YzYtMWI0Mi00ZTExLWE1YzYtZDlmYWU0YzNjZWE2IiwidHlwIjoiU2VyaWFsaXplZC1JRCIsInNlc3Npb25fc3RhdGUiOiI1OTQ2NzM0Mi04N2ViLTQzZjUtYmJkMi02MDU4ZDQ0NDEzZmQiLCJzaWQiOiI1OTQ2NzM0Mi04N2ViLTQzZjUtYmJkMi02MDU4ZDQ0NDEzZmQiLCJzdGF0ZV9jaGVja2VyIjoiMFdiWTJhWEhfekd5aTJBSGtNUUJQSzVLT0xBSG1EWmFJbmthbEhwOE1xOCJ9.hROPH_82rPRrzXitMviHZTZzLnZAaOUFJIqlk1Y7ob0;
+ Version=1; Path=/realms/test/; SameSite=None; Secure; HttpOnly
+ - KEYCLOAK_IDENTITY_LEGACY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTgyMzc0MTQsImlhdCI6MTcxODIwMTQxNCwianRpIjoiMWFmOWFlZmYtZDQ1Ny00YWQ4LWEwZDItZThkMjg1ZDAwNDYxIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiNjQ2ZTI3YzYtMWI0Mi00ZTExLWE1YzYtZDlmYWU0YzNjZWE2IiwidHlwIjoiU2VyaWFsaXplZC1JRCIsInNlc3Npb25fc3RhdGUiOiI1OTQ2NzM0Mi04N2ViLTQzZjUtYmJkMi02MDU4ZDQ0NDEzZmQiLCJzaWQiOiI1OTQ2NzM0Mi04N2ViLTQzZjUtYmJkMi02MDU4ZDQ0NDEzZmQiLCJzdGF0ZV9jaGVja2VyIjoiMFdiWTJhWEhfekd5aTJBSGtNUUJQSzVLT0xBSG1EWmFJbmthbEhwOE1xOCJ9.hROPH_82rPRrzXitMviHZTZzLnZAaOUFJIqlk1Y7ob0;
+ Version=1; Path=/realms/test/; HttpOnly
+ - KEYCLOAK_SESSION=test/646e27c6-1b42-4e11-a5c6-d9fae4c3cea6/59467342-87eb-43f5-bbd2-6058d44413fd;
+ Version=1; Expires=Thu, 13-Jun-2024 00:10:14 GMT; Max-Age=36000; Path=/realms/test/;
+ SameSite=None; Secure
+ - KEYCLOAK_SESSION_LEGACY=test/646e27c6-1b42-4e11-a5c6-d9fae4c3cea6/59467342-87eb-43f5-bbd2-6058d44413fd;
+ Version=1; Expires=Thu, 13-Jun-2024 00:10:14 GMT; Max-Age=36000; Path=/realms/test/
+ - KEYCLOAK_REMEMBER_ME=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test/; HttpOnly
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '0'
+ status:
+ code: 302
+ message: Found
+- request:
+ body: client_id=testid&client_secret=7DB3KUAAizYCcmZufpHRVOcD0TOkNO3I&grant_type=authorization_code&code=b8243d6b-a424-4789-9220-3b240309d7d9.59467342-87eb-43f5-bbd2-6058d44413fd.adf4ad83-4550-4619-9231-73bd8d700f45&redirect_uri=http%3A%2F%2Ftestserver%2Feherkenning-bewindvoering-oidc%2Fcallback%2F
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '293'
+ Content-Type:
+ - application/x-www-form-urlencoded
+ User-Agent:
+ - python-requests/2.32.2
+ method: POST
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/token
+ response:
+ body:
+ string: '{"access_token":"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTgyMDE3MTQsImlhdCI6MTcxODIwMTQxNCwiYXV0aF90aW1lIjoxNzE4MjAxNDE0LCJqdGkiOiJhNmZhMzZlMS1jMjEwLTRjYjItYmRhMS03NGEwNmNiZDk5NTUiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiNjQ2ZTI3YzYtMWI0Mi00ZTExLWE1YzYtZDlmYWU0YzNjZWE2IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoidGVzdGlkIiwibm9uY2UiOiJub3QtYS1yYW5kb20tc3RyaW5nIiwic2Vzc2lvbl9zdGF0ZSI6IjU5NDY3MzQyLTg3ZWItNDNmNS1iYmQyLTYwNThkNDQ0MTNmZCIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOlsiaHR0cDovLzEyNy4wLjAuMTo4MDAwIl0sInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJkZWZhdWx0LXJvbGVzLXRlc3QiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgZW1haWwgcHJvZmlsZSBrdmsgZ3JvdXBzIGJzbiIsInNpZCI6IjU5NDY3MzQyLTg3ZWItNDNmNS1iYmQyLTYwNThkNDQ0MTNmZCIsInNlcnZpY2VfdXVpZCI6IjgxMjE2ZmE0LTgwYTEtNDY4Ni1hOGFjLTVjOGU1YzAzMGM5MyIsImVtYWlsX3ZlcmlmaWVkIjpmYWxzZSwicmVwcmVzZW50ZWVCU04iOiIwMDAwMDAwMDAiLCJsZWdhbFN1YmplY3RJRCI6IjEyMzQ1Njc4IiwiYWN0aW5nU3ViamVjdElEIjoiNEI3NUEwRUExMDdCM0QzNiIsInNlcnZpY2VfaWQiOiJ1cm46ZXRvZWdhbmc6RFY6MDAwMDAwMDEwMDIzMDg4MzYwMDA6c2VydmljZXM6OTExMyIsImFhbnZyYWdlci5rdmsiOiIxMjM0NTY3OCIsIm5hbWVfcXVhbGlmaWVyIjoidXJuOmV0b2VnYW5nOjEuOTpFbnRpdHlDb25jZXJuZWRJRDpLdktuciIsImdyb3VwcyI6WyJkZWZhdWx0LXJvbGVzLXRlc3QiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl0sInByZWZlcnJlZF91c2VybmFtZSI6ImVoZXJrZW5uaW5nLWJld2luZHZvZXJpbmciLCJnZW1hY2h0aWdkZS5wc2V1ZG9JRCI6IjRCNzVBMEVBMTA3QjNEMzYifQ.uvbIm6t0O3ejJcOxZJ7TjjEMfVTMgECE43vzH-MWvTH6leGhy2fnkuPAeyLDAuirJrJRWWDGlT1mpjOCmk5KuUQUZ-TBVs3ruFs382lZdrrZsRv56i5lbi0QWEYi2BEOgWn9DXimmBn2Ll61DFk-nWw2t700CU_XnigvqFk7_kVCDmb0AU8qtQyl_ZhBf1UnM_HqMWfstyn3uzqbHmzShWd-JOizEzMXgsP2ikbrk-pOIpisUwWS5zU9EDR8qwyzjmm5qR5Ju1h64z1rf1WxndBpTpQ15rqfQQGC9jyhsu7wQV-832LDNlhiyfyyX-njJIKC8BuixGeLveU4z8G9jg","expires_in":300,"refresh_expires_in":1800,"refresh_token":"eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTgyMDMyMTQsImlhdCI6MTcxODIwMTQxNCwianRpIjoiZWQ3NTA3MWItNWM5OS00MDEwLThkYmQtMDkwNzEwZTczNzJhIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0IiwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiNjQ2ZTI3YzYtMWI0Mi00ZTExLWE1YzYtZDlmYWU0YzNjZWE2IiwidHlwIjoiUmVmcmVzaCIsImF6cCI6InRlc3RpZCIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsInNlc3Npb25fc3RhdGUiOiI1OTQ2NzM0Mi04N2ViLTQzZjUtYmJkMi02MDU4ZDQ0NDEzZmQiLCJzY29wZSI6Im9wZW5pZCBlbWFpbCBwcm9maWxlIGt2ayBncm91cHMgYnNuIiwic2lkIjoiNTk0NjczNDItODdlYi00M2Y1LWJiZDItNjA1OGQ0NDQxM2ZkIn0.uW1hp-l_9YZo22zAG1FwL1rjDTW0tn08UTDYVBx9b5g","token_type":"Bearer","id_token":"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTgyMDE3MTQsImlhdCI6MTcxODIwMTQxNCwiYXV0aF90aW1lIjoxNzE4MjAxNDE0LCJqdGkiOiIyOWU4N2Y4Mi0xYzcwLTQ5NzMtODAxZi05MmRjZWRmY2UxYzEiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJ0ZXN0aWQiLCJzdWIiOiI2NDZlMjdjNi0xYjQyLTRlMTEtYTVjNi1kOWZhZTRjM2NlYTYiLCJ0eXAiOiJJRCIsImF6cCI6InRlc3RpZCIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsInNlc3Npb25fc3RhdGUiOiI1OTQ2NzM0Mi04N2ViLTQzZjUtYmJkMi02MDU4ZDQ0NDEzZmQiLCJhdF9oYXNoIjoiOTRFQlBfNmc5NnJtc1pDeEdJRHlOZyIsImFjciI6IjEiLCJzaWQiOiI1OTQ2NzM0Mi04N2ViLTQzZjUtYmJkMi02MDU4ZDQ0NDEzZmQiLCJzZXJ2aWNlX3V1aWQiOiI4MTIxNmZhNC04MGExLTQ2ODYtYThhYy01YzhlNWMwMzBjOTMiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsInJlcHJlc2VudGVlQlNOIjoiMDAwMDAwMDAwIiwibGVnYWxTdWJqZWN0SUQiOiIxMjM0NTY3OCIsImFjdGluZ1N1YmplY3RJRCI6IjRCNzVBMEVBMTA3QjNEMzYiLCJzZXJ2aWNlX2lkIjoidXJuOmV0b2VnYW5nOkRWOjAwMDAwMDAxMDAyMzA4ODM2MDAwOnNlcnZpY2VzOjkxMTMiLCJhYW52cmFnZXIua3ZrIjoiMTIzNDU2NzgiLCJuYW1lX3F1YWxpZmllciI6InVybjpldG9lZ2FuZzoxLjk6RW50aXR5Q29uY2VybmVkSUQ6S3ZLbnIiLCJncm91cHMiOlsiZGVmYXVsdC1yb2xlcy10ZXN0Iiwib2ZmbGluZV9hY2Nlc3MiLCJ1bWFfYXV0aG9yaXphdGlvbiJdLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJlaGVya2VubmluZy1iZXdpbmR2b2VyaW5nIiwiZ2VtYWNodGlnZGUucHNldWRvSUQiOiI0Qjc1QTBFQTEwN0IzRDM2In0.wr6j_GmksqCo1mEu-Wc-viiyYWEOyBwLGt-on52gToY8A8S-mhu_3PulXJRLR92urAmSJ7jRA3FTDSlWnIm_Zer8AeYvtDMa5BgGcefauidAPLC7HqDqF8Acc1xpljCTAmVdEM1GR733LqDIRqUZDr-PqsMvp6HhsEzG2OqRLQBp8k0wEErU8DcsLdwDn4FtwaCTaY3fZpMpMpr7JoRlIqmbA-hDfDFYSy3Ad5kL21LegkH6MzRuEo7v3yGLE0iambBHjDrZTNPrwMO17b2YPbiElW0EwtALFwxhgHhRSC3-YAbOtploxAA7YZSvvEIGJobK1C6IRLGygr30k50d-g","not-before-policy":0,"session_state":"59467342-87eb-43f5-bbd2-6058d44413fd","scope":"openid
+ email profile kvk groups bsn"}'
+ headers:
+ Cache-Control:
+ - no-store
+ Content-Type:
+ - application/json
+ Pragma:
+ - no-cache
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '4549'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.32.2
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/certs
+ response:
+ body:
+ string: '{"keys":[{"kid":"4UNQAcvUcv-DFUOx_4O1gt13OdJSotqEKPZurs2vQW8","kty":"RSA","alg":"RS256","use":"sig","n":"2DOZ0qHie73SuFVR7civrl6r82YUiAghfzaMowjCg0o06AF--2lIS7vNV_PbsVVznPAAMqVrNG-8CcevEzvVZMQD9nH4DI7xlOxK0lrYu8rmMeSfOvXVbBVsWBZe0jnGNukZqjwmRE5__ttJdxPfIBT5-2L6mguQbDfhSUEEdIW7y7UfOXvqLqEcBtoIEB-ORKDTUIQwGZM5mSCy-cY3cHvvZfZVgaUUy5NvujPRXTMje4n_hG0KfEV-40G9qC2_Xvx4EooJzBZ6FSThiWhCpwhIvzcQqB6M9lHW7nU6wADhYPNCa2OKWvphwZ_zbrF4B9dmS6Zli5rBvbox9Hh45w","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMLTANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANgzmdKh4nu90rhVUe3Ir65eq/NmFIgIIX82jKMIwoNKNOgBfvtpSEu7zVfz27FVc5zwADKlazRvvAnHrxM71WTEA/Zx+AyO8ZTsStJa2LvK5jHknzr11WwVbFgWXtI5xjbpGao8JkROf/7bSXcT3yAU+fti+poLkGw34UlBBHSFu8u1Hzl76i6hHAbaCBAfjkSg01CEMBmTOZkgsvnGN3B772X2VYGlFMuTb7oz0V0zI3uJ/4RtCnxFfuNBvagtv178eBKKCcwWehUk4YloQqcISL83EKgejPZR1u51OsAA4WDzQmtjilr6YcGf826xeAfXZkumZYuawb26MfR4eOcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAsnQG/Yi2g1XTCJn74hWv9MjxVAaZb4gBAc2AWm5VgAjhFEM9h6x6m1mQkq7JM4rIdAj8jw55Ok9CBVBIqq4G4cME3eUvVytkj2lC9zcRoAivjjZF2HPg7zNPa2TTR50asmHPRokppV6gewO/C+o5as+4P2zqDXBh61aRd/9kdQfkg14LBbH5/dYccAuvUqlTYC4IEPCvVmBNC1xsMjf0vohvoSjm9vL2bfqG/RJH0ScdCjOd5d2zju4/e2oVdluWm+vzKBQplc7tVMuKpn6LcLmVHiGNAl+EBIZH+WVLlTx0D1+kbHZsfLYG53lQg2LsvurRbWyF/a5fVM/oLTn5ag=="],"x5t":"H5xfs1pRtvX0HyVTskx7eTXx88U","x5t#S256":"XurVtKAIEyc4w9HCGOhnjoRHnYu4d9HCn_5YHmkScJg"},{"kid":"TV3Tl5jIY1nrJLSb53UKEubLR5gYiq9slq1SsDDg1HU","kty":"RSA","alg":"RSA-OAEP","use":"enc","n":"pNvU3ecpVHbJT4bCOEpw6cnV1yi65tB3I0bRF2ilLVOY944QRAGnjBBECPIzNbgqavghYp1j75F2nq6_ny1CYfoaxTV2iDpRUw8_f7sliYbl8FrLLat0S25ItlZrg5TEJHObvOqlG2_nXoeH36MRWwNhms2uCqfhn5VgtenIzpQIBolnM7zzGp21NvdJ1C_ZAUzkXC-l3oQ-BXTtpEVM4h2KpYh4gfZJWCbYij5d1e1YApKD6V61_Cs3Oa2OY7CAUyq5kgAWJZFDB6CpzIr226u3bV7F9RbrQu3Ybc_Lv33EwykscLznKWZY2Mbs3Iz_rFNv3sVX_vHpH4DHWlKu7Q","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMlzANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKTb1N3nKVR2yU+GwjhKcOnJ1dcouubQdyNG0RdopS1TmPeOEEQBp4wQRAjyMzW4Kmr4IWKdY++Rdp6uv58tQmH6GsU1dog6UVMPP3+7JYmG5fBayy2rdEtuSLZWa4OUxCRzm7zqpRtv516Hh9+jEVsDYZrNrgqn4Z+VYLXpyM6UCAaJZzO88xqdtTb3SdQv2QFM5Fwvpd6EPgV07aRFTOIdiqWIeIH2SVgm2Io+XdXtWAKSg+letfwrNzmtjmOwgFMquZIAFiWRQwegqcyK9turt21exfUW60Lt2G3Py799xMMpLHC85ylmWNjG7NyM/6xTb97FV/7x6R+Ax1pSru0CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAQGJHeTYSMvp0yndbIn7DLohO9lom5nRrx/bLyb7TiRfogyJEF6rQZ66CAkQFk5eMF878fsHTuMVjtmXVBnhojhVmK91HwjsNQu/8xR6QMXNKJQMvHR245vwUGxlWRw/36ObM1D7QjCd/q+FonpBEY4m5Y6Uz1U0HR2Cbh0E2afVlPLeV+F0LKrlyVMdIaWBGWftCGIKDAHaG/PD66zbAKtxerv2fBIDq100WHPhd57BZxX+2aGJp1IaRDgkxV0E/CjEy3+Knd8xbAgUSW0Tl6OTC75exIvlbzeluEBe0wlapAb7WvBKYsipSW8G8Ey7tjoolDT4AU82EaKUPstiMnA=="],"x5t":"AlfHDI0FOPQpt3RBAILt0dtW1yw","x5t#S256":"a7bhm8-JsnfY7bL_m8Yl72hgmp5516VZlFcVloKzk08"}]}'
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/json;charset=UTF-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '2909'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Authorization:
+ - Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTgyMDE3MTQsImlhdCI6MTcxODIwMTQxNCwiYXV0aF90aW1lIjoxNzE4MjAxNDE0LCJqdGkiOiJhNmZhMzZlMS1jMjEwLTRjYjItYmRhMS03NGEwNmNiZDk5NTUiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiNjQ2ZTI3YzYtMWI0Mi00ZTExLWE1YzYtZDlmYWU0YzNjZWE2IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoidGVzdGlkIiwibm9uY2UiOiJub3QtYS1yYW5kb20tc3RyaW5nIiwic2Vzc2lvbl9zdGF0ZSI6IjU5NDY3MzQyLTg3ZWItNDNmNS1iYmQyLTYwNThkNDQ0MTNmZCIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOlsiaHR0cDovLzEyNy4wLjAuMTo4MDAwIl0sInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJkZWZhdWx0LXJvbGVzLXRlc3QiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgZW1haWwgcHJvZmlsZSBrdmsgZ3JvdXBzIGJzbiIsInNpZCI6IjU5NDY3MzQyLTg3ZWItNDNmNS1iYmQyLTYwNThkNDQ0MTNmZCIsInNlcnZpY2VfdXVpZCI6IjgxMjE2ZmE0LTgwYTEtNDY4Ni1hOGFjLTVjOGU1YzAzMGM5MyIsImVtYWlsX3ZlcmlmaWVkIjpmYWxzZSwicmVwcmVzZW50ZWVCU04iOiIwMDAwMDAwMDAiLCJsZWdhbFN1YmplY3RJRCI6IjEyMzQ1Njc4IiwiYWN0aW5nU3ViamVjdElEIjoiNEI3NUEwRUExMDdCM0QzNiIsInNlcnZpY2VfaWQiOiJ1cm46ZXRvZWdhbmc6RFY6MDAwMDAwMDEwMDIzMDg4MzYwMDA6c2VydmljZXM6OTExMyIsImFhbnZyYWdlci5rdmsiOiIxMjM0NTY3OCIsIm5hbWVfcXVhbGlmaWVyIjoidXJuOmV0b2VnYW5nOjEuOTpFbnRpdHlDb25jZXJuZWRJRDpLdktuciIsImdyb3VwcyI6WyJkZWZhdWx0LXJvbGVzLXRlc3QiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl0sInByZWZlcnJlZF91c2VybmFtZSI6ImVoZXJrZW5uaW5nLWJld2luZHZvZXJpbmciLCJnZW1hY2h0aWdkZS5wc2V1ZG9JRCI6IjRCNzVBMEVBMTA3QjNEMzYifQ.uvbIm6t0O3ejJcOxZJ7TjjEMfVTMgECE43vzH-MWvTH6leGhy2fnkuPAeyLDAuirJrJRWWDGlT1mpjOCmk5KuUQUZ-TBVs3ruFs382lZdrrZsRv56i5lbi0QWEYi2BEOgWn9DXimmBn2Ll61DFk-nWw2t700CU_XnigvqFk7_kVCDmb0AU8qtQyl_ZhBf1UnM_HqMWfstyn3uzqbHmzShWd-JOizEzMXgsP2ikbrk-pOIpisUwWS5zU9EDR8qwyzjmm5qR5Ju1h64z1rf1WxndBpTpQ15rqfQQGC9jyhsu7wQV-832LDNlhiyfyyX-njJIKC8BuixGeLveU4z8G9jg
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.32.2
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/userinfo
+ response:
+ body:
+ string: eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJzdWIiOiI2NDZlMjdjNi0xYjQyLTRlMTEtYTVjNi1kOWZhZTRjM2NlYTYiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsInJlcHJlc2VudGVlQlNOIjoiMDAwMDAwMDAwIiwiYWN0aW5nU3ViamVjdElEIjoiNEI3NUEwRUExMDdCM0QzNiIsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9yZWFsbXMvdGVzdCIsImdyb3VwcyI6WyJkZWZhdWx0LXJvbGVzLXRlc3QiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl0sInByZWZlcnJlZF91c2VybmFtZSI6ImVoZXJrZW5uaW5nLWJld2luZHZvZXJpbmciLCJhdWQiOiJ0ZXN0aWQiLCJzZXJ2aWNlX3V1aWQiOiI4MTIxNmZhNC04MGExLTQ2ODYtYThhYy01YzhlNWMwMzBjOTMiLCJsZWdhbFN1YmplY3RJRCI6IjEyMzQ1Njc4Iiwic2VydmljZV9pZCI6InVybjpldG9lZ2FuZzpEVjowMDAwMDAwMTAwMjMwODgzNjAwMDpzZXJ2aWNlczo5MTEzIiwiYWFudnJhZ2VyLmt2ayI6IjEyMzQ1Njc4IiwibmFtZV9xdWFsaWZpZXIiOiJ1cm46ZXRvZWdhbmc6MS45OkVudGl0eUNvbmNlcm5lZElEOkt2S25yIiwiZ2VtYWNodGlnZGUucHNldWRvSUQiOiI0Qjc1QTBFQTEwN0IzRDM2In0.RhfYXFdUrTNVxjwiyAvZK936u8Riw3A5HBQhl5SPzf3RB-qkr9jdemR4myyZWsevKpDfGpvjNVYL_lfwEd9PHATNxbuZIfOUySLfoW9Qg_NQF0uw_Y02enR9x4_ujtpitwpBk4lUh35_yTOtoi3qy05uj1f5NB-cvLdxYWVXL5V_Y92Ezf5inxFwxM-BvLkRO7aJn-S5FG4Lox1caMXtsBWwFTXmq1sm8eEY6tDqd7_HP5AK9zDqYlJsmYGcJJwtcTqJqP1jUBbWsQCzv4rp-V0xGLruIlEi8-VZd5MWs_CDkD_HYQACyAw-xsJevjMCsQcsCADD6V3HfWdPNsP3Sg
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/jwt
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '1238'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.32.2
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/certs
+ response:
+ body:
+ string: '{"keys":[{"kid":"4UNQAcvUcv-DFUOx_4O1gt13OdJSotqEKPZurs2vQW8","kty":"RSA","alg":"RS256","use":"sig","n":"2DOZ0qHie73SuFVR7civrl6r82YUiAghfzaMowjCg0o06AF--2lIS7vNV_PbsVVznPAAMqVrNG-8CcevEzvVZMQD9nH4DI7xlOxK0lrYu8rmMeSfOvXVbBVsWBZe0jnGNukZqjwmRE5__ttJdxPfIBT5-2L6mguQbDfhSUEEdIW7y7UfOXvqLqEcBtoIEB-ORKDTUIQwGZM5mSCy-cY3cHvvZfZVgaUUy5NvujPRXTMje4n_hG0KfEV-40G9qC2_Xvx4EooJzBZ6FSThiWhCpwhIvzcQqB6M9lHW7nU6wADhYPNCa2OKWvphwZ_zbrF4B9dmS6Zli5rBvbox9Hh45w","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMLTANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANgzmdKh4nu90rhVUe3Ir65eq/NmFIgIIX82jKMIwoNKNOgBfvtpSEu7zVfz27FVc5zwADKlazRvvAnHrxM71WTEA/Zx+AyO8ZTsStJa2LvK5jHknzr11WwVbFgWXtI5xjbpGao8JkROf/7bSXcT3yAU+fti+poLkGw34UlBBHSFu8u1Hzl76i6hHAbaCBAfjkSg01CEMBmTOZkgsvnGN3B772X2VYGlFMuTb7oz0V0zI3uJ/4RtCnxFfuNBvagtv178eBKKCcwWehUk4YloQqcISL83EKgejPZR1u51OsAA4WDzQmtjilr6YcGf826xeAfXZkumZYuawb26MfR4eOcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAsnQG/Yi2g1XTCJn74hWv9MjxVAaZb4gBAc2AWm5VgAjhFEM9h6x6m1mQkq7JM4rIdAj8jw55Ok9CBVBIqq4G4cME3eUvVytkj2lC9zcRoAivjjZF2HPg7zNPa2TTR50asmHPRokppV6gewO/C+o5as+4P2zqDXBh61aRd/9kdQfkg14LBbH5/dYccAuvUqlTYC4IEPCvVmBNC1xsMjf0vohvoSjm9vL2bfqG/RJH0ScdCjOd5d2zju4/e2oVdluWm+vzKBQplc7tVMuKpn6LcLmVHiGNAl+EBIZH+WVLlTx0D1+kbHZsfLYG53lQg2LsvurRbWyF/a5fVM/oLTn5ag=="],"x5t":"H5xfs1pRtvX0HyVTskx7eTXx88U","x5t#S256":"XurVtKAIEyc4w9HCGOhnjoRHnYu4d9HCn_5YHmkScJg"},{"kid":"TV3Tl5jIY1nrJLSb53UKEubLR5gYiq9slq1SsDDg1HU","kty":"RSA","alg":"RSA-OAEP","use":"enc","n":"pNvU3ecpVHbJT4bCOEpw6cnV1yi65tB3I0bRF2ilLVOY944QRAGnjBBECPIzNbgqavghYp1j75F2nq6_ny1CYfoaxTV2iDpRUw8_f7sliYbl8FrLLat0S25ItlZrg5TEJHObvOqlG2_nXoeH36MRWwNhms2uCqfhn5VgtenIzpQIBolnM7zzGp21NvdJ1C_ZAUzkXC-l3oQ-BXTtpEVM4h2KpYh4gfZJWCbYij5d1e1YApKD6V61_Cs3Oa2OY7CAUyq5kgAWJZFDB6CpzIr226u3bV7F9RbrQu3Ybc_Lv33EwykscLznKWZY2Mbs3Iz_rFNv3sVX_vHpH4DHWlKu7Q","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMlzANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKTb1N3nKVR2yU+GwjhKcOnJ1dcouubQdyNG0RdopS1TmPeOEEQBp4wQRAjyMzW4Kmr4IWKdY++Rdp6uv58tQmH6GsU1dog6UVMPP3+7JYmG5fBayy2rdEtuSLZWa4OUxCRzm7zqpRtv516Hh9+jEVsDYZrNrgqn4Z+VYLXpyM6UCAaJZzO88xqdtTb3SdQv2QFM5Fwvpd6EPgV07aRFTOIdiqWIeIH2SVgm2Io+XdXtWAKSg+letfwrNzmtjmOwgFMquZIAFiWRQwegqcyK9turt21exfUW60Lt2G3Py799xMMpLHC85ylmWNjG7NyM/6xTb97FV/7x6R+Ax1pSru0CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAQGJHeTYSMvp0yndbIn7DLohO9lom5nRrx/bLyb7TiRfogyJEF6rQZ66CAkQFk5eMF878fsHTuMVjtmXVBnhojhVmK91HwjsNQu/8xR6QMXNKJQMvHR245vwUGxlWRw/36ObM1D7QjCd/q+FonpBEY4m5Y6Uz1U0HR2Cbh0E2afVlPLeV+F0LKrlyVMdIaWBGWftCGIKDAHaG/PD66zbAKtxerv2fBIDq100WHPhd57BZxX+2aGJp1IaRDgkxV0E/CjEy3+Knd8xbAgUSW0Tl6OTC75exIvlbzeluEBe0wlapAb7WvBKYsipSW8G8Ey7tjoolDT4AU82EaKUPstiMnA=="],"x5t":"AlfHDI0FOPQpt3RBAILt0dtW1yw","x5t#S256":"a7bhm8-JsnfY7bL_m8Yl72hgmp5516VZlFcVloKzk08"}]}'
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/json;charset=UTF-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '2909'
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/EHerkenningBewindvoeringInitTests/EHerkenningBewindvoeringInitTests.test_idp_availability_check.yaml b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/EHerkenningBewindvoeringInitTests/EHerkenningBewindvoeringInitTests.test_idp_availability_check.yaml
new file mode 100644
index 0000000000..e786ba2dc4
--- /dev/null
+++ b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/EHerkenningBewindvoeringInitTests/EHerkenningBewindvoeringInitTests.test_idp_availability_check.yaml
@@ -0,0 +1,26 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/i-dont-exist
+ response:
+ body:
+ string: '{"error":"Unable to find matching target resource method"}'
+ headers:
+ Content-Type:
+ - application/json
+ content-length:
+ - '58'
+ status:
+ code: 404
+ message: Not Found
+version: 1
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/EHerkenningBewindvoeringInitTests/EHerkenningBewindvoeringInitTests.test_keycloak_idp_hint_is_respected.yaml b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/EHerkenningBewindvoeringInitTests/EHerkenningBewindvoeringInitTests.test_keycloak_idp_hint_is_respected.yaml
new file mode 100644
index 0000000000..7556222e57
--- /dev/null
+++ b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/EHerkenningBewindvoeringInitTests/EHerkenningBewindvoeringInitTests.test_keycloak_idp_hint_is_respected.yaml
@@ -0,0 +1,59 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n\n\n\n\n\n\n"
+ headers:
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '1573'
+ status:
+ code: 400
+ message: Bad Request
+version: 1
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/EHerkenningBewindvoeringInitTests/EHerkenningBewindvoeringInitTests.test_start_flow_redirects_to_oidc_provider.yaml b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/EHerkenningBewindvoeringInitTests/EHerkenningBewindvoeringInitTests.test_start_flow_redirects_to_oidc_provider.yaml
new file mode 100644
index 0000000000..7556222e57
--- /dev/null
+++ b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/EHerkenningBewindvoeringInitTests/EHerkenningBewindvoeringInitTests.test_start_flow_redirects_to_oidc_provider.yaml
@@ -0,0 +1,59 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n\n\n\n\n\n\n"
+ headers:
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '1573'
+ status:
+ code: 400
+ message: Bad Request
+version: 1
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/EHerkenningBewindvoeringLogoutTests/EHerkenningBewindvoeringLogoutTests.test_logout_also_logs_out_user_in_openid_provider.yaml b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/EHerkenningBewindvoeringLogoutTests/EHerkenningBewindvoeringLogoutTests.test_logout_also_logs_out_user_in_openid_provider.yaml
new file mode 100644
index 0000000000..29410a98c6
--- /dev/null
+++ b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/EHerkenningBewindvoeringLogoutTests/EHerkenningBewindvoeringLogoutTests.test_logout_also_logs_out_user_in_openid_provider.yaml
@@ -0,0 +1,727 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n\n\n\n\n\n\n"
+ headers:
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '1573'
+ status:
+ code: 400
+ message: Bad Request
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth?response_type=code&scope=openid+bsn&client_id=testid&redirect_uri=http%3A%2F%2Ftestserver%2Feherkenning-bewindvoering-oidc%2Fcallback%2F&state=not-a-random-string&nonce=not-a-random-string
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n \n\n\n\n\n
+ \ \n
\n
+ \ \n
\n
+ \
\n\n\n
\n \n\n\n\n\n\n
+ \
\n
\n\n
\n
\n\n\n"
+ headers:
+ Cache-Control:
+ - no-store, must-revalidate, max-age=0
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Set-Cookie:
+ - AUTH_SESSION_ID=82194c00-d9f5-4403-b1e5-2b93691a28cc; Version=1; Path=/realms/test/;
+ SameSite=None; Secure; HttpOnly
+ - AUTH_SESSION_ID_LEGACY=82194c00-d9f5-4403-b1e5-2b93691a28cc; Version=1; Path=/realms/test/;
+ HttpOnly
+ - KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJjaWQiOiJ0ZXN0aWQiLCJwdHkiOiJvcGVuaWQtY29ubmVjdCIsInJ1cmkiOiJodHRwOi8vdGVzdHNlcnZlci9laGVya2VubmluZy1iZXdpbmR2b2VyaW5nLW9pZGMvY2FsbGJhY2svIiwiYWN0IjoiQVVUSEVOVElDQVRFIiwibm90ZXMiOnsic2NvcGUiOiJvcGVuaWQgYnNuIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0IiwicmVzcG9uc2VfdHlwZSI6ImNvZGUiLCJyZWRpcmVjdF91cmkiOiJodHRwOi8vdGVzdHNlcnZlci9laGVya2VubmluZy1iZXdpbmR2b2VyaW5nLW9pZGMvY2FsbGJhY2svIiwic3RhdGUiOiJub3QtYS1yYW5kb20tc3RyaW5nIiwibm9uY2UiOiJub3QtYS1yYW5kb20tc3RyaW5nIn19.ohW_ibsZCPn53GegGr49538xdqveI5gt43AvtPXb9ro;
+ Version=1; Path=/realms/test/; HttpOnly
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '4466'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: username=eherkenning-bewindvoering&password=eherkenning-bewindvoering&credentialId=&login=Sign+In
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '97'
+ Content-Type:
+ - application/x-www-form-urlencoded
+ Cookie:
+ - AUTH_SESSION_ID_LEGACY=82194c00-d9f5-4403-b1e5-2b93691a28cc; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJjaWQiOiJ0ZXN0aWQiLCJwdHkiOiJvcGVuaWQtY29ubmVjdCIsInJ1cmkiOiJodHRwOi8vdGVzdHNlcnZlci9laGVya2VubmluZy1iZXdpbmR2b2VyaW5nLW9pZGMvY2FsbGJhY2svIiwiYWN0IjoiQVVUSEVOVElDQVRFIiwibm90ZXMiOnsic2NvcGUiOiJvcGVuaWQgYnNuIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0IiwicmVzcG9uc2VfdHlwZSI6ImNvZGUiLCJyZWRpcmVjdF91cmkiOiJodHRwOi8vdGVzdHNlcnZlci9laGVya2VubmluZy1iZXdpbmR2b2VyaW5nLW9pZGMvY2FsbGJhY2svIiwic3RhdGUiOiJub3QtYS1yYW5kb20tc3RyaW5nIiwibm9uY2UiOiJub3QtYS1yYW5kb20tc3RyaW5nIn19.ohW_ibsZCPn53GegGr49538xdqveI5gt43AvtPXb9ro
+ User-Agent:
+ - python-requests/2.31.0
+ method: POST
+ uri: http://localhost:8080/realms/test/login-actions/authenticate?session_code=PLahQUDZj3otjq4NBFNomjVb6TsBKd7ZKCbSqmZbaBo&execution=d8b8778e-a545-45d4-8f72-fd69facf4b72&client_id=testid&tab_id=BYyH0vlAKIw
+ response:
+ body:
+ string: ''
+ headers:
+ Cache-Control:
+ - no-store, must-revalidate, max-age=0
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Location:
+ - http://testserver/eherkenning-bewindvoering-oidc/callback/?state=not-a-random-string&session_state=82194c00-d9f5-4403-b1e5-2b93691a28cc&iss=http%3A%2F%2Flocalhost%3A8080%2Frealms%2Ftest&code=aa113bfc-7bec-4d9d-8815-b65dd677ece0.82194c00-d9f5-4403-b1e5-2b93691a28cc.adf4ad83-4550-4619-9231-73bd8d700f45
+ Referrer-Policy:
+ - no-referrer
+ Set-Cookie:
+ - KEYCLOAK_LOCALE=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test/; HttpOnly
+ - KC_RESTART=; Version=1; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0;
+ Path=/realms/test/; HttpOnly
+ - KC_AUTH_STATE=; Version=1; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0;
+ Path=/realms/test/
+ - KEYCLOAK_IDENTITY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTY0OTY4MDMsImlhdCI6MTcxNjQ2MDgwMywianRpIjoiMjEyMzliMTMtZDRjMC00YjVkLWJjMTEtYWNlNjc2YzhlYzdmIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiNjQ2ZTI3YzYtMWI0Mi00ZTExLWE1YzYtZDlmYWU0YzNjZWE2IiwidHlwIjoiU2VyaWFsaXplZC1JRCIsInNlc3Npb25fc3RhdGUiOiI4MjE5NGMwMC1kOWY1LTQ0MDMtYjFlNS0yYjkzNjkxYTI4Y2MiLCJzaWQiOiI4MjE5NGMwMC1kOWY1LTQ0MDMtYjFlNS0yYjkzNjkxYTI4Y2MiLCJzdGF0ZV9jaGVja2VyIjoiWFljb0Vod19qZ0gtdnVHdklHZ2dMRUdHWVl5VzYtczRoS1RWcEpEVXFGNCJ9.gT_heDZAUGrGUMUVEtJT3TsjgF-CcKC4wZN4GxpgLAg;
+ Version=1; Path=/realms/test/; SameSite=None; Secure; HttpOnly
+ - KEYCLOAK_IDENTITY_LEGACY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTY0OTY4MDMsImlhdCI6MTcxNjQ2MDgwMywianRpIjoiMjEyMzliMTMtZDRjMC00YjVkLWJjMTEtYWNlNjc2YzhlYzdmIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiNjQ2ZTI3YzYtMWI0Mi00ZTExLWE1YzYtZDlmYWU0YzNjZWE2IiwidHlwIjoiU2VyaWFsaXplZC1JRCIsInNlc3Npb25fc3RhdGUiOiI4MjE5NGMwMC1kOWY1LTQ0MDMtYjFlNS0yYjkzNjkxYTI4Y2MiLCJzaWQiOiI4MjE5NGMwMC1kOWY1LTQ0MDMtYjFlNS0yYjkzNjkxYTI4Y2MiLCJzdGF0ZV9jaGVja2VyIjoiWFljb0Vod19qZ0gtdnVHdklHZ2dMRUdHWVl5VzYtczRoS1RWcEpEVXFGNCJ9.gT_heDZAUGrGUMUVEtJT3TsjgF-CcKC4wZN4GxpgLAg;
+ Version=1; Path=/realms/test/; HttpOnly
+ - KEYCLOAK_SESSION=test/646e27c6-1b42-4e11-a5c6-d9fae4c3cea6/82194c00-d9f5-4403-b1e5-2b93691a28cc;
+ Version=1; Expires=Thu, 23-May-2024 20:40:03 GMT; Max-Age=36000; Path=/realms/test/;
+ SameSite=None; Secure
+ - KEYCLOAK_SESSION_LEGACY=test/646e27c6-1b42-4e11-a5c6-d9fae4c3cea6/82194c00-d9f5-4403-b1e5-2b93691a28cc;
+ Version=1; Expires=Thu, 23-May-2024 20:40:03 GMT; Max-Age=36000; Path=/realms/test/
+ - KEYCLOAK_REMEMBER_ME=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test/; HttpOnly
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '0'
+ status:
+ code: 302
+ message: Found
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n\n\n\n\n\n\n"
+ headers:
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '1573'
+ status:
+ code: 400
+ message: Bad Request
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ Cookie:
+ - AUTH_SESSION_ID_LEGACY=82194c00-d9f5-4403-b1e5-2b93691a28cc; KEYCLOAK_IDENTITY_LEGACY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTY0OTY4MDMsImlhdCI6MTcxNjQ2MDgwMywianRpIjoiMjEyMzliMTMtZDRjMC00YjVkLWJjMTEtYWNlNjc2YzhlYzdmIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiNjQ2ZTI3YzYtMWI0Mi00ZTExLWE1YzYtZDlmYWU0YzNjZWE2IiwidHlwIjoiU2VyaWFsaXplZC1JRCIsInNlc3Npb25fc3RhdGUiOiI4MjE5NGMwMC1kOWY1LTQ0MDMtYjFlNS0yYjkzNjkxYTI4Y2MiLCJzaWQiOiI4MjE5NGMwMC1kOWY1LTQ0MDMtYjFlNS0yYjkzNjkxYTI4Y2MiLCJzdGF0ZV9jaGVja2VyIjoiWFljb0Vod19qZ0gtdnVHdklHZ2dMRUdHWVl5VzYtczRoS1RWcEpEVXFGNCJ9.gT_heDZAUGrGUMUVEtJT3TsjgF-CcKC4wZN4GxpgLAg;
+ KEYCLOAK_SESSION_LEGACY=test/646e27c6-1b42-4e11-a5c6-d9fae4c3cea6/82194c00-d9f5-4403-b1e5-2b93691a28cc
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth?response_type=code&scope=openid+bsn&client_id=testid&redirect_uri=http%3A%2F%2Ftestserver%2Feherkenning-bewindvoering-oidc%2Fcallback%2F&state=not-a-random-string&nonce=not-a-random-string
+ response:
+ body:
+ string: ''
+ headers:
+ Cache-Control:
+ - no-store, must-revalidate, max-age=0
+ Location:
+ - http://testserver/eherkenning-bewindvoering-oidc/callback/?state=not-a-random-string&session_state=82194c00-d9f5-4403-b1e5-2b93691a28cc&iss=http%3A%2F%2Flocalhost%3A8080%2Frealms%2Ftest&code=b9d11f0d-b995-4849-a7f0-3e8439b618e7.82194c00-d9f5-4403-b1e5-2b93691a28cc.adf4ad83-4550-4619-9231-73bd8d700f45
+ Referrer-Policy:
+ - no-referrer
+ Set-Cookie:
+ - KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJjaWQiOiJ0ZXN0aWQiLCJwdHkiOiJvcGVuaWQtY29ubmVjdCIsInJ1cmkiOiJodHRwOi8vdGVzdHNlcnZlci9laGVya2VubmluZy1iZXdpbmR2b2VyaW5nLW9pZGMvY2FsbGJhY2svIiwiYWN0IjoiQVVUSEVOVElDQVRFIiwibm90ZXMiOnsic2NvcGUiOiJvcGVuaWQgYnNuIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0IiwicmVzcG9uc2VfdHlwZSI6ImNvZGUiLCJyZWRpcmVjdF91cmkiOiJodHRwOi8vdGVzdHNlcnZlci9laGVya2VubmluZy1iZXdpbmR2b2VyaW5nLW9pZGMvY2FsbGJhY2svIiwic3RhdGUiOiJub3QtYS1yYW5kb20tc3RyaW5nIiwibm9uY2UiOiJub3QtYS1yYW5kb20tc3RyaW5nIn19.ohW_ibsZCPn53GegGr49538xdqveI5gt43AvtPXb9ro;
+ Version=1; Path=/realms/test/; HttpOnly
+ - KEYCLOAK_LOCALE=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test/; HttpOnly
+ - KC_RESTART=; Version=1; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0;
+ Path=/realms/test/; HttpOnly
+ - KC_AUTH_STATE=; Version=1; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0;
+ Path=/realms/test/
+ - KEYCLOAK_IDENTITY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTY0OTY4MDMsImlhdCI6MTcxNjQ2MDgwMywianRpIjoiNWYwNzYwYWUtNjUzNy00YjhmLTg3MmQtZGExYTNkYTUwOGU0IiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiNjQ2ZTI3YzYtMWI0Mi00ZTExLWE1YzYtZDlmYWU0YzNjZWE2IiwidHlwIjoiU2VyaWFsaXplZC1JRCIsInNlc3Npb25fc3RhdGUiOiI4MjE5NGMwMC1kOWY1LTQ0MDMtYjFlNS0yYjkzNjkxYTI4Y2MiLCJzaWQiOiI4MjE5NGMwMC1kOWY1LTQ0MDMtYjFlNS0yYjkzNjkxYTI4Y2MiLCJzdGF0ZV9jaGVja2VyIjoiWFljb0Vod19qZ0gtdnVHdklHZ2dMRUdHWVl5VzYtczRoS1RWcEpEVXFGNCJ9.lOmH652_tr0WEEoqH1cpuvjHY4F3oRz03N6siaSGL9o;
+ Version=1; Path=/realms/test/; SameSite=None; Secure; HttpOnly
+ - KEYCLOAK_IDENTITY_LEGACY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTY0OTY4MDMsImlhdCI6MTcxNjQ2MDgwMywianRpIjoiNWYwNzYwYWUtNjUzNy00YjhmLTg3MmQtZGExYTNkYTUwOGU0IiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiNjQ2ZTI3YzYtMWI0Mi00ZTExLWE1YzYtZDlmYWU0YzNjZWE2IiwidHlwIjoiU2VyaWFsaXplZC1JRCIsInNlc3Npb25fc3RhdGUiOiI4MjE5NGMwMC1kOWY1LTQ0MDMtYjFlNS0yYjkzNjkxYTI4Y2MiLCJzaWQiOiI4MjE5NGMwMC1kOWY1LTQ0MDMtYjFlNS0yYjkzNjkxYTI4Y2MiLCJzdGF0ZV9jaGVja2VyIjoiWFljb0Vod19qZ0gtdnVHdklHZ2dMRUdHWVl5VzYtczRoS1RWcEpEVXFGNCJ9.lOmH652_tr0WEEoqH1cpuvjHY4F3oRz03N6siaSGL9o;
+ Version=1; Path=/realms/test/; HttpOnly
+ - KEYCLOAK_SESSION=test/646e27c6-1b42-4e11-a5c6-d9fae4c3cea6/82194c00-d9f5-4403-b1e5-2b93691a28cc;
+ Version=1; Expires=Thu, 23-May-2024 20:40:03 GMT; Max-Age=36000; Path=/realms/test/;
+ SameSite=None; Secure
+ - KEYCLOAK_SESSION_LEGACY=test/646e27c6-1b42-4e11-a5c6-d9fae4c3cea6/82194c00-d9f5-4403-b1e5-2b93691a28cc;
+ Version=1; Expires=Thu, 23-May-2024 20:40:03 GMT; Max-Age=36000; Path=/realms/test/
+ - KEYCLOAK_REMEMBER_ME=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test/; HttpOnly
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '0'
+ status:
+ code: 302
+ message: Found
+- request:
+ body: client_id=testid&client_secret=7DB3KUAAizYCcmZufpHRVOcD0TOkNO3I&grant_type=authorization_code&code=b9d11f0d-b995-4849-a7f0-3e8439b618e7.82194c00-d9f5-4403-b1e5-2b93691a28cc.adf4ad83-4550-4619-9231-73bd8d700f45&redirect_uri=http%3A%2F%2Ftestserver%2Feherkenning-bewindvoering-oidc%2Fcallback%2F
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '293'
+ Content-Type:
+ - application/x-www-form-urlencoded
+ User-Agent:
+ - python-requests/2.31.0
+ method: POST
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/token
+ response:
+ body:
+ string: '{"access_token":"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTY0NjExMDMsImlhdCI6MTcxNjQ2MDgwMywiYXV0aF90aW1lIjoxNzE2NDYwODAzLCJqdGkiOiI4ZmZkYTBlZi05OGNhLTRkZmItYjg3Yy04M2U0OWMyYmU1NTkiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiNjQ2ZTI3YzYtMWI0Mi00ZTExLWE1YzYtZDlmYWU0YzNjZWE2IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoidGVzdGlkIiwibm9uY2UiOiJub3QtYS1yYW5kb20tc3RyaW5nIiwic2Vzc2lvbl9zdGF0ZSI6IjgyMTk0YzAwLWQ5ZjUtNDQwMy1iMWU1LTJiOTM2OTFhMjhjYyIsImFjciI6IjAiLCJhbGxvd2VkLW9yaWdpbnMiOlsiaHR0cDovLzEyNy4wLjAuMTo4MDAwIl0sInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJkZWZhdWx0LXJvbGVzLXRlc3QiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgZW1haWwgcHJvZmlsZSBrdmsgYnNuIiwic2lkIjoiODIxOTRjMDAtZDlmNS00NDAzLWIxZTUtMmI5MzY5MWEyOGNjIiwiZW1haWxfdmVyaWZpZWQiOmZhbHNlLCJhYW52cmFnZXIua3ZrIjoiMTIzNDU2NzgiLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJlaGVya2VubmluZy1iZXdpbmR2b2VyaW5nIiwiZ2VtYWNodGlnZGUucHNldWRvSUQiOiI0Qjc1QTBFQTEwN0IzRDM2In0.BUeSbTSQGpYcyYiuWDjgSpOiWiA_S5TE-dSPcali6P2jt-kuDMvgmNJg_nk5kTyxJyQpEKHYFhqot_KipRz1-3oaeWtztTGQIf7BQ4InqXA2W5AiYRFyyn7aOqKKPDCikxP5_pYIHkgmtOQHOtABCgVShz_A0C7Qb0ASgjoOXdnJNCrjoPQJloemqP6tn2hsh7JfMM0gEoHEoCVQxcfDe4N0KRPzMnrumyZfnV7wXUjHn1uQk3gUVfRtWImK7VbUvCm0LjU1Bz5-Gtt5pWcLma4uh8DyC975s5OPTk96G_0WtGS38PpCGjktb4N9aARXACbW6PCYD0H9mO2IIxH0rQ","expires_in":300,"refresh_expires_in":1800,"refresh_token":"eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTY0NjI2MDMsImlhdCI6MTcxNjQ2MDgwMywianRpIjoiZDcxNTdlNjEtOWU2My00OTQ3LTk0ZmMtYTEyODAwNGQyY2FkIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0IiwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiNjQ2ZTI3YzYtMWI0Mi00ZTExLWE1YzYtZDlmYWU0YzNjZWE2IiwidHlwIjoiUmVmcmVzaCIsImF6cCI6InRlc3RpZCIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsInNlc3Npb25fc3RhdGUiOiI4MjE5NGMwMC1kOWY1LTQ0MDMtYjFlNS0yYjkzNjkxYTI4Y2MiLCJzY29wZSI6Im9wZW5pZCBlbWFpbCBwcm9maWxlIGt2ayBic24iLCJzaWQiOiI4MjE5NGMwMC1kOWY1LTQ0MDMtYjFlNS0yYjkzNjkxYTI4Y2MifQ.yTzEY-zNLccnSm12fsQSmR8q27UEkUBIXDWdHX356SY","token_type":"Bearer","id_token":"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTY0NjExMDMsImlhdCI6MTcxNjQ2MDgwMywiYXV0aF90aW1lIjoxNzE2NDYwODAzLCJqdGkiOiI0MGQyMTk2Mi1lMTNmLTQzYTQtOWJiZi0wNzA0Y2RlMTg5MDMiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJ0ZXN0aWQiLCJzdWIiOiI2NDZlMjdjNi0xYjQyLTRlMTEtYTVjNi1kOWZhZTRjM2NlYTYiLCJ0eXAiOiJJRCIsImF6cCI6InRlc3RpZCIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsInNlc3Npb25fc3RhdGUiOiI4MjE5NGMwMC1kOWY1LTQ0MDMtYjFlNS0yYjkzNjkxYTI4Y2MiLCJhdF9oYXNoIjoiMzMyTmlpNXY0dGhzR092WHB4eDNDUSIsImFjciI6IjAiLCJzaWQiOiI4MjE5NGMwMC1kOWY1LTQ0MDMtYjFlNS0yYjkzNjkxYTI4Y2MiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsImFhbnZyYWdlci5rdmsiOiIxMjM0NTY3OCIsInByZWZlcnJlZF91c2VybmFtZSI6ImVoZXJrZW5uaW5nLWJld2luZHZvZXJpbmciLCJnZW1hY2h0aWdkZS5wc2V1ZG9JRCI6IjRCNzVBMEVBMTA3QjNEMzYifQ.S-2gbcTyzr25mH191wS9SgWZ_ADR7C7kSMqKL37Ku8HnVaJkrHYDftbn3aYeMDutR6cS7uRJ_Yvo17HnOSXV47B6jaBGPYJCzibxm9vDgYC-2idQskW-68EXBm9cUuwcqa324KocODFg3VZbC0JpiCWX5hNS8txGYB4zFqy-uO4GP1p0nlQKMteBeyv0hQi-j5sOhBUrxVus-ddXeTPJkM8x3TvrfH9Paie_Ya4ybAGZpcY9qJNgj25xFLeS-fOQetGNDWtbonPzWaMk6FsSgvcRZAqnI6wzpyEYGeuoffwiF63_BK56IjeiW2tCOcd5NsGeE4BwlO_n-NlVoorSzQ","not-before-policy":0,"session_state":"82194c00-d9f5-4403-b1e5-2b93691a28cc","scope":"openid
+ email profile kvk bsn"}'
+ headers:
+ Cache-Control:
+ - no-store
+ Content-Type:
+ - application/json
+ Pragma:
+ - no-cache
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '3609'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/certs
+ response:
+ body:
+ string: '{"keys":[{"kid":"4UNQAcvUcv-DFUOx_4O1gt13OdJSotqEKPZurs2vQW8","kty":"RSA","alg":"RS256","use":"sig","n":"2DOZ0qHie73SuFVR7civrl6r82YUiAghfzaMowjCg0o06AF--2lIS7vNV_PbsVVznPAAMqVrNG-8CcevEzvVZMQD9nH4DI7xlOxK0lrYu8rmMeSfOvXVbBVsWBZe0jnGNukZqjwmRE5__ttJdxPfIBT5-2L6mguQbDfhSUEEdIW7y7UfOXvqLqEcBtoIEB-ORKDTUIQwGZM5mSCy-cY3cHvvZfZVgaUUy5NvujPRXTMje4n_hG0KfEV-40G9qC2_Xvx4EooJzBZ6FSThiWhCpwhIvzcQqB6M9lHW7nU6wADhYPNCa2OKWvphwZ_zbrF4B9dmS6Zli5rBvbox9Hh45w","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMLTANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANgzmdKh4nu90rhVUe3Ir65eq/NmFIgIIX82jKMIwoNKNOgBfvtpSEu7zVfz27FVc5zwADKlazRvvAnHrxM71WTEA/Zx+AyO8ZTsStJa2LvK5jHknzr11WwVbFgWXtI5xjbpGao8JkROf/7bSXcT3yAU+fti+poLkGw34UlBBHSFu8u1Hzl76i6hHAbaCBAfjkSg01CEMBmTOZkgsvnGN3B772X2VYGlFMuTb7oz0V0zI3uJ/4RtCnxFfuNBvagtv178eBKKCcwWehUk4YloQqcISL83EKgejPZR1u51OsAA4WDzQmtjilr6YcGf826xeAfXZkumZYuawb26MfR4eOcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAsnQG/Yi2g1XTCJn74hWv9MjxVAaZb4gBAc2AWm5VgAjhFEM9h6x6m1mQkq7JM4rIdAj8jw55Ok9CBVBIqq4G4cME3eUvVytkj2lC9zcRoAivjjZF2HPg7zNPa2TTR50asmHPRokppV6gewO/C+o5as+4P2zqDXBh61aRd/9kdQfkg14LBbH5/dYccAuvUqlTYC4IEPCvVmBNC1xsMjf0vohvoSjm9vL2bfqG/RJH0ScdCjOd5d2zju4/e2oVdluWm+vzKBQplc7tVMuKpn6LcLmVHiGNAl+EBIZH+WVLlTx0D1+kbHZsfLYG53lQg2LsvurRbWyF/a5fVM/oLTn5ag=="],"x5t":"H5xfs1pRtvX0HyVTskx7eTXx88U","x5t#S256":"XurVtKAIEyc4w9HCGOhnjoRHnYu4d9HCn_5YHmkScJg"},{"kid":"TV3Tl5jIY1nrJLSb53UKEubLR5gYiq9slq1SsDDg1HU","kty":"RSA","alg":"RSA-OAEP","use":"enc","n":"pNvU3ecpVHbJT4bCOEpw6cnV1yi65tB3I0bRF2ilLVOY944QRAGnjBBECPIzNbgqavghYp1j75F2nq6_ny1CYfoaxTV2iDpRUw8_f7sliYbl8FrLLat0S25ItlZrg5TEJHObvOqlG2_nXoeH36MRWwNhms2uCqfhn5VgtenIzpQIBolnM7zzGp21NvdJ1C_ZAUzkXC-l3oQ-BXTtpEVM4h2KpYh4gfZJWCbYij5d1e1YApKD6V61_Cs3Oa2OY7CAUyq5kgAWJZFDB6CpzIr226u3bV7F9RbrQu3Ybc_Lv33EwykscLznKWZY2Mbs3Iz_rFNv3sVX_vHpH4DHWlKu7Q","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMlzANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKTb1N3nKVR2yU+GwjhKcOnJ1dcouubQdyNG0RdopS1TmPeOEEQBp4wQRAjyMzW4Kmr4IWKdY++Rdp6uv58tQmH6GsU1dog6UVMPP3+7JYmG5fBayy2rdEtuSLZWa4OUxCRzm7zqpRtv516Hh9+jEVsDYZrNrgqn4Z+VYLXpyM6UCAaJZzO88xqdtTb3SdQv2QFM5Fwvpd6EPgV07aRFTOIdiqWIeIH2SVgm2Io+XdXtWAKSg+letfwrNzmtjmOwgFMquZIAFiWRQwegqcyK9turt21exfUW60Lt2G3Py799xMMpLHC85ylmWNjG7NyM/6xTb97FV/7x6R+Ax1pSru0CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAQGJHeTYSMvp0yndbIn7DLohO9lom5nRrx/bLyb7TiRfogyJEF6rQZ66CAkQFk5eMF878fsHTuMVjtmXVBnhojhVmK91HwjsNQu/8xR6QMXNKJQMvHR245vwUGxlWRw/36ObM1D7QjCd/q+FonpBEY4m5Y6Uz1U0HR2Cbh0E2afVlPLeV+F0LKrlyVMdIaWBGWftCGIKDAHaG/PD66zbAKtxerv2fBIDq100WHPhd57BZxX+2aGJp1IaRDgkxV0E/CjEy3+Knd8xbAgUSW0Tl6OTC75exIvlbzeluEBe0wlapAb7WvBKYsipSW8G8Ey7tjoolDT4AU82EaKUPstiMnA=="],"x5t":"AlfHDI0FOPQpt3RBAILt0dtW1yw","x5t#S256":"a7bhm8-JsnfY7bL_m8Yl72hgmp5516VZlFcVloKzk08"}]}'
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/json;charset=UTF-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '2909'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Authorization:
+ - Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTY0NjExMDMsImlhdCI6MTcxNjQ2MDgwMywiYXV0aF90aW1lIjoxNzE2NDYwODAzLCJqdGkiOiI4ZmZkYTBlZi05OGNhLTRkZmItYjg3Yy04M2U0OWMyYmU1NTkiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiNjQ2ZTI3YzYtMWI0Mi00ZTExLWE1YzYtZDlmYWU0YzNjZWE2IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoidGVzdGlkIiwibm9uY2UiOiJub3QtYS1yYW5kb20tc3RyaW5nIiwic2Vzc2lvbl9zdGF0ZSI6IjgyMTk0YzAwLWQ5ZjUtNDQwMy1iMWU1LTJiOTM2OTFhMjhjYyIsImFjciI6IjAiLCJhbGxvd2VkLW9yaWdpbnMiOlsiaHR0cDovLzEyNy4wLjAuMTo4MDAwIl0sInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJkZWZhdWx0LXJvbGVzLXRlc3QiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgZW1haWwgcHJvZmlsZSBrdmsgYnNuIiwic2lkIjoiODIxOTRjMDAtZDlmNS00NDAzLWIxZTUtMmI5MzY5MWEyOGNjIiwiZW1haWxfdmVyaWZpZWQiOmZhbHNlLCJhYW52cmFnZXIua3ZrIjoiMTIzNDU2NzgiLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJlaGVya2VubmluZy1iZXdpbmR2b2VyaW5nIiwiZ2VtYWNodGlnZGUucHNldWRvSUQiOiI0Qjc1QTBFQTEwN0IzRDM2In0.BUeSbTSQGpYcyYiuWDjgSpOiWiA_S5TE-dSPcali6P2jt-kuDMvgmNJg_nk5kTyxJyQpEKHYFhqot_KipRz1-3oaeWtztTGQIf7BQ4InqXA2W5AiYRFyyn7aOqKKPDCikxP5_pYIHkgmtOQHOtABCgVShz_A0C7Qb0ASgjoOXdnJNCrjoPQJloemqP6tn2hsh7JfMM0gEoHEoCVQxcfDe4N0KRPzMnrumyZfnV7wXUjHn1uQk3gUVfRtWImK7VbUvCm0LjU1Bz5-Gtt5pWcLma4uh8DyC975s5OPTk96G_0WtGS38PpCGjktb4N9aARXACbW6PCYD0H9mO2IIxH0rQ
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/userinfo
+ response:
+ body:
+ string: eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJzdWIiOiI2NDZlMjdjNi0xYjQyLTRlMTEtYTVjNi1kOWZhZTRjM2NlYTYiLCJhdWQiOiJ0ZXN0aWQiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsImFhbnZyYWdlci5rdmsiOiIxMjM0NTY3OCIsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9yZWFsbXMvdGVzdCIsInByZWZlcnJlZF91c2VybmFtZSI6ImVoZXJrZW5uaW5nLWJld2luZHZvZXJpbmciLCJnZW1hY2h0aWdkZS5wc2V1ZG9JRCI6IjRCNzVBMEVBMTA3QjNEMzYifQ.gMZorJmAINBiyhnEo5115UNw48hW3-17kjfMI0-5NDO4dpmNt8kRMZesq7vHO6sgqN23CgEqiiRGK6nn1FaMRoSunA8CvVa8IYMlVWq_Vgykb32nNpiyyQlFMUzpJfNycog3-Qjbpr6dhfLlABumKwaAFI5TVg355hZEDcKtn5OMuv_Vei6bI9UBWJECUfa4a5zImsla0OxAUK_6lDCSNxvC-mjtfyggLZHGkKIwSG7jt3bMLp8bNSqfe2FUM8u4nJz5f6UB1QAf35PErp2hXbW3Bu8iNB6KK5FTJuDKsU9WE0jJdUom7CQOZZWupmw5jMRVKxPht18U1l1W_jhAeA
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/jwt
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '781'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/certs
+ response:
+ body:
+ string: '{"keys":[{"kid":"4UNQAcvUcv-DFUOx_4O1gt13OdJSotqEKPZurs2vQW8","kty":"RSA","alg":"RS256","use":"sig","n":"2DOZ0qHie73SuFVR7civrl6r82YUiAghfzaMowjCg0o06AF--2lIS7vNV_PbsVVznPAAMqVrNG-8CcevEzvVZMQD9nH4DI7xlOxK0lrYu8rmMeSfOvXVbBVsWBZe0jnGNukZqjwmRE5__ttJdxPfIBT5-2L6mguQbDfhSUEEdIW7y7UfOXvqLqEcBtoIEB-ORKDTUIQwGZM5mSCy-cY3cHvvZfZVgaUUy5NvujPRXTMje4n_hG0KfEV-40G9qC2_Xvx4EooJzBZ6FSThiWhCpwhIvzcQqB6M9lHW7nU6wADhYPNCa2OKWvphwZ_zbrF4B9dmS6Zli5rBvbox9Hh45w","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMLTANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANgzmdKh4nu90rhVUe3Ir65eq/NmFIgIIX82jKMIwoNKNOgBfvtpSEu7zVfz27FVc5zwADKlazRvvAnHrxM71WTEA/Zx+AyO8ZTsStJa2LvK5jHknzr11WwVbFgWXtI5xjbpGao8JkROf/7bSXcT3yAU+fti+poLkGw34UlBBHSFu8u1Hzl76i6hHAbaCBAfjkSg01CEMBmTOZkgsvnGN3B772X2VYGlFMuTb7oz0V0zI3uJ/4RtCnxFfuNBvagtv178eBKKCcwWehUk4YloQqcISL83EKgejPZR1u51OsAA4WDzQmtjilr6YcGf826xeAfXZkumZYuawb26MfR4eOcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAsnQG/Yi2g1XTCJn74hWv9MjxVAaZb4gBAc2AWm5VgAjhFEM9h6x6m1mQkq7JM4rIdAj8jw55Ok9CBVBIqq4G4cME3eUvVytkj2lC9zcRoAivjjZF2HPg7zNPa2TTR50asmHPRokppV6gewO/C+o5as+4P2zqDXBh61aRd/9kdQfkg14LBbH5/dYccAuvUqlTYC4IEPCvVmBNC1xsMjf0vohvoSjm9vL2bfqG/RJH0ScdCjOd5d2zju4/e2oVdluWm+vzKBQplc7tVMuKpn6LcLmVHiGNAl+EBIZH+WVLlTx0D1+kbHZsfLYG53lQg2LsvurRbWyF/a5fVM/oLTn5ag=="],"x5t":"H5xfs1pRtvX0HyVTskx7eTXx88U","x5t#S256":"XurVtKAIEyc4w9HCGOhnjoRHnYu4d9HCn_5YHmkScJg"},{"kid":"TV3Tl5jIY1nrJLSb53UKEubLR5gYiq9slq1SsDDg1HU","kty":"RSA","alg":"RSA-OAEP","use":"enc","n":"pNvU3ecpVHbJT4bCOEpw6cnV1yi65tB3I0bRF2ilLVOY944QRAGnjBBECPIzNbgqavghYp1j75F2nq6_ny1CYfoaxTV2iDpRUw8_f7sliYbl8FrLLat0S25ItlZrg5TEJHObvOqlG2_nXoeH36MRWwNhms2uCqfhn5VgtenIzpQIBolnM7zzGp21NvdJ1C_ZAUzkXC-l3oQ-BXTtpEVM4h2KpYh4gfZJWCbYij5d1e1YApKD6V61_Cs3Oa2OY7CAUyq5kgAWJZFDB6CpzIr226u3bV7F9RbrQu3Ybc_Lv33EwykscLznKWZY2Mbs3Iz_rFNv3sVX_vHpH4DHWlKu7Q","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMlzANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKTb1N3nKVR2yU+GwjhKcOnJ1dcouubQdyNG0RdopS1TmPeOEEQBp4wQRAjyMzW4Kmr4IWKdY++Rdp6uv58tQmH6GsU1dog6UVMPP3+7JYmG5fBayy2rdEtuSLZWa4OUxCRzm7zqpRtv516Hh9+jEVsDYZrNrgqn4Z+VYLXpyM6UCAaJZzO88xqdtTb3SdQv2QFM5Fwvpd6EPgV07aRFTOIdiqWIeIH2SVgm2Io+XdXtWAKSg+letfwrNzmtjmOwgFMquZIAFiWRQwegqcyK9turt21exfUW60Lt2G3Py799xMMpLHC85ylmWNjG7NyM/6xTb97FV/7x6R+Ax1pSru0CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAQGJHeTYSMvp0yndbIn7DLohO9lom5nRrx/bLyb7TiRfogyJEF6rQZ66CAkQFk5eMF878fsHTuMVjtmXVBnhojhVmK91HwjsNQu/8xR6QMXNKJQMvHR245vwUGxlWRw/36ObM1D7QjCd/q+FonpBEY4m5Y6Uz1U0HR2Cbh0E2afVlPLeV+F0LKrlyVMdIaWBGWftCGIKDAHaG/PD66zbAKtxerv2fBIDq100WHPhd57BZxX+2aGJp1IaRDgkxV0E/CjEy3+Knd8xbAgUSW0Tl6OTC75exIvlbzeluEBe0wlapAb7WvBKYsipSW8G8Ey7tjoolDT4AU82EaKUPstiMnA=="],"x5t":"AlfHDI0FOPQpt3RBAILt0dtW1yw","x5t#S256":"a7bhm8-JsnfY7bL_m8Yl72hgmp5516VZlFcVloKzk08"}]}'
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/json;charset=UTF-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '2909'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: id_token_hint=eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTY0NjExMDMsImlhdCI6MTcxNjQ2MDgwMywiYXV0aF90aW1lIjoxNzE2NDYwODAzLCJqdGkiOiI0MGQyMTk2Mi1lMTNmLTQzYTQtOWJiZi0wNzA0Y2RlMTg5MDMiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJ0ZXN0aWQiLCJzdWIiOiI2NDZlMjdjNi0xYjQyLTRlMTEtYTVjNi1kOWZhZTRjM2NlYTYiLCJ0eXAiOiJJRCIsImF6cCI6InRlc3RpZCIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsInNlc3Npb25fc3RhdGUiOiI4MjE5NGMwMC1kOWY1LTQ0MDMtYjFlNS0yYjkzNjkxYTI4Y2MiLCJhdF9oYXNoIjoiMzMyTmlpNXY0dGhzR092WHB4eDNDUSIsImFjciI6IjAiLCJzaWQiOiI4MjE5NGMwMC1kOWY1LTQ0MDMtYjFlNS0yYjkzNjkxYTI4Y2MiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsImFhbnZyYWdlci5rdmsiOiIxMjM0NTY3OCIsInByZWZlcnJlZF91c2VybmFtZSI6ImVoZXJrZW5uaW5nLWJld2luZHZvZXJpbmciLCJnZW1hY2h0aWdkZS5wc2V1ZG9JRCI6IjRCNzVBMEVBMTA3QjNEMzYifQ.S-2gbcTyzr25mH191wS9SgWZ_ADR7C7kSMqKL37Ku8HnVaJkrHYDftbn3aYeMDutR6cS7uRJ_Yvo17HnOSXV47B6jaBGPYJCzibxm9vDgYC-2idQskW-68EXBm9cUuwcqa324KocODFg3VZbC0JpiCWX5hNS8txGYB4zFqy-uO4GP1p0nlQKMteBeyv0hQi-j5sOhBUrxVus-ddXeTPJkM8x3TvrfH9Paie_Ya4ybAGZpcY9qJNgj25xFLeS-fOQetGNDWtbonPzWaMk6FsSgvcRZAqnI6wzpyEYGeuoffwiF63_BK56IjeiW2tCOcd5NsGeE4BwlO_n-NlVoorSzQ
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '1199'
+ Content-Type:
+ - application/x-www-form-urlencoded
+ User-Agent:
+ - python-requests/2.31.0
+ method: POST
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/logout
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n\n\n\n\n
+ \ \n
\n
+ \ \n
\n
+ \
\n\n\n
\n
+ \
You are logged out
\n
\n\n\n\n
+ \
\n
\n\n
\n
\n\n\n"
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Set-Cookie:
+ - AUTH_SESSION_ID=c263549d-b336-4fae-8e9b-8c5701778632; Version=1; Path=/realms/test/;
+ SameSite=None; Secure; HttpOnly
+ - AUTH_SESSION_ID_LEGACY=c263549d-b336-4fae-8e9b-8c5701778632; Version=1; Path=/realms/test/;
+ HttpOnly
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '1566'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n\n\n\n\n\n\n"
+ headers:
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '1573'
+ status:
+ code: 400
+ message: Bad Request
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ Cookie:
+ - AUTH_SESSION_ID_LEGACY=82194c00-d9f5-4403-b1e5-2b93691a28cc; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJjaWQiOiJ0ZXN0aWQiLCJwdHkiOiJvcGVuaWQtY29ubmVjdCIsInJ1cmkiOiJodHRwOi8vdGVzdHNlcnZlci9laGVya2VubmluZy1iZXdpbmR2b2VyaW5nLW9pZGMvY2FsbGJhY2svIiwiYWN0IjoiQVVUSEVOVElDQVRFIiwibm90ZXMiOnsic2NvcGUiOiJvcGVuaWQgYnNuIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0IiwicmVzcG9uc2VfdHlwZSI6ImNvZGUiLCJyZWRpcmVjdF91cmkiOiJodHRwOi8vdGVzdHNlcnZlci9laGVya2VubmluZy1iZXdpbmR2b2VyaW5nLW9pZGMvY2FsbGJhY2svIiwic3RhdGUiOiJub3QtYS1yYW5kb20tc3RyaW5nIiwibm9uY2UiOiJub3QtYS1yYW5kb20tc3RyaW5nIn19.ohW_ibsZCPn53GegGr49538xdqveI5gt43AvtPXb9ro;
+ KEYCLOAK_IDENTITY_LEGACY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTY0OTY4MDMsImlhdCI6MTcxNjQ2MDgwMywianRpIjoiNWYwNzYwYWUtNjUzNy00YjhmLTg3MmQtZGExYTNkYTUwOGU0IiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiNjQ2ZTI3YzYtMWI0Mi00ZTExLWE1YzYtZDlmYWU0YzNjZWE2IiwidHlwIjoiU2VyaWFsaXplZC1JRCIsInNlc3Npb25fc3RhdGUiOiI4MjE5NGMwMC1kOWY1LTQ0MDMtYjFlNS0yYjkzNjkxYTI4Y2MiLCJzaWQiOiI4MjE5NGMwMC1kOWY1LTQ0MDMtYjFlNS0yYjkzNjkxYTI4Y2MiLCJzdGF0ZV9jaGVja2VyIjoiWFljb0Vod19qZ0gtdnVHdklHZ2dMRUdHWVl5VzYtczRoS1RWcEpEVXFGNCJ9.lOmH652_tr0WEEoqH1cpuvjHY4F3oRz03N6siaSGL9o;
+ KEYCLOAK_SESSION_LEGACY=test/646e27c6-1b42-4e11-a5c6-d9fae4c3cea6/82194c00-d9f5-4403-b1e5-2b93691a28cc
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth?response_type=code&scope=openid+bsn&client_id=testid&redirect_uri=http%3A%2F%2Ftestserver%2Feherkenning-bewindvoering-oidc%2Fcallback%2F&state=not-a-random-string&nonce=not-a-random-string
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n \n\n\n\n\n
+ \ \n
\n
+ \ \n
\n
+ \
\n\n\n
\n \n\n\n\n\n\n
+ \
\n
\n\n
\n
\n\n\n"
+ headers:
+ Cache-Control:
+ - no-store, must-revalidate, max-age=0
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Set-Cookie:
+ - KEYCLOAK_IDENTITY=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test/; HttpOnly
+ - KEYCLOAK_IDENTITY_LEGACY=; Version=1; Comment=Expiring cookie; Expires=Thu,
+ 01-Jan-1970 00:00:10 GMT; Max-Age=0; Path=/realms/test/; HttpOnly
+ - KEYCLOAK_SESSION=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test/
+ - KEYCLOAK_SESSION_LEGACY=; Version=1; Comment=Expiring cookie; Expires=Thu,
+ 01-Jan-1970 00:00:10 GMT; Max-Age=0; Path=/realms/test/
+ - KEYCLOAK_IDENTITY=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test; HttpOnly
+ - KEYCLOAK_IDENTITY_LEGACY=; Version=1; Comment=Expiring cookie; Expires=Thu,
+ 01-Jan-1970 00:00:10 GMT; Max-Age=0; Path=/realms/test; HttpOnly
+ - KEYCLOAK_SESSION=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test
+ - KEYCLOAK_SESSION_LEGACY=; Version=1; Comment=Expiring cookie; Expires=Thu,
+ 01-Jan-1970 00:00:10 GMT; Max-Age=0; Path=/realms/test
+ - AUTH_SESSION_ID=c82c23c7-c341-4585-b4f2-605223c9e6cf; Version=1; Path=/realms/test/;
+ SameSite=None; Secure; HttpOnly
+ - AUTH_SESSION_ID_LEGACY=c82c23c7-c341-4585-b4f2-605223c9e6cf; Version=1; Path=/realms/test/;
+ HttpOnly
+ - KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJjaWQiOiJ0ZXN0aWQiLCJwdHkiOiJvcGVuaWQtY29ubmVjdCIsInJ1cmkiOiJodHRwOi8vdGVzdHNlcnZlci9laGVya2VubmluZy1iZXdpbmR2b2VyaW5nLW9pZGMvY2FsbGJhY2svIiwiYWN0IjoiQVVUSEVOVElDQVRFIiwibm90ZXMiOnsic2NvcGUiOiJvcGVuaWQgYnNuIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0IiwicmVzcG9uc2VfdHlwZSI6ImNvZGUiLCJyZWRpcmVjdF91cmkiOiJodHRwOi8vdGVzdHNlcnZlci9laGVya2VubmluZy1iZXdpbmR2b2VyaW5nLW9pZGMvY2FsbGJhY2svIiwic3RhdGUiOiJub3QtYS1yYW5kb20tc3RyaW5nIiwibm9uY2UiOiJub3QtYS1yYW5kb20tc3RyaW5nIn19.ohW_ibsZCPn53GegGr49538xdqveI5gt43AvtPXb9ro;
+ Version=1; Path=/realms/test/; HttpOnly
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '4466'
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/EHerkenningCallbackTests/EHerkenningCallbackTests.test_eherkenning_error_reported_for_cancelled_login_anon_django_user.yaml b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/EHerkenningCallbackTests/EHerkenningCallbackTests.test_eherkenning_error_reported_for_cancelled_login_anon_django_user.yaml
new file mode 100644
index 0000000000..6586377386
--- /dev/null
+++ b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/EHerkenningCallbackTests/EHerkenningCallbackTests.test_eherkenning_error_reported_for_cancelled_login_anon_django_user.yaml
@@ -0,0 +1,91 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n\n\n\n\n\n\n"
+ headers:
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '1573'
+ status:
+ code: 400
+ message: Bad Request
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth?response_type=code&scope=badscope&client_id=testid&redirect_uri=http%3A%2F%2Ftestserver%2Feherkenning-oidc%2Fcallback%2F&state=not-a-random-string&nonce=not-a-random-string
+ response:
+ body:
+ string: ''
+ headers:
+ Location:
+ - http://testserver/eherkenning-oidc/callback/?error=invalid_scope&error_description=Invalid+scopes%3A+badscope&state=not-a-random-string&iss=http%3A%2F%2Flocalhost%3A8080%2Frealms%2Ftest
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '0'
+ status:
+ code: 302
+ message: Found
+version: 1
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/EHerkenningCallbackTests/EHerkenningCallbackTests.test_eherkenning_error_reported_for_cancelled_login_with_staff_django_user.yaml b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/EHerkenningCallbackTests/EHerkenningCallbackTests.test_eherkenning_error_reported_for_cancelled_login_with_staff_django_user.yaml
new file mode 100644
index 0000000000..6586377386
--- /dev/null
+++ b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/EHerkenningCallbackTests/EHerkenningCallbackTests.test_eherkenning_error_reported_for_cancelled_login_with_staff_django_user.yaml
@@ -0,0 +1,91 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n\n\n\n\n\n\n"
+ headers:
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '1573'
+ status:
+ code: 400
+ message: Bad Request
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth?response_type=code&scope=badscope&client_id=testid&redirect_uri=http%3A%2F%2Ftestserver%2Feherkenning-oidc%2Fcallback%2F&state=not-a-random-string&nonce=not-a-random-string
+ response:
+ body:
+ string: ''
+ headers:
+ Location:
+ - http://testserver/eherkenning-oidc/callback/?error=invalid_scope&error_description=Invalid+scopes%3A+badscope&state=not-a-random-string&iss=http%3A%2F%2Flocalhost%3A8080%2Frealms%2Ftest
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '0'
+ status:
+ code: 302
+ message: Found
+version: 1
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/EHerkenningCallbackTests/EHerkenningCallbackTests.test_failing_claim_verification.yaml b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/EHerkenningCallbackTests/EHerkenningCallbackTests.test_failing_claim_verification.yaml
new file mode 100644
index 0000000000..a5998de045
--- /dev/null
+++ b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/EHerkenningCallbackTests/EHerkenningCallbackTests.test_failing_claim_verification.yaml
@@ -0,0 +1,371 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n\n\n\n\n\n\n"
+ headers:
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '1573'
+ status:
+ code: 400
+ message: Bad Request
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth?response_type=code&scope=openid+kvk&client_id=testid&redirect_uri=http%3A%2F%2Ftestserver%2Feherkenning-oidc%2Fcallback%2F&state=not-a-random-string&nonce=not-a-random-string
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n \n\n\n\n\n
+ \ \n
\n
+ \ \n
\n
+ \
\n\n\n
\n \n\n\n\n\n\n
+ \
\n
\n\n
\n
\n\n\n"
+ headers:
+ Cache-Control:
+ - no-store, must-revalidate, max-age=0
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Set-Cookie:
+ - AUTH_SESSION_ID=cb331168-f20c-4c49-8998-0745bac76694; Version=1; Path=/realms/test/;
+ SameSite=None; Secure; HttpOnly
+ - AUTH_SESSION_ID_LEGACY=cb331168-f20c-4c49-8998-0745bac76694; Version=1; Path=/realms/test/;
+ HttpOnly
+ - KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJjaWQiOiJ0ZXN0aWQiLCJwdHkiOiJvcGVuaWQtY29ubmVjdCIsInJ1cmkiOiJodHRwOi8vdGVzdHNlcnZlci9laGVya2VubmluZy1vaWRjL2NhbGxiYWNrLyIsImFjdCI6IkFVVEhFTlRJQ0FURSIsIm5vdGVzIjp7InNjb3BlIjoib3BlbmlkIGt2ayIsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9yZWFsbXMvdGVzdCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwicmVkaXJlY3RfdXJpIjoiaHR0cDovL3Rlc3RzZXJ2ZXIvZWhlcmtlbm5pbmctb2lkYy9jYWxsYmFjay8iLCJzdGF0ZSI6Im5vdC1hLXJhbmRvbS1zdHJpbmciLCJub25jZSI6Im5vdC1hLXJhbmRvbS1zdHJpbmcifX0.SpI7JvuDjU8Dn4CR3RD56sJAxNizNRciRym82v57Ylo;
+ Version=1; Path=/realms/test/; HttpOnly
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '4466'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: username=testuser&password=testuser&credentialId=&login=Sign+In
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '63'
+ Content-Type:
+ - application/x-www-form-urlencoded
+ Cookie:
+ - AUTH_SESSION_ID_LEGACY=cb331168-f20c-4c49-8998-0745bac76694; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJjaWQiOiJ0ZXN0aWQiLCJwdHkiOiJvcGVuaWQtY29ubmVjdCIsInJ1cmkiOiJodHRwOi8vdGVzdHNlcnZlci9laGVya2VubmluZy1vaWRjL2NhbGxiYWNrLyIsImFjdCI6IkFVVEhFTlRJQ0FURSIsIm5vdGVzIjp7InNjb3BlIjoib3BlbmlkIGt2ayIsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9yZWFsbXMvdGVzdCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwicmVkaXJlY3RfdXJpIjoiaHR0cDovL3Rlc3RzZXJ2ZXIvZWhlcmtlbm5pbmctb2lkYy9jYWxsYmFjay8iLCJzdGF0ZSI6Im5vdC1hLXJhbmRvbS1zdHJpbmciLCJub25jZSI6Im5vdC1hLXJhbmRvbS1zdHJpbmcifX0.SpI7JvuDjU8Dn4CR3RD56sJAxNizNRciRym82v57Ylo
+ User-Agent:
+ - python-requests/2.31.0
+ method: POST
+ uri: http://localhost:8080/realms/test/login-actions/authenticate?session_code=41NnhVsOge7Su4r0LPtUrLN8vCvK1YmYiJCfKxWy9hQ&execution=d8b8778e-a545-45d4-8f72-fd69facf4b72&client_id=testid&tab_id=sG9HWUiDd7c
+ response:
+ body:
+ string: ''
+ headers:
+ Cache-Control:
+ - no-store, must-revalidate, max-age=0
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Location:
+ - http://testserver/eherkenning-oidc/callback/?state=not-a-random-string&session_state=cb331168-f20c-4c49-8998-0745bac76694&iss=http%3A%2F%2Flocalhost%3A8080%2Frealms%2Ftest&code=3c5a34e2-4cdf-473d-b6a6-eb830b070646.cb331168-f20c-4c49-8998-0745bac76694.adf4ad83-4550-4619-9231-73bd8d700f45
+ Referrer-Policy:
+ - no-referrer
+ Set-Cookie:
+ - KEYCLOAK_LOCALE=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test/; HttpOnly
+ - KC_RESTART=; Version=1; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0;
+ Path=/realms/test/; HttpOnly
+ - KC_AUTH_STATE=; Version=1; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0;
+ Path=/realms/test/
+ - KEYCLOAK_IDENTITY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTY0OTY4MDEsImlhdCI6MTcxNjQ2MDgwMSwianRpIjoiYWE5MGZiNmItNjIzYS00MzhhLWEyOGMtMjE1YTkxYTQ1MjVkIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiYWExMGNmYzctMmM0ZC00MWY2LThmYWMtN2JmNDA1YzU3MmM0IiwidHlwIjoiU2VyaWFsaXplZC1JRCIsInNlc3Npb25fc3RhdGUiOiJjYjMzMTE2OC1mMjBjLTRjNDktODk5OC0wNzQ1YmFjNzY2OTQiLCJzaWQiOiJjYjMzMTE2OC1mMjBjLTRjNDktODk5OC0wNzQ1YmFjNzY2OTQiLCJzdGF0ZV9jaGVja2VyIjoiX1JqcXZkSWZqUGI1RHFXSlFGRUw5T2UtMndHMGpYank4bWEwNFR4RjZMVSJ9.O64rEsp4g6PUrTaf6aVeIYE06Db0pTqhFRQE4JJJlGA;
+ Version=1; Path=/realms/test/; SameSite=None; Secure; HttpOnly
+ - KEYCLOAK_IDENTITY_LEGACY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTY0OTY4MDEsImlhdCI6MTcxNjQ2MDgwMSwianRpIjoiYWE5MGZiNmItNjIzYS00MzhhLWEyOGMtMjE1YTkxYTQ1MjVkIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiYWExMGNmYzctMmM0ZC00MWY2LThmYWMtN2JmNDA1YzU3MmM0IiwidHlwIjoiU2VyaWFsaXplZC1JRCIsInNlc3Npb25fc3RhdGUiOiJjYjMzMTE2OC1mMjBjLTRjNDktODk5OC0wNzQ1YmFjNzY2OTQiLCJzaWQiOiJjYjMzMTE2OC1mMjBjLTRjNDktODk5OC0wNzQ1YmFjNzY2OTQiLCJzdGF0ZV9jaGVja2VyIjoiX1JqcXZkSWZqUGI1RHFXSlFGRUw5T2UtMndHMGpYank4bWEwNFR4RjZMVSJ9.O64rEsp4g6PUrTaf6aVeIYE06Db0pTqhFRQE4JJJlGA;
+ Version=1; Path=/realms/test/; HttpOnly
+ - KEYCLOAK_SESSION=test/aa10cfc7-2c4d-41f6-8fac-7bf405c572c4/cb331168-f20c-4c49-8998-0745bac76694;
+ Version=1; Expires=Thu, 23-May-2024 20:40:01 GMT; Max-Age=36000; Path=/realms/test/;
+ SameSite=None; Secure
+ - KEYCLOAK_SESSION_LEGACY=test/aa10cfc7-2c4d-41f6-8fac-7bf405c572c4/cb331168-f20c-4c49-8998-0745bac76694;
+ Version=1; Expires=Thu, 23-May-2024 20:40:01 GMT; Max-Age=36000; Path=/realms/test/
+ - KEYCLOAK_REMEMBER_ME=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test/; HttpOnly
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '0'
+ status:
+ code: 302
+ message: Found
+- request:
+ body: client_id=testid&client_secret=7DB3KUAAizYCcmZufpHRVOcD0TOkNO3I&grant_type=authorization_code&code=3c5a34e2-4cdf-473d-b6a6-eb830b070646.cb331168-f20c-4c49-8998-0745bac76694.adf4ad83-4550-4619-9231-73bd8d700f45&redirect_uri=http%3A%2F%2Ftestserver%2Feherkenning-oidc%2Fcallback%2F
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '279'
+ Content-Type:
+ - application/x-www-form-urlencoded
+ User-Agent:
+ - python-requests/2.31.0
+ method: POST
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/token
+ response:
+ body:
+ string: '{"access_token":"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTY0NjExMDEsImlhdCI6MTcxNjQ2MDgwMSwiYXV0aF90aW1lIjoxNzE2NDYwODAxLCJqdGkiOiJhMmU0Zjk2Mi1hYjljLTQ4NzMtYTViZS04NjJiYWU0ODdhOTkiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiYWExMGNmYzctMmM0ZC00MWY2LThmYWMtN2JmNDA1YzU3MmM0IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoidGVzdGlkIiwibm9uY2UiOiJub3QtYS1yYW5kb20tc3RyaW5nIiwic2Vzc2lvbl9zdGF0ZSI6ImNiMzMxMTY4LWYyMGMtNGM0OS04OTk4LTA3NDViYWM3NjY5NCIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOlsiaHR0cDovLzEyNy4wLjAuMTo4MDAwIl0sInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJkZWZhdWx0LXJvbGVzLXRlc3QiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgZW1haWwgcHJvZmlsZSBrdmsgYnNuIiwic2lkIjoiY2IzMzExNjgtZjIwYy00YzQ5LTg5OTgtMDc0NWJhYzc2Njk0Iiwia3ZrIjoiMDEyMzQ1Njc4IiwiZW1haWxfdmVyaWZpZWQiOmZhbHNlLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJ0ZXN0dXNlciIsImJzbiI6IjAwMDAwMDAwMCJ9.eZdaiBbxALxGbSgqsyKlLIzDmH6ZEZXrSU9IQ0hXGa4m5TIwwJCFWlirO_qYL2vmQzO3NWDJLuv8QKR34QXMwH594sz5u1eMnhKHvMCVVTuv_x7SSApJ8DShnmPxHBFgdw06bQawgqX31lzo48wYgUiwumYqtgp_9WZqYK-vjkRUFuGV_Qi98qrEwRhRQy37GhXNmLxQf73IUxpEtbpkLIKnllMrwDa7Vsr3sq3u46LsHBynBGYf4fsLGlmC6xHdRWin9jmR57f0ZN9fD4qVSmLSrPQg-jJn5C_rcdKIV5wcjF1ZgxrvfXgvq9UCwYaNXB9RXljX55U_tWLapkKM_A","expires_in":300,"refresh_expires_in":1800,"refresh_token":"eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTY0NjI2MDEsImlhdCI6MTcxNjQ2MDgwMSwianRpIjoiZmE2OWMwZDMtNzE0Mi00YTAyLTg3YzItZjI1MTA1NDM0MmUwIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0IiwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiYWExMGNmYzctMmM0ZC00MWY2LThmYWMtN2JmNDA1YzU3MmM0IiwidHlwIjoiUmVmcmVzaCIsImF6cCI6InRlc3RpZCIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsInNlc3Npb25fc3RhdGUiOiJjYjMzMTE2OC1mMjBjLTRjNDktODk5OC0wNzQ1YmFjNzY2OTQiLCJzY29wZSI6Im9wZW5pZCBlbWFpbCBwcm9maWxlIGt2ayBic24iLCJzaWQiOiJjYjMzMTE2OC1mMjBjLTRjNDktODk5OC0wNzQ1YmFjNzY2OTQifQ.43LRNf5eVaIiqoKr6EfqLEN0hxNUiwnl_J2TjwqIulg","token_type":"Bearer","id_token":"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTY0NjExMDEsImlhdCI6MTcxNjQ2MDgwMSwiYXV0aF90aW1lIjoxNzE2NDYwODAxLCJqdGkiOiIxYjI0MDQxNC00NzhlLTQwNTgtOTJiNy04NDMyODIxMWEwMzQiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJ0ZXN0aWQiLCJzdWIiOiJhYTEwY2ZjNy0yYzRkLTQxZjYtOGZhYy03YmY0MDVjNTcyYzQiLCJ0eXAiOiJJRCIsImF6cCI6InRlc3RpZCIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsInNlc3Npb25fc3RhdGUiOiJjYjMzMTE2OC1mMjBjLTRjNDktODk5OC0wNzQ1YmFjNzY2OTQiLCJhdF9oYXNoIjoidmVCZThrUWNiSWpPU1BqemxzcmJSdyIsImFjciI6IjEiLCJzaWQiOiJjYjMzMTE2OC1mMjBjLTRjNDktODk5OC0wNzQ1YmFjNzY2OTQiLCJrdmsiOiIwMTIzNDU2NzgiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsInByZWZlcnJlZF91c2VybmFtZSI6InRlc3R1c2VyIiwiYnNuIjoiMDAwMDAwMDAwIn0.SQd-EW1CDHHxZ3xU847Gze1Wk1sWN8PTLF71UYYsK5pfY4o9foaPh8wKG6qKalyQ-2WC3JTsqAZ5PKN9fGhkkVOGV-57RNrqZ3G3qsBS7BhtaaZRv0NcqH1cJtU9jWmlvZ6hcbovZem5YkYtvAvec-gOtY-M2rujClAOKfEKJJXHXLGG7tirdgIbn7KM7c32XbhpELzNqdGN9WLR0BXx-cB7Rb4d2BxWonubZjjHsT2Bp77cS92pW2zF9OMVgVJA0ZCLAFLRivGChJMN1N4zLu2Tg-EcE4zBpW9zsKL4fEgoTMZjB4DKIVpz1jiVv0O3lyPCuQTg-ZrrnoNeYvoY0g","not-before-policy":0,"session_state":"cb331168-f20c-4c49-8998-0745bac76694","scope":"openid
+ email profile kvk bsn"}'
+ headers:
+ Cache-Control:
+ - no-store
+ Content-Type:
+ - application/json
+ Pragma:
+ - no-cache
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '3475'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/certs
+ response:
+ body:
+ string: '{"keys":[{"kid":"4UNQAcvUcv-DFUOx_4O1gt13OdJSotqEKPZurs2vQW8","kty":"RSA","alg":"RS256","use":"sig","n":"2DOZ0qHie73SuFVR7civrl6r82YUiAghfzaMowjCg0o06AF--2lIS7vNV_PbsVVznPAAMqVrNG-8CcevEzvVZMQD9nH4DI7xlOxK0lrYu8rmMeSfOvXVbBVsWBZe0jnGNukZqjwmRE5__ttJdxPfIBT5-2L6mguQbDfhSUEEdIW7y7UfOXvqLqEcBtoIEB-ORKDTUIQwGZM5mSCy-cY3cHvvZfZVgaUUy5NvujPRXTMje4n_hG0KfEV-40G9qC2_Xvx4EooJzBZ6FSThiWhCpwhIvzcQqB6M9lHW7nU6wADhYPNCa2OKWvphwZ_zbrF4B9dmS6Zli5rBvbox9Hh45w","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMLTANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANgzmdKh4nu90rhVUe3Ir65eq/NmFIgIIX82jKMIwoNKNOgBfvtpSEu7zVfz27FVc5zwADKlazRvvAnHrxM71WTEA/Zx+AyO8ZTsStJa2LvK5jHknzr11WwVbFgWXtI5xjbpGao8JkROf/7bSXcT3yAU+fti+poLkGw34UlBBHSFu8u1Hzl76i6hHAbaCBAfjkSg01CEMBmTOZkgsvnGN3B772X2VYGlFMuTb7oz0V0zI3uJ/4RtCnxFfuNBvagtv178eBKKCcwWehUk4YloQqcISL83EKgejPZR1u51OsAA4WDzQmtjilr6YcGf826xeAfXZkumZYuawb26MfR4eOcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAsnQG/Yi2g1XTCJn74hWv9MjxVAaZb4gBAc2AWm5VgAjhFEM9h6x6m1mQkq7JM4rIdAj8jw55Ok9CBVBIqq4G4cME3eUvVytkj2lC9zcRoAivjjZF2HPg7zNPa2TTR50asmHPRokppV6gewO/C+o5as+4P2zqDXBh61aRd/9kdQfkg14LBbH5/dYccAuvUqlTYC4IEPCvVmBNC1xsMjf0vohvoSjm9vL2bfqG/RJH0ScdCjOd5d2zju4/e2oVdluWm+vzKBQplc7tVMuKpn6LcLmVHiGNAl+EBIZH+WVLlTx0D1+kbHZsfLYG53lQg2LsvurRbWyF/a5fVM/oLTn5ag=="],"x5t":"H5xfs1pRtvX0HyVTskx7eTXx88U","x5t#S256":"XurVtKAIEyc4w9HCGOhnjoRHnYu4d9HCn_5YHmkScJg"},{"kid":"TV3Tl5jIY1nrJLSb53UKEubLR5gYiq9slq1SsDDg1HU","kty":"RSA","alg":"RSA-OAEP","use":"enc","n":"pNvU3ecpVHbJT4bCOEpw6cnV1yi65tB3I0bRF2ilLVOY944QRAGnjBBECPIzNbgqavghYp1j75F2nq6_ny1CYfoaxTV2iDpRUw8_f7sliYbl8FrLLat0S25ItlZrg5TEJHObvOqlG2_nXoeH36MRWwNhms2uCqfhn5VgtenIzpQIBolnM7zzGp21NvdJ1C_ZAUzkXC-l3oQ-BXTtpEVM4h2KpYh4gfZJWCbYij5d1e1YApKD6V61_Cs3Oa2OY7CAUyq5kgAWJZFDB6CpzIr226u3bV7F9RbrQu3Ybc_Lv33EwykscLznKWZY2Mbs3Iz_rFNv3sVX_vHpH4DHWlKu7Q","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMlzANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKTb1N3nKVR2yU+GwjhKcOnJ1dcouubQdyNG0RdopS1TmPeOEEQBp4wQRAjyMzW4Kmr4IWKdY++Rdp6uv58tQmH6GsU1dog6UVMPP3+7JYmG5fBayy2rdEtuSLZWa4OUxCRzm7zqpRtv516Hh9+jEVsDYZrNrgqn4Z+VYLXpyM6UCAaJZzO88xqdtTb3SdQv2QFM5Fwvpd6EPgV07aRFTOIdiqWIeIH2SVgm2Io+XdXtWAKSg+letfwrNzmtjmOwgFMquZIAFiWRQwegqcyK9turt21exfUW60Lt2G3Py799xMMpLHC85ylmWNjG7NyM/6xTb97FV/7x6R+Ax1pSru0CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAQGJHeTYSMvp0yndbIn7DLohO9lom5nRrx/bLyb7TiRfogyJEF6rQZ66CAkQFk5eMF878fsHTuMVjtmXVBnhojhVmK91HwjsNQu/8xR6QMXNKJQMvHR245vwUGxlWRw/36ObM1D7QjCd/q+FonpBEY4m5Y6Uz1U0HR2Cbh0E2afVlPLeV+F0LKrlyVMdIaWBGWftCGIKDAHaG/PD66zbAKtxerv2fBIDq100WHPhd57BZxX+2aGJp1IaRDgkxV0E/CjEy3+Knd8xbAgUSW0Tl6OTC75exIvlbzeluEBe0wlapAb7WvBKYsipSW8G8Ey7tjoolDT4AU82EaKUPstiMnA=="],"x5t":"AlfHDI0FOPQpt3RBAILt0dtW1yw","x5t#S256":"a7bhm8-JsnfY7bL_m8Yl72hgmp5516VZlFcVloKzk08"}]}'
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/json;charset=UTF-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '2909'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Authorization:
+ - Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTY0NjExMDEsImlhdCI6MTcxNjQ2MDgwMSwiYXV0aF90aW1lIjoxNzE2NDYwODAxLCJqdGkiOiJhMmU0Zjk2Mi1hYjljLTQ4NzMtYTViZS04NjJiYWU0ODdhOTkiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiYWExMGNmYzctMmM0ZC00MWY2LThmYWMtN2JmNDA1YzU3MmM0IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoidGVzdGlkIiwibm9uY2UiOiJub3QtYS1yYW5kb20tc3RyaW5nIiwic2Vzc2lvbl9zdGF0ZSI6ImNiMzMxMTY4LWYyMGMtNGM0OS04OTk4LTA3NDViYWM3NjY5NCIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOlsiaHR0cDovLzEyNy4wLjAuMTo4MDAwIl0sInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJkZWZhdWx0LXJvbGVzLXRlc3QiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgZW1haWwgcHJvZmlsZSBrdmsgYnNuIiwic2lkIjoiY2IzMzExNjgtZjIwYy00YzQ5LTg5OTgtMDc0NWJhYzc2Njk0Iiwia3ZrIjoiMDEyMzQ1Njc4IiwiZW1haWxfdmVyaWZpZWQiOmZhbHNlLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJ0ZXN0dXNlciIsImJzbiI6IjAwMDAwMDAwMCJ9.eZdaiBbxALxGbSgqsyKlLIzDmH6ZEZXrSU9IQ0hXGa4m5TIwwJCFWlirO_qYL2vmQzO3NWDJLuv8QKR34QXMwH594sz5u1eMnhKHvMCVVTuv_x7SSApJ8DShnmPxHBFgdw06bQawgqX31lzo48wYgUiwumYqtgp_9WZqYK-vjkRUFuGV_Qi98qrEwRhRQy37GhXNmLxQf73IUxpEtbpkLIKnllMrwDa7Vsr3sq3u46LsHBynBGYf4fsLGlmC6xHdRWin9jmR57f0ZN9fD4qVSmLSrPQg-jJn5C_rcdKIV5wcjF1ZgxrvfXgvq9UCwYaNXB9RXljX55U_tWLapkKM_A
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/userinfo
+ response:
+ body:
+ string: eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJzdWIiOiJhYTEwY2ZjNy0yYzRkLTQxZjYtOGZhYy03YmY0MDVjNTcyYzQiLCJrdmsiOiIwMTIzNDU2NzgiLCJhdWQiOiJ0ZXN0aWQiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9yZWFsbXMvdGVzdCIsInByZWZlcnJlZF91c2VybmFtZSI6InRlc3R1c2VyIiwiYnNuIjoiMDAwMDAwMDAwIn0.CKub7h5He-7acsX5pli41jZiatfM3eM-f5bl6M9GaSSVJLy-NHH5RDSIvpNu4K3PA5uO1nn2sfiDWvfBgsqPxvssiqcmkenf1RpgaEdn7fS_bRn1ziAkYFq5tVEICluPeYELR8FNt7XGVGPakhezPnUwsdaUOBWf7ELTgbxVdBBy3Nkjg2op456glHO4C84zjABNK5grWfLCDDEwKnw4o1gz-QWAS1TPa7yQaPOJr71zjFT-o3P7EBBkASN_CiELOpno3bBxIeTa631m9BHZ8dECiffp_GQhxMqPS9bTwqTlffc-EkIamZr_90uHs3Dw8gVySYL7YTGoGDeq6w6jEw
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/jwt
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '714'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/certs
+ response:
+ body:
+ string: '{"keys":[{"kid":"4UNQAcvUcv-DFUOx_4O1gt13OdJSotqEKPZurs2vQW8","kty":"RSA","alg":"RS256","use":"sig","n":"2DOZ0qHie73SuFVR7civrl6r82YUiAghfzaMowjCg0o06AF--2lIS7vNV_PbsVVznPAAMqVrNG-8CcevEzvVZMQD9nH4DI7xlOxK0lrYu8rmMeSfOvXVbBVsWBZe0jnGNukZqjwmRE5__ttJdxPfIBT5-2L6mguQbDfhSUEEdIW7y7UfOXvqLqEcBtoIEB-ORKDTUIQwGZM5mSCy-cY3cHvvZfZVgaUUy5NvujPRXTMje4n_hG0KfEV-40G9qC2_Xvx4EooJzBZ6FSThiWhCpwhIvzcQqB6M9lHW7nU6wADhYPNCa2OKWvphwZ_zbrF4B9dmS6Zli5rBvbox9Hh45w","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMLTANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANgzmdKh4nu90rhVUe3Ir65eq/NmFIgIIX82jKMIwoNKNOgBfvtpSEu7zVfz27FVc5zwADKlazRvvAnHrxM71WTEA/Zx+AyO8ZTsStJa2LvK5jHknzr11WwVbFgWXtI5xjbpGao8JkROf/7bSXcT3yAU+fti+poLkGw34UlBBHSFu8u1Hzl76i6hHAbaCBAfjkSg01CEMBmTOZkgsvnGN3B772X2VYGlFMuTb7oz0V0zI3uJ/4RtCnxFfuNBvagtv178eBKKCcwWehUk4YloQqcISL83EKgejPZR1u51OsAA4WDzQmtjilr6YcGf826xeAfXZkumZYuawb26MfR4eOcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAsnQG/Yi2g1XTCJn74hWv9MjxVAaZb4gBAc2AWm5VgAjhFEM9h6x6m1mQkq7JM4rIdAj8jw55Ok9CBVBIqq4G4cME3eUvVytkj2lC9zcRoAivjjZF2HPg7zNPa2TTR50asmHPRokppV6gewO/C+o5as+4P2zqDXBh61aRd/9kdQfkg14LBbH5/dYccAuvUqlTYC4IEPCvVmBNC1xsMjf0vohvoSjm9vL2bfqG/RJH0ScdCjOd5d2zju4/e2oVdluWm+vzKBQplc7tVMuKpn6LcLmVHiGNAl+EBIZH+WVLlTx0D1+kbHZsfLYG53lQg2LsvurRbWyF/a5fVM/oLTn5ag=="],"x5t":"H5xfs1pRtvX0HyVTskx7eTXx88U","x5t#S256":"XurVtKAIEyc4w9HCGOhnjoRHnYu4d9HCn_5YHmkScJg"},{"kid":"TV3Tl5jIY1nrJLSb53UKEubLR5gYiq9slq1SsDDg1HU","kty":"RSA","alg":"RSA-OAEP","use":"enc","n":"pNvU3ecpVHbJT4bCOEpw6cnV1yi65tB3I0bRF2ilLVOY944QRAGnjBBECPIzNbgqavghYp1j75F2nq6_ny1CYfoaxTV2iDpRUw8_f7sliYbl8FrLLat0S25ItlZrg5TEJHObvOqlG2_nXoeH36MRWwNhms2uCqfhn5VgtenIzpQIBolnM7zzGp21NvdJ1C_ZAUzkXC-l3oQ-BXTtpEVM4h2KpYh4gfZJWCbYij5d1e1YApKD6V61_Cs3Oa2OY7CAUyq5kgAWJZFDB6CpzIr226u3bV7F9RbrQu3Ybc_Lv33EwykscLznKWZY2Mbs3Iz_rFNv3sVX_vHpH4DHWlKu7Q","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMlzANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKTb1N3nKVR2yU+GwjhKcOnJ1dcouubQdyNG0RdopS1TmPeOEEQBp4wQRAjyMzW4Kmr4IWKdY++Rdp6uv58tQmH6GsU1dog6UVMPP3+7JYmG5fBayy2rdEtuSLZWa4OUxCRzm7zqpRtv516Hh9+jEVsDYZrNrgqn4Z+VYLXpyM6UCAaJZzO88xqdtTb3SdQv2QFM5Fwvpd6EPgV07aRFTOIdiqWIeIH2SVgm2Io+XdXtWAKSg+letfwrNzmtjmOwgFMquZIAFiWRQwegqcyK9turt21exfUW60Lt2G3Py799xMMpLHC85ylmWNjG7NyM/6xTb97FV/7x6R+Ax1pSru0CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAQGJHeTYSMvp0yndbIn7DLohO9lom5nRrx/bLyb7TiRfogyJEF6rQZ66CAkQFk5eMF878fsHTuMVjtmXVBnhojhVmK91HwjsNQu/8xR6QMXNKJQMvHR245vwUGxlWRw/36ObM1D7QjCd/q+FonpBEY4m5Y6Uz1U0HR2Cbh0E2afVlPLeV+F0LKrlyVMdIaWBGWftCGIKDAHaG/PD66zbAKtxerv2fBIDq100WHPhd57BZxX+2aGJp1IaRDgkxV0E/CjEy3+Knd8xbAgUSW0Tl6OTC75exIvlbzeluEBe0wlapAb7WvBKYsipSW8G8Ey7tjoolDT4AU82EaKUPstiMnA=="],"x5t":"AlfHDI0FOPQpt3RBAILt0dtW1yw","x5t#S256":"a7bhm8-JsnfY7bL_m8Yl72hgmp5516VZlFcVloKzk08"}]}'
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/json;charset=UTF-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '2909'
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/EHerkenningCallbackTests/EHerkenningCallbackTests.test_redirects_after_successful_auth.yaml b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/EHerkenningCallbackTests/EHerkenningCallbackTests.test_redirects_after_successful_auth.yaml
new file mode 100644
index 0000000000..d29464f017
--- /dev/null
+++ b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/EHerkenningCallbackTests/EHerkenningCallbackTests.test_redirects_after_successful_auth.yaml
@@ -0,0 +1,371 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.32.2
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n\n\n\n\n\n\n"
+ headers:
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '1573'
+ status:
+ code: 400
+ message: Bad Request
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.32.2
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth?response_type=code&scope=openid+kvk&client_id=testid&redirect_uri=http%3A%2F%2Ftestserver%2Feherkenning-oidc%2Fcallback%2F&state=not-a-random-string&nonce=not-a-random-string
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n \n\n\n\n\n
+ \ \n
\n
+ \ \n
\n
+ \
\n\n\n
\n \n\n\n\n\n\n
+ \
\n
\n\n
\n
\n\n\n"
+ headers:
+ Cache-Control:
+ - no-store, must-revalidate, max-age=0
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Set-Cookie:
+ - AUTH_SESSION_ID=df5757ac-89bc-4e64-89b3-53e82b13d607; Version=1; Path=/realms/test/;
+ SameSite=None; Secure; HttpOnly
+ - AUTH_SESSION_ID_LEGACY=df5757ac-89bc-4e64-89b3-53e82b13d607; Version=1; Path=/realms/test/;
+ HttpOnly
+ - KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJjaWQiOiJ0ZXN0aWQiLCJwdHkiOiJvcGVuaWQtY29ubmVjdCIsInJ1cmkiOiJodHRwOi8vdGVzdHNlcnZlci9laGVya2VubmluZy1vaWRjL2NhbGxiYWNrLyIsImFjdCI6IkFVVEhFTlRJQ0FURSIsIm5vdGVzIjp7InNjb3BlIjoib3BlbmlkIGt2ayIsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9yZWFsbXMvdGVzdCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwicmVkaXJlY3RfdXJpIjoiaHR0cDovL3Rlc3RzZXJ2ZXIvZWhlcmtlbm5pbmctb2lkYy9jYWxsYmFjay8iLCJzdGF0ZSI6Im5vdC1hLXJhbmRvbS1zdHJpbmciLCJub25jZSI6Im5vdC1hLXJhbmRvbS1zdHJpbmcifX0.SpI7JvuDjU8Dn4CR3RD56sJAxNizNRciRym82v57Ylo;
+ Version=1; Path=/realms/test/; HttpOnly
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '4466'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: username=testuser&password=testuser&credentialId=&login=Sign+In
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '63'
+ Content-Type:
+ - application/x-www-form-urlencoded
+ Cookie:
+ - AUTH_SESSION_ID_LEGACY=df5757ac-89bc-4e64-89b3-53e82b13d607; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJjaWQiOiJ0ZXN0aWQiLCJwdHkiOiJvcGVuaWQtY29ubmVjdCIsInJ1cmkiOiJodHRwOi8vdGVzdHNlcnZlci9laGVya2VubmluZy1vaWRjL2NhbGxiYWNrLyIsImFjdCI6IkFVVEhFTlRJQ0FURSIsIm5vdGVzIjp7InNjb3BlIjoib3BlbmlkIGt2ayIsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9yZWFsbXMvdGVzdCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwicmVkaXJlY3RfdXJpIjoiaHR0cDovL3Rlc3RzZXJ2ZXIvZWhlcmtlbm5pbmctb2lkYy9jYWxsYmFjay8iLCJzdGF0ZSI6Im5vdC1hLXJhbmRvbS1zdHJpbmciLCJub25jZSI6Im5vdC1hLXJhbmRvbS1zdHJpbmcifX0.SpI7JvuDjU8Dn4CR3RD56sJAxNizNRciRym82v57Ylo
+ User-Agent:
+ - python-requests/2.32.2
+ method: POST
+ uri: http://localhost:8080/realms/test/login-actions/authenticate?session_code=-NCKpg9ydyaj8FgYCAMb4brTpMKx5GWWF6af5B6yb5Y&execution=d8b8778e-a545-45d4-8f72-fd69facf4b72&client_id=testid&tab_id=xYdHuUjni-0
+ response:
+ body:
+ string: ''
+ headers:
+ Cache-Control:
+ - no-store, must-revalidate, max-age=0
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Location:
+ - http://testserver/eherkenning-oidc/callback/?state=not-a-random-string&session_state=df5757ac-89bc-4e64-89b3-53e82b13d607&iss=http%3A%2F%2Flocalhost%3A8080%2Frealms%2Ftest&code=dd18b664-ae97-41de-9e46-4ae518855522.df5757ac-89bc-4e64-89b3-53e82b13d607.adf4ad83-4550-4619-9231-73bd8d700f45
+ Referrer-Policy:
+ - no-referrer
+ Set-Cookie:
+ - KEYCLOAK_LOCALE=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test/; HttpOnly
+ - KC_RESTART=; Version=1; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0;
+ Path=/realms/test/; HttpOnly
+ - KC_AUTH_STATE=; Version=1; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0;
+ Path=/realms/test/
+ - KEYCLOAK_IDENTITY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTgyMzgwMDYsImlhdCI6MTcxODIwMjAwNiwianRpIjoiNWQyOTdhODYtMTEzOC00ZjVhLWIwZmMtYjIxMzg3MzNhOTM1IiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiYWExMGNmYzctMmM0ZC00MWY2LThmYWMtN2JmNDA1YzU3MmM0IiwidHlwIjoiU2VyaWFsaXplZC1JRCIsInNlc3Npb25fc3RhdGUiOiJkZjU3NTdhYy04OWJjLTRlNjQtODliMy01M2U4MmIxM2Q2MDciLCJzaWQiOiJkZjU3NTdhYy04OWJjLTRlNjQtODliMy01M2U4MmIxM2Q2MDciLCJzdGF0ZV9jaGVja2VyIjoidnI0NGxzZmd5eDNuanFBM3V3RkhEa3QzYTNYdGVhdDlMemE0TDhpdVZUTSJ9.Ls4Cuy_O0cwrFN4TjENNFmPPSFAJxCCSTY2mhL1fzIQ;
+ Version=1; Path=/realms/test/; SameSite=None; Secure; HttpOnly
+ - KEYCLOAK_IDENTITY_LEGACY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTgyMzgwMDYsImlhdCI6MTcxODIwMjAwNiwianRpIjoiNWQyOTdhODYtMTEzOC00ZjVhLWIwZmMtYjIxMzg3MzNhOTM1IiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiYWExMGNmYzctMmM0ZC00MWY2LThmYWMtN2JmNDA1YzU3MmM0IiwidHlwIjoiU2VyaWFsaXplZC1JRCIsInNlc3Npb25fc3RhdGUiOiJkZjU3NTdhYy04OWJjLTRlNjQtODliMy01M2U4MmIxM2Q2MDciLCJzaWQiOiJkZjU3NTdhYy04OWJjLTRlNjQtODliMy01M2U4MmIxM2Q2MDciLCJzdGF0ZV9jaGVja2VyIjoidnI0NGxzZmd5eDNuanFBM3V3RkhEa3QzYTNYdGVhdDlMemE0TDhpdVZUTSJ9.Ls4Cuy_O0cwrFN4TjENNFmPPSFAJxCCSTY2mhL1fzIQ;
+ Version=1; Path=/realms/test/; HttpOnly
+ - KEYCLOAK_SESSION=test/aa10cfc7-2c4d-41f6-8fac-7bf405c572c4/df5757ac-89bc-4e64-89b3-53e82b13d607;
+ Version=1; Expires=Thu, 13-Jun-2024 00:20:06 GMT; Max-Age=36000; Path=/realms/test/;
+ SameSite=None; Secure
+ - KEYCLOAK_SESSION_LEGACY=test/aa10cfc7-2c4d-41f6-8fac-7bf405c572c4/df5757ac-89bc-4e64-89b3-53e82b13d607;
+ Version=1; Expires=Thu, 13-Jun-2024 00:20:06 GMT; Max-Age=36000; Path=/realms/test/
+ - KEYCLOAK_REMEMBER_ME=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test/; HttpOnly
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '0'
+ status:
+ code: 302
+ message: Found
+- request:
+ body: client_id=testid&client_secret=7DB3KUAAizYCcmZufpHRVOcD0TOkNO3I&grant_type=authorization_code&code=dd18b664-ae97-41de-9e46-4ae518855522.df5757ac-89bc-4e64-89b3-53e82b13d607.adf4ad83-4550-4619-9231-73bd8d700f45&redirect_uri=http%3A%2F%2Ftestserver%2Feherkenning-oidc%2Fcallback%2F
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '279'
+ Content-Type:
+ - application/x-www-form-urlencoded
+ User-Agent:
+ - python-requests/2.32.2
+ method: POST
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/token
+ response:
+ body:
+ string: '{"access_token":"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTgyMDIzMDYsImlhdCI6MTcxODIwMjAwNiwiYXV0aF90aW1lIjoxNzE4MjAyMDA2LCJqdGkiOiI3YjZlODBkNS1lNjVkLTQwNDAtYjAxMi1hN2ViMmE0YWY2MzEiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiYWExMGNmYzctMmM0ZC00MWY2LThmYWMtN2JmNDA1YzU3MmM0IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoidGVzdGlkIiwibm9uY2UiOiJub3QtYS1yYW5kb20tc3RyaW5nIiwic2Vzc2lvbl9zdGF0ZSI6ImRmNTc1N2FjLTg5YmMtNGU2NC04OWIzLTUzZTgyYjEzZDYwNyIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOlsiaHR0cDovLzEyNy4wLjAuMTo4MDAwIl0sInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJkZWZhdWx0LXJvbGVzLXRlc3QiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgZW1haWwgcHJvZmlsZSBrdmsgZ3JvdXBzIGJzbiIsInNpZCI6ImRmNTc1N2FjLTg5YmMtNGU2NC04OWIzLTUzZTgyYjEzZDYwNyIsImt2ayI6IjAxMjM0NTY3OCIsImVtYWlsX3ZlcmlmaWVkIjpmYWxzZSwibGVnYWxTdWJqZWN0SUQiOiIxMjM0NTY3OCIsImFjdGluZ1N1YmplY3RJRCI6IjRCNzVBMEVBMTA3QjNEMzYiLCJuYW1lX3F1YWxpZmllciI6InVybjpldG9lZ2FuZzoxLjk6RW50aXR5Q29uY2VybmVkSUQ6S3ZLbnIiLCJncm91cHMiOlsiZGVmYXVsdC1yb2xlcy10ZXN0Iiwib2ZmbGluZV9hY2Nlc3MiLCJ1bWFfYXV0aG9yaXphdGlvbiJdLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJ0ZXN0dXNlciIsImJzbiI6IjAwMDAwMDAwMCJ9.MAPWPFIBe_IFKW8eKowhGj07Kck9j1p8W41p9j5JeF5RigIwVuYbvBVvD2oX1I_kAc_z-QP3lvjAXF3jys0qaghKR_3ZC4YFagke5tjM3aLIO_NlfpYYPrhkXRcLF4BJnQbX1wwSJCmKzhUY_FYxO9VsEbWvLXpd0yKwk6H8MYuvuWjzXuzBnie8P7sCkhxWOB0NsslCJGJaTl2XRxNWGwkl2HYbAghkYWFQceVcL0q2T9yapKGFkGV9QqbhShQXeFY6gSmQPAJwxhxGd3i1r67kQbkdgqIQeXFecyOSr0NYeEFCl1eHIxL2mSPWW0LcJ9SQlvYnWAXpeHPpN_wJ0g","expires_in":300,"refresh_expires_in":1800,"refresh_token":"eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTgyMDM4MDYsImlhdCI6MTcxODIwMjAwNiwianRpIjoiMzlhMzg2ZTEtOTQ0Yy00ZjA2LWEyZGYtNzZhYmU3Y2Y1YWI3IiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0IiwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiYWExMGNmYzctMmM0ZC00MWY2LThmYWMtN2JmNDA1YzU3MmM0IiwidHlwIjoiUmVmcmVzaCIsImF6cCI6InRlc3RpZCIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsInNlc3Npb25fc3RhdGUiOiJkZjU3NTdhYy04OWJjLTRlNjQtODliMy01M2U4MmIxM2Q2MDciLCJzY29wZSI6Im9wZW5pZCBlbWFpbCBwcm9maWxlIGt2ayBncm91cHMgYnNuIiwic2lkIjoiZGY1NzU3YWMtODliYy00ZTY0LTg5YjMtNTNlODJiMTNkNjA3In0.r2yy7bxF7bD82iurT70DuE5BIPHpQj_cuPJJZj0Nlko","token_type":"Bearer","id_token":"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTgyMDIzMDYsImlhdCI6MTcxODIwMjAwNiwiYXV0aF90aW1lIjoxNzE4MjAyMDA2LCJqdGkiOiI1N2NmNWRkMS1kN2NiLTRhYjEtOGY2Zi1kYjgyZDAzNWVmMGQiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJ0ZXN0aWQiLCJzdWIiOiJhYTEwY2ZjNy0yYzRkLTQxZjYtOGZhYy03YmY0MDVjNTcyYzQiLCJ0eXAiOiJJRCIsImF6cCI6InRlc3RpZCIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsInNlc3Npb25fc3RhdGUiOiJkZjU3NTdhYy04OWJjLTRlNjQtODliMy01M2U4MmIxM2Q2MDciLCJhdF9oYXNoIjoiNk9MZFBaaTl5RnJ6b2N3OU5lUGE0ZyIsImFjciI6IjEiLCJzaWQiOiJkZjU3NTdhYy04OWJjLTRlNjQtODliMy01M2U4MmIxM2Q2MDciLCJrdmsiOiIwMTIzNDU2NzgiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsImxlZ2FsU3ViamVjdElEIjoiMTIzNDU2NzgiLCJhY3RpbmdTdWJqZWN0SUQiOiI0Qjc1QTBFQTEwN0IzRDM2IiwibmFtZV9xdWFsaWZpZXIiOiJ1cm46ZXRvZWdhbmc6MS45OkVudGl0eUNvbmNlcm5lZElEOkt2S25yIiwiZ3JvdXBzIjpbImRlZmF1bHQtcm9sZXMtdGVzdCIsIm9mZmxpbmVfYWNjZXNzIiwidW1hX2F1dGhvcml6YXRpb24iXSwicHJlZmVycmVkX3VzZXJuYW1lIjoidGVzdHVzZXIiLCJic24iOiIwMDAwMDAwMDAifQ.fjsNPgfxXjbh-4Cv5sRQWF0Af5FCiLi4xhmMk2NGM0N9iw80i22wGuqd3zrscXYtuV7AUJ90jMVN_WCmjwsetDiLmHHhYouoPQYsJ3TMYQNSGHWwk-az3FWJKAcQ5GWDA6CvYxZhdapIb9SsdWpbdCizHjj5u1cbXUUb6GCb6VvXJaeXYeFgWAnBXbdz30m22fvlSDePpFdeJrXnGoZQX2cxjzoB3kjHGxOfCZ8w5FnvVX6dlkUzlini2qYWlSdEy8ceKuB3D-ikLw7-9D8yB_e310zAnR8RuFCC7tJhfOAOAF5VGf29DNSZjDAmuIxdqhNImzqz-oQXZrG7Bv43Yg","not-before-policy":0,"session_state":"df5757ac-89bc-4e64-89b3-53e82b13d607","scope":"openid
+ email profile kvk groups bsn"}'
+ headers:
+ Cache-Control:
+ - no-store
+ Content-Type:
+ - application/json
+ Pragma:
+ - no-cache
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '4018'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.32.2
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/certs
+ response:
+ body:
+ string: '{"keys":[{"kid":"4UNQAcvUcv-DFUOx_4O1gt13OdJSotqEKPZurs2vQW8","kty":"RSA","alg":"RS256","use":"sig","n":"2DOZ0qHie73SuFVR7civrl6r82YUiAghfzaMowjCg0o06AF--2lIS7vNV_PbsVVznPAAMqVrNG-8CcevEzvVZMQD9nH4DI7xlOxK0lrYu8rmMeSfOvXVbBVsWBZe0jnGNukZqjwmRE5__ttJdxPfIBT5-2L6mguQbDfhSUEEdIW7y7UfOXvqLqEcBtoIEB-ORKDTUIQwGZM5mSCy-cY3cHvvZfZVgaUUy5NvujPRXTMje4n_hG0KfEV-40G9qC2_Xvx4EooJzBZ6FSThiWhCpwhIvzcQqB6M9lHW7nU6wADhYPNCa2OKWvphwZ_zbrF4B9dmS6Zli5rBvbox9Hh45w","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMLTANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANgzmdKh4nu90rhVUe3Ir65eq/NmFIgIIX82jKMIwoNKNOgBfvtpSEu7zVfz27FVc5zwADKlazRvvAnHrxM71WTEA/Zx+AyO8ZTsStJa2LvK5jHknzr11WwVbFgWXtI5xjbpGao8JkROf/7bSXcT3yAU+fti+poLkGw34UlBBHSFu8u1Hzl76i6hHAbaCBAfjkSg01CEMBmTOZkgsvnGN3B772X2VYGlFMuTb7oz0V0zI3uJ/4RtCnxFfuNBvagtv178eBKKCcwWehUk4YloQqcISL83EKgejPZR1u51OsAA4WDzQmtjilr6YcGf826xeAfXZkumZYuawb26MfR4eOcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAsnQG/Yi2g1XTCJn74hWv9MjxVAaZb4gBAc2AWm5VgAjhFEM9h6x6m1mQkq7JM4rIdAj8jw55Ok9CBVBIqq4G4cME3eUvVytkj2lC9zcRoAivjjZF2HPg7zNPa2TTR50asmHPRokppV6gewO/C+o5as+4P2zqDXBh61aRd/9kdQfkg14LBbH5/dYccAuvUqlTYC4IEPCvVmBNC1xsMjf0vohvoSjm9vL2bfqG/RJH0ScdCjOd5d2zju4/e2oVdluWm+vzKBQplc7tVMuKpn6LcLmVHiGNAl+EBIZH+WVLlTx0D1+kbHZsfLYG53lQg2LsvurRbWyF/a5fVM/oLTn5ag=="],"x5t":"H5xfs1pRtvX0HyVTskx7eTXx88U","x5t#S256":"XurVtKAIEyc4w9HCGOhnjoRHnYu4d9HCn_5YHmkScJg"},{"kid":"TV3Tl5jIY1nrJLSb53UKEubLR5gYiq9slq1SsDDg1HU","kty":"RSA","alg":"RSA-OAEP","use":"enc","n":"pNvU3ecpVHbJT4bCOEpw6cnV1yi65tB3I0bRF2ilLVOY944QRAGnjBBECPIzNbgqavghYp1j75F2nq6_ny1CYfoaxTV2iDpRUw8_f7sliYbl8FrLLat0S25ItlZrg5TEJHObvOqlG2_nXoeH36MRWwNhms2uCqfhn5VgtenIzpQIBolnM7zzGp21NvdJ1C_ZAUzkXC-l3oQ-BXTtpEVM4h2KpYh4gfZJWCbYij5d1e1YApKD6V61_Cs3Oa2OY7CAUyq5kgAWJZFDB6CpzIr226u3bV7F9RbrQu3Ybc_Lv33EwykscLznKWZY2Mbs3Iz_rFNv3sVX_vHpH4DHWlKu7Q","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMlzANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKTb1N3nKVR2yU+GwjhKcOnJ1dcouubQdyNG0RdopS1TmPeOEEQBp4wQRAjyMzW4Kmr4IWKdY++Rdp6uv58tQmH6GsU1dog6UVMPP3+7JYmG5fBayy2rdEtuSLZWa4OUxCRzm7zqpRtv516Hh9+jEVsDYZrNrgqn4Z+VYLXpyM6UCAaJZzO88xqdtTb3SdQv2QFM5Fwvpd6EPgV07aRFTOIdiqWIeIH2SVgm2Io+XdXtWAKSg+letfwrNzmtjmOwgFMquZIAFiWRQwegqcyK9turt21exfUW60Lt2G3Py799xMMpLHC85ylmWNjG7NyM/6xTb97FV/7x6R+Ax1pSru0CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAQGJHeTYSMvp0yndbIn7DLohO9lom5nRrx/bLyb7TiRfogyJEF6rQZ66CAkQFk5eMF878fsHTuMVjtmXVBnhojhVmK91HwjsNQu/8xR6QMXNKJQMvHR245vwUGxlWRw/36ObM1D7QjCd/q+FonpBEY4m5Y6Uz1U0HR2Cbh0E2afVlPLeV+F0LKrlyVMdIaWBGWftCGIKDAHaG/PD66zbAKtxerv2fBIDq100WHPhd57BZxX+2aGJp1IaRDgkxV0E/CjEy3+Knd8xbAgUSW0Tl6OTC75exIvlbzeluEBe0wlapAb7WvBKYsipSW8G8Ey7tjoolDT4AU82EaKUPstiMnA=="],"x5t":"AlfHDI0FOPQpt3RBAILt0dtW1yw","x5t#S256":"a7bhm8-JsnfY7bL_m8Yl72hgmp5516VZlFcVloKzk08"}]}'
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/json;charset=UTF-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '2909'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Authorization:
+ - Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTgyMDIzMDYsImlhdCI6MTcxODIwMjAwNiwiYXV0aF90aW1lIjoxNzE4MjAyMDA2LCJqdGkiOiI3YjZlODBkNS1lNjVkLTQwNDAtYjAxMi1hN2ViMmE0YWY2MzEiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiYWExMGNmYzctMmM0ZC00MWY2LThmYWMtN2JmNDA1YzU3MmM0IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoidGVzdGlkIiwibm9uY2UiOiJub3QtYS1yYW5kb20tc3RyaW5nIiwic2Vzc2lvbl9zdGF0ZSI6ImRmNTc1N2FjLTg5YmMtNGU2NC04OWIzLTUzZTgyYjEzZDYwNyIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOlsiaHR0cDovLzEyNy4wLjAuMTo4MDAwIl0sInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJkZWZhdWx0LXJvbGVzLXRlc3QiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgZW1haWwgcHJvZmlsZSBrdmsgZ3JvdXBzIGJzbiIsInNpZCI6ImRmNTc1N2FjLTg5YmMtNGU2NC04OWIzLTUzZTgyYjEzZDYwNyIsImt2ayI6IjAxMjM0NTY3OCIsImVtYWlsX3ZlcmlmaWVkIjpmYWxzZSwibGVnYWxTdWJqZWN0SUQiOiIxMjM0NTY3OCIsImFjdGluZ1N1YmplY3RJRCI6IjRCNzVBMEVBMTA3QjNEMzYiLCJuYW1lX3F1YWxpZmllciI6InVybjpldG9lZ2FuZzoxLjk6RW50aXR5Q29uY2VybmVkSUQ6S3ZLbnIiLCJncm91cHMiOlsiZGVmYXVsdC1yb2xlcy10ZXN0Iiwib2ZmbGluZV9hY2Nlc3MiLCJ1bWFfYXV0aG9yaXphdGlvbiJdLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJ0ZXN0dXNlciIsImJzbiI6IjAwMDAwMDAwMCJ9.MAPWPFIBe_IFKW8eKowhGj07Kck9j1p8W41p9j5JeF5RigIwVuYbvBVvD2oX1I_kAc_z-QP3lvjAXF3jys0qaghKR_3ZC4YFagke5tjM3aLIO_NlfpYYPrhkXRcLF4BJnQbX1wwSJCmKzhUY_FYxO9VsEbWvLXpd0yKwk6H8MYuvuWjzXuzBnie8P7sCkhxWOB0NsslCJGJaTl2XRxNWGwkl2HYbAghkYWFQceVcL0q2T9yapKGFkGV9QqbhShQXeFY6gSmQPAJwxhxGd3i1r67kQbkdgqIQeXFecyOSr0NYeEFCl1eHIxL2mSPWW0LcJ9SQlvYnWAXpeHPpN_wJ0g
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.32.2
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/userinfo
+ response:
+ body:
+ string: eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJzdWIiOiJhYTEwY2ZjNy0yYzRkLTQxZjYtOGZhYy03YmY0MDVjNTcyYzQiLCJrdmsiOiIwMTIzNDU2NzgiLCJhdWQiOiJ0ZXN0aWQiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsImxlZ2FsU3ViamVjdElEIjoiMTIzNDU2NzgiLCJhY3RpbmdTdWJqZWN0SUQiOiI0Qjc1QTBFQTEwN0IzRDM2IiwibmFtZV9xdWFsaWZpZXIiOiJ1cm46ZXRvZWdhbmc6MS45OkVudGl0eUNvbmNlcm5lZElEOkt2S25yIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0IiwiZ3JvdXBzIjpbImRlZmF1bHQtcm9sZXMtdGVzdCIsIm9mZmxpbmVfYWNjZXNzIiwidW1hX2F1dGhvcml6YXRpb24iXSwicHJlZmVycmVkX3VzZXJuYW1lIjoidGVzdHVzZXIiLCJic24iOiIwMDAwMDAwMDAifQ.J2Bfcd1F9wUCureqh3JXo8oHFr7Aol2gumeh0Lzvwm2Cxc9f-c8ZXChJykDV50mvTs6fz6D8m3S4rHIdz27SMdGSGYLtMfmAdxYnKnY5zUmpmqcRqBELV8-jfEewSNtaBD-nM8TOK-qoDropCwEf0100n_Daf5tk3gYliBia-EZQ_YnC19w_ynLy4F2UvJB0HkZP431BOD6AaUpL--e14orHsAVApoFFwilkMzZv7oG9Qgns0DQPQLZz82DnU33WzzbC3MkGINRCj9-5VcY5HCRTDW_GF4WHUBwpJyMZR1an6-SrbdJ3kjlfSQ-Nqn0ax16Je54-ijafnCECj8wooQ
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/jwt
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '973'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.32.2
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/certs
+ response:
+ body:
+ string: '{"keys":[{"kid":"4UNQAcvUcv-DFUOx_4O1gt13OdJSotqEKPZurs2vQW8","kty":"RSA","alg":"RS256","use":"sig","n":"2DOZ0qHie73SuFVR7civrl6r82YUiAghfzaMowjCg0o06AF--2lIS7vNV_PbsVVznPAAMqVrNG-8CcevEzvVZMQD9nH4DI7xlOxK0lrYu8rmMeSfOvXVbBVsWBZe0jnGNukZqjwmRE5__ttJdxPfIBT5-2L6mguQbDfhSUEEdIW7y7UfOXvqLqEcBtoIEB-ORKDTUIQwGZM5mSCy-cY3cHvvZfZVgaUUy5NvujPRXTMje4n_hG0KfEV-40G9qC2_Xvx4EooJzBZ6FSThiWhCpwhIvzcQqB6M9lHW7nU6wADhYPNCa2OKWvphwZ_zbrF4B9dmS6Zli5rBvbox9Hh45w","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMLTANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANgzmdKh4nu90rhVUe3Ir65eq/NmFIgIIX82jKMIwoNKNOgBfvtpSEu7zVfz27FVc5zwADKlazRvvAnHrxM71WTEA/Zx+AyO8ZTsStJa2LvK5jHknzr11WwVbFgWXtI5xjbpGao8JkROf/7bSXcT3yAU+fti+poLkGw34UlBBHSFu8u1Hzl76i6hHAbaCBAfjkSg01CEMBmTOZkgsvnGN3B772X2VYGlFMuTb7oz0V0zI3uJ/4RtCnxFfuNBvagtv178eBKKCcwWehUk4YloQqcISL83EKgejPZR1u51OsAA4WDzQmtjilr6YcGf826xeAfXZkumZYuawb26MfR4eOcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAsnQG/Yi2g1XTCJn74hWv9MjxVAaZb4gBAc2AWm5VgAjhFEM9h6x6m1mQkq7JM4rIdAj8jw55Ok9CBVBIqq4G4cME3eUvVytkj2lC9zcRoAivjjZF2HPg7zNPa2TTR50asmHPRokppV6gewO/C+o5as+4P2zqDXBh61aRd/9kdQfkg14LBbH5/dYccAuvUqlTYC4IEPCvVmBNC1xsMjf0vohvoSjm9vL2bfqG/RJH0ScdCjOd5d2zju4/e2oVdluWm+vzKBQplc7tVMuKpn6LcLmVHiGNAl+EBIZH+WVLlTx0D1+kbHZsfLYG53lQg2LsvurRbWyF/a5fVM/oLTn5ag=="],"x5t":"H5xfs1pRtvX0HyVTskx7eTXx88U","x5t#S256":"XurVtKAIEyc4w9HCGOhnjoRHnYu4d9HCn_5YHmkScJg"},{"kid":"TV3Tl5jIY1nrJLSb53UKEubLR5gYiq9slq1SsDDg1HU","kty":"RSA","alg":"RSA-OAEP","use":"enc","n":"pNvU3ecpVHbJT4bCOEpw6cnV1yi65tB3I0bRF2ilLVOY944QRAGnjBBECPIzNbgqavghYp1j75F2nq6_ny1CYfoaxTV2iDpRUw8_f7sliYbl8FrLLat0S25ItlZrg5TEJHObvOqlG2_nXoeH36MRWwNhms2uCqfhn5VgtenIzpQIBolnM7zzGp21NvdJ1C_ZAUzkXC-l3oQ-BXTtpEVM4h2KpYh4gfZJWCbYij5d1e1YApKD6V61_Cs3Oa2OY7CAUyq5kgAWJZFDB6CpzIr226u3bV7F9RbrQu3Ybc_Lv33EwykscLznKWZY2Mbs3Iz_rFNv3sVX_vHpH4DHWlKu7Q","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMlzANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKTb1N3nKVR2yU+GwjhKcOnJ1dcouubQdyNG0RdopS1TmPeOEEQBp4wQRAjyMzW4Kmr4IWKdY++Rdp6uv58tQmH6GsU1dog6UVMPP3+7JYmG5fBayy2rdEtuSLZWa4OUxCRzm7zqpRtv516Hh9+jEVsDYZrNrgqn4Z+VYLXpyM6UCAaJZzO88xqdtTb3SdQv2QFM5Fwvpd6EPgV07aRFTOIdiqWIeIH2SVgm2Io+XdXtWAKSg+letfwrNzmtjmOwgFMquZIAFiWRQwegqcyK9turt21exfUW60Lt2G3Py799xMMpLHC85ylmWNjG7NyM/6xTb97FV/7x6R+Ax1pSru0CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAQGJHeTYSMvp0yndbIn7DLohO9lom5nRrx/bLyb7TiRfogyJEF6rQZ66CAkQFk5eMF878fsHTuMVjtmXVBnhojhVmK91HwjsNQu/8xR6QMXNKJQMvHR245vwUGxlWRw/36ObM1D7QjCd/q+FonpBEY4m5Y6Uz1U0HR2Cbh0E2afVlPLeV+F0LKrlyVMdIaWBGWftCGIKDAHaG/PD66zbAKtxerv2fBIDq100WHPhd57BZxX+2aGJp1IaRDgkxV0E/CjEy3+Knd8xbAgUSW0Tl6OTC75exIvlbzeluEBe0wlapAb7WvBKYsipSW8G8Ey7tjoolDT4AU82EaKUPstiMnA=="],"x5t":"AlfHDI0FOPQpt3RBAILt0dtW1yw","x5t#S256":"a7bhm8-JsnfY7bL_m8Yl72hgmp5516VZlFcVloKzk08"}]}'
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/json;charset=UTF-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '2909'
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/EHerkenningInitTests/EHerkenningInitTests.test_idp_availability_check.yaml b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/EHerkenningInitTests/EHerkenningInitTests.test_idp_availability_check.yaml
new file mode 100644
index 0000000000..e786ba2dc4
--- /dev/null
+++ b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/EHerkenningInitTests/EHerkenningInitTests.test_idp_availability_check.yaml
@@ -0,0 +1,26 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/i-dont-exist
+ response:
+ body:
+ string: '{"error":"Unable to find matching target resource method"}'
+ headers:
+ Content-Type:
+ - application/json
+ content-length:
+ - '58'
+ status:
+ code: 404
+ message: Not Found
+version: 1
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/EHerkenningInitTests/EHerkenningInitTests.test_keycloak_idp_hint_is_respected.yaml b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/EHerkenningInitTests/EHerkenningInitTests.test_keycloak_idp_hint_is_respected.yaml
new file mode 100644
index 0000000000..7556222e57
--- /dev/null
+++ b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/EHerkenningInitTests/EHerkenningInitTests.test_keycloak_idp_hint_is_respected.yaml
@@ -0,0 +1,59 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n\n\n\n\n\n\n"
+ headers:
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '1573'
+ status:
+ code: 400
+ message: Bad Request
+version: 1
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/EHerkenningInitTests/EHerkenningInitTests.test_start_flow_redirects_to_oidc_provider.yaml b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/EHerkenningInitTests/EHerkenningInitTests.test_start_flow_redirects_to_oidc_provider.yaml
new file mode 100644
index 0000000000..7556222e57
--- /dev/null
+++ b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/EHerkenningInitTests/EHerkenningInitTests.test_start_flow_redirects_to_oidc_provider.yaml
@@ -0,0 +1,59 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n\n\n\n\n\n\n"
+ headers:
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '1573'
+ status:
+ code: 400
+ message: Bad Request
+version: 1
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/EHerkenningLogoutTests/EHerkenningLogoutTests.test_logout_also_logs_out_user_in_openid_provider.yaml b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/EHerkenningLogoutTests/EHerkenningLogoutTests.test_logout_also_logs_out_user_in_openid_provider.yaml
new file mode 100644
index 0000000000..9ad7746ac4
--- /dev/null
+++ b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/data/vcr_cassettes/EHerkenningLogoutTests/EHerkenningLogoutTests.test_logout_also_logs_out_user_in_openid_provider.yaml
@@ -0,0 +1,727 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n\n\n\n\n\n\n"
+ headers:
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '1573'
+ status:
+ code: 400
+ message: Bad Request
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth?response_type=code&scope=openid+kvk&client_id=testid&redirect_uri=http%3A%2F%2Ftestserver%2Feherkenning-oidc%2Fcallback%2F&state=not-a-random-string&nonce=not-a-random-string
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n \n\n\n\n\n
+ \ \n
\n
+ \ \n
\n
+ \
\n\n\n
\n \n\n\n\n\n\n
+ \
\n
\n\n
\n
\n\n\n"
+ headers:
+ Cache-Control:
+ - no-store, must-revalidate, max-age=0
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Set-Cookie:
+ - AUTH_SESSION_ID=b99f3ad2-4108-4e72-9a5b-685d1de56520; Version=1; Path=/realms/test/;
+ SameSite=None; Secure; HttpOnly
+ - AUTH_SESSION_ID_LEGACY=b99f3ad2-4108-4e72-9a5b-685d1de56520; Version=1; Path=/realms/test/;
+ HttpOnly
+ - KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJjaWQiOiJ0ZXN0aWQiLCJwdHkiOiJvcGVuaWQtY29ubmVjdCIsInJ1cmkiOiJodHRwOi8vdGVzdHNlcnZlci9laGVya2VubmluZy1vaWRjL2NhbGxiYWNrLyIsImFjdCI6IkFVVEhFTlRJQ0FURSIsIm5vdGVzIjp7InNjb3BlIjoib3BlbmlkIGt2ayIsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9yZWFsbXMvdGVzdCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwicmVkaXJlY3RfdXJpIjoiaHR0cDovL3Rlc3RzZXJ2ZXIvZWhlcmtlbm5pbmctb2lkYy9jYWxsYmFjay8iLCJzdGF0ZSI6Im5vdC1hLXJhbmRvbS1zdHJpbmciLCJub25jZSI6Im5vdC1hLXJhbmRvbS1zdHJpbmcifX0.SpI7JvuDjU8Dn4CR3RD56sJAxNizNRciRym82v57Ylo;
+ Version=1; Path=/realms/test/; HttpOnly
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '4466'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: username=testuser&password=testuser&credentialId=&login=Sign+In
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '63'
+ Content-Type:
+ - application/x-www-form-urlencoded
+ Cookie:
+ - AUTH_SESSION_ID_LEGACY=b99f3ad2-4108-4e72-9a5b-685d1de56520; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJjaWQiOiJ0ZXN0aWQiLCJwdHkiOiJvcGVuaWQtY29ubmVjdCIsInJ1cmkiOiJodHRwOi8vdGVzdHNlcnZlci9laGVya2VubmluZy1vaWRjL2NhbGxiYWNrLyIsImFjdCI6IkFVVEhFTlRJQ0FURSIsIm5vdGVzIjp7InNjb3BlIjoib3BlbmlkIGt2ayIsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9yZWFsbXMvdGVzdCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwicmVkaXJlY3RfdXJpIjoiaHR0cDovL3Rlc3RzZXJ2ZXIvZWhlcmtlbm5pbmctb2lkYy9jYWxsYmFjay8iLCJzdGF0ZSI6Im5vdC1hLXJhbmRvbS1zdHJpbmciLCJub25jZSI6Im5vdC1hLXJhbmRvbS1zdHJpbmcifX0.SpI7JvuDjU8Dn4CR3RD56sJAxNizNRciRym82v57Ylo
+ User-Agent:
+ - python-requests/2.31.0
+ method: POST
+ uri: http://localhost:8080/realms/test/login-actions/authenticate?session_code=vx1PeLlJU7BNDFB0abY8KOsWaNRilGNfGtn9kj_axC8&execution=d8b8778e-a545-45d4-8f72-fd69facf4b72&client_id=testid&tab_id=D8rsSG_R_Fw
+ response:
+ body:
+ string: ''
+ headers:
+ Cache-Control:
+ - no-store, must-revalidate, max-age=0
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Location:
+ - http://testserver/eherkenning-oidc/callback/?state=not-a-random-string&session_state=b99f3ad2-4108-4e72-9a5b-685d1de56520&iss=http%3A%2F%2Flocalhost%3A8080%2Frealms%2Ftest&code=fe685f95-24c6-4bd6-835a-4ec3713b98c0.b99f3ad2-4108-4e72-9a5b-685d1de56520.adf4ad83-4550-4619-9231-73bd8d700f45
+ Referrer-Policy:
+ - no-referrer
+ Set-Cookie:
+ - KEYCLOAK_LOCALE=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test/; HttpOnly
+ - KC_RESTART=; Version=1; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0;
+ Path=/realms/test/; HttpOnly
+ - KC_AUTH_STATE=; Version=1; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0;
+ Path=/realms/test/
+ - KEYCLOAK_IDENTITY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTY0OTY4MDMsImlhdCI6MTcxNjQ2MDgwMywianRpIjoiNWYwMGI1ODUtYWNmNi00ZmMzLWI2YjAtOWM3MzhlMWY4MGYyIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiYWExMGNmYzctMmM0ZC00MWY2LThmYWMtN2JmNDA1YzU3MmM0IiwidHlwIjoiU2VyaWFsaXplZC1JRCIsInNlc3Npb25fc3RhdGUiOiJiOTlmM2FkMi00MTA4LTRlNzItOWE1Yi02ODVkMWRlNTY1MjAiLCJzaWQiOiJiOTlmM2FkMi00MTA4LTRlNzItOWE1Yi02ODVkMWRlNTY1MjAiLCJzdGF0ZV9jaGVja2VyIjoiZ2xlbnBIa3NBU0pxOUh3Z2tPTE1zUFVpLWxqcjNsbFBDYUpEdWRTTUx5SSJ9.Mqxd9PHAJhkI4CveL9qzcV33Og-ETgVA2zQgojKV9SE;
+ Version=1; Path=/realms/test/; SameSite=None; Secure; HttpOnly
+ - KEYCLOAK_IDENTITY_LEGACY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTY0OTY4MDMsImlhdCI6MTcxNjQ2MDgwMywianRpIjoiNWYwMGI1ODUtYWNmNi00ZmMzLWI2YjAtOWM3MzhlMWY4MGYyIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiYWExMGNmYzctMmM0ZC00MWY2LThmYWMtN2JmNDA1YzU3MmM0IiwidHlwIjoiU2VyaWFsaXplZC1JRCIsInNlc3Npb25fc3RhdGUiOiJiOTlmM2FkMi00MTA4LTRlNzItOWE1Yi02ODVkMWRlNTY1MjAiLCJzaWQiOiJiOTlmM2FkMi00MTA4LTRlNzItOWE1Yi02ODVkMWRlNTY1MjAiLCJzdGF0ZV9jaGVja2VyIjoiZ2xlbnBIa3NBU0pxOUh3Z2tPTE1zUFVpLWxqcjNsbFBDYUpEdWRTTUx5SSJ9.Mqxd9PHAJhkI4CveL9qzcV33Og-ETgVA2zQgojKV9SE;
+ Version=1; Path=/realms/test/; HttpOnly
+ - KEYCLOAK_SESSION=test/aa10cfc7-2c4d-41f6-8fac-7bf405c572c4/b99f3ad2-4108-4e72-9a5b-685d1de56520;
+ Version=1; Expires=Thu, 23-May-2024 20:40:03 GMT; Max-Age=36000; Path=/realms/test/;
+ SameSite=None; Secure
+ - KEYCLOAK_SESSION_LEGACY=test/aa10cfc7-2c4d-41f6-8fac-7bf405c572c4/b99f3ad2-4108-4e72-9a5b-685d1de56520;
+ Version=1; Expires=Thu, 23-May-2024 20:40:03 GMT; Max-Age=36000; Path=/realms/test/
+ - KEYCLOAK_REMEMBER_ME=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test/; HttpOnly
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '0'
+ status:
+ code: 302
+ message: Found
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n\n\n\n\n\n\n"
+ headers:
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '1573'
+ status:
+ code: 400
+ message: Bad Request
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ Cookie:
+ - AUTH_SESSION_ID_LEGACY=b99f3ad2-4108-4e72-9a5b-685d1de56520; KEYCLOAK_IDENTITY_LEGACY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTY0OTY4MDMsImlhdCI6MTcxNjQ2MDgwMywianRpIjoiNWYwMGI1ODUtYWNmNi00ZmMzLWI2YjAtOWM3MzhlMWY4MGYyIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiYWExMGNmYzctMmM0ZC00MWY2LThmYWMtN2JmNDA1YzU3MmM0IiwidHlwIjoiU2VyaWFsaXplZC1JRCIsInNlc3Npb25fc3RhdGUiOiJiOTlmM2FkMi00MTA4LTRlNzItOWE1Yi02ODVkMWRlNTY1MjAiLCJzaWQiOiJiOTlmM2FkMi00MTA4LTRlNzItOWE1Yi02ODVkMWRlNTY1MjAiLCJzdGF0ZV9jaGVja2VyIjoiZ2xlbnBIa3NBU0pxOUh3Z2tPTE1zUFVpLWxqcjNsbFBDYUpEdWRTTUx5SSJ9.Mqxd9PHAJhkI4CveL9qzcV33Og-ETgVA2zQgojKV9SE;
+ KEYCLOAK_SESSION_LEGACY=test/aa10cfc7-2c4d-41f6-8fac-7bf405c572c4/b99f3ad2-4108-4e72-9a5b-685d1de56520
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth?response_type=code&scope=openid+kvk&client_id=testid&redirect_uri=http%3A%2F%2Ftestserver%2Feherkenning-oidc%2Fcallback%2F&state=not-a-random-string&nonce=not-a-random-string
+ response:
+ body:
+ string: ''
+ headers:
+ Cache-Control:
+ - no-store, must-revalidate, max-age=0
+ Location:
+ - http://testserver/eherkenning-oidc/callback/?state=not-a-random-string&session_state=b99f3ad2-4108-4e72-9a5b-685d1de56520&iss=http%3A%2F%2Flocalhost%3A8080%2Frealms%2Ftest&code=d6b3b964-fac5-4e8e-bd1c-8ad517c6444b.b99f3ad2-4108-4e72-9a5b-685d1de56520.adf4ad83-4550-4619-9231-73bd8d700f45
+ Referrer-Policy:
+ - no-referrer
+ Set-Cookie:
+ - KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJjaWQiOiJ0ZXN0aWQiLCJwdHkiOiJvcGVuaWQtY29ubmVjdCIsInJ1cmkiOiJodHRwOi8vdGVzdHNlcnZlci9laGVya2VubmluZy1vaWRjL2NhbGxiYWNrLyIsImFjdCI6IkFVVEhFTlRJQ0FURSIsIm5vdGVzIjp7InNjb3BlIjoib3BlbmlkIGt2ayIsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9yZWFsbXMvdGVzdCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwicmVkaXJlY3RfdXJpIjoiaHR0cDovL3Rlc3RzZXJ2ZXIvZWhlcmtlbm5pbmctb2lkYy9jYWxsYmFjay8iLCJzdGF0ZSI6Im5vdC1hLXJhbmRvbS1zdHJpbmciLCJub25jZSI6Im5vdC1hLXJhbmRvbS1zdHJpbmcifX0.SpI7JvuDjU8Dn4CR3RD56sJAxNizNRciRym82v57Ylo;
+ Version=1; Path=/realms/test/; HttpOnly
+ - KEYCLOAK_LOCALE=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test/; HttpOnly
+ - KC_RESTART=; Version=1; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0;
+ Path=/realms/test/; HttpOnly
+ - KC_AUTH_STATE=; Version=1; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0;
+ Path=/realms/test/
+ - KEYCLOAK_IDENTITY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTY0OTY4MDMsImlhdCI6MTcxNjQ2MDgwMywianRpIjoiZTkxYmRkN2UtZTUwNi00NjViLWFhZjQtMDIyZTY0MzM0NjFjIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiYWExMGNmYzctMmM0ZC00MWY2LThmYWMtN2JmNDA1YzU3MmM0IiwidHlwIjoiU2VyaWFsaXplZC1JRCIsInNlc3Npb25fc3RhdGUiOiJiOTlmM2FkMi00MTA4LTRlNzItOWE1Yi02ODVkMWRlNTY1MjAiLCJzaWQiOiJiOTlmM2FkMi00MTA4LTRlNzItOWE1Yi02ODVkMWRlNTY1MjAiLCJzdGF0ZV9jaGVja2VyIjoiZ2xlbnBIa3NBU0pxOUh3Z2tPTE1zUFVpLWxqcjNsbFBDYUpEdWRTTUx5SSJ9.YyIoob_v_bdeEpwl7BNB74nD6aRrkI1bol_Sa0Wktvg;
+ Version=1; Path=/realms/test/; SameSite=None; Secure; HttpOnly
+ - KEYCLOAK_IDENTITY_LEGACY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTY0OTY4MDMsImlhdCI6MTcxNjQ2MDgwMywianRpIjoiZTkxYmRkN2UtZTUwNi00NjViLWFhZjQtMDIyZTY0MzM0NjFjIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiYWExMGNmYzctMmM0ZC00MWY2LThmYWMtN2JmNDA1YzU3MmM0IiwidHlwIjoiU2VyaWFsaXplZC1JRCIsInNlc3Npb25fc3RhdGUiOiJiOTlmM2FkMi00MTA4LTRlNzItOWE1Yi02ODVkMWRlNTY1MjAiLCJzaWQiOiJiOTlmM2FkMi00MTA4LTRlNzItOWE1Yi02ODVkMWRlNTY1MjAiLCJzdGF0ZV9jaGVja2VyIjoiZ2xlbnBIa3NBU0pxOUh3Z2tPTE1zUFVpLWxqcjNsbFBDYUpEdWRTTUx5SSJ9.YyIoob_v_bdeEpwl7BNB74nD6aRrkI1bol_Sa0Wktvg;
+ Version=1; Path=/realms/test/; HttpOnly
+ - KEYCLOAK_SESSION=test/aa10cfc7-2c4d-41f6-8fac-7bf405c572c4/b99f3ad2-4108-4e72-9a5b-685d1de56520;
+ Version=1; Expires=Thu, 23-May-2024 20:40:03 GMT; Max-Age=36000; Path=/realms/test/;
+ SameSite=None; Secure
+ - KEYCLOAK_SESSION_LEGACY=test/aa10cfc7-2c4d-41f6-8fac-7bf405c572c4/b99f3ad2-4108-4e72-9a5b-685d1de56520;
+ Version=1; Expires=Thu, 23-May-2024 20:40:03 GMT; Max-Age=36000; Path=/realms/test/
+ - KEYCLOAK_REMEMBER_ME=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test/; HttpOnly
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '0'
+ status:
+ code: 302
+ message: Found
+- request:
+ body: client_id=testid&client_secret=7DB3KUAAizYCcmZufpHRVOcD0TOkNO3I&grant_type=authorization_code&code=d6b3b964-fac5-4e8e-bd1c-8ad517c6444b.b99f3ad2-4108-4e72-9a5b-685d1de56520.adf4ad83-4550-4619-9231-73bd8d700f45&redirect_uri=http%3A%2F%2Ftestserver%2Feherkenning-oidc%2Fcallback%2F
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '279'
+ Content-Type:
+ - application/x-www-form-urlencoded
+ User-Agent:
+ - python-requests/2.31.0
+ method: POST
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/token
+ response:
+ body:
+ string: '{"access_token":"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTY0NjExMDMsImlhdCI6MTcxNjQ2MDgwMywiYXV0aF90aW1lIjoxNzE2NDYwODAzLCJqdGkiOiI3OGYwNWZjMC1mNDQ0LTQ2M2MtYTVjMi01MWQ2ZmFiMDU2ZDgiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiYWExMGNmYzctMmM0ZC00MWY2LThmYWMtN2JmNDA1YzU3MmM0IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoidGVzdGlkIiwibm9uY2UiOiJub3QtYS1yYW5kb20tc3RyaW5nIiwic2Vzc2lvbl9zdGF0ZSI6ImI5OWYzYWQyLTQxMDgtNGU3Mi05YTViLTY4NWQxZGU1NjUyMCIsImFjciI6IjAiLCJhbGxvd2VkLW9yaWdpbnMiOlsiaHR0cDovLzEyNy4wLjAuMTo4MDAwIl0sInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJkZWZhdWx0LXJvbGVzLXRlc3QiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgZW1haWwgcHJvZmlsZSBrdmsgYnNuIiwic2lkIjoiYjk5ZjNhZDItNDEwOC00ZTcyLTlhNWItNjg1ZDFkZTU2NTIwIiwia3ZrIjoiMDEyMzQ1Njc4IiwiZW1haWxfdmVyaWZpZWQiOmZhbHNlLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJ0ZXN0dXNlciIsImJzbiI6IjAwMDAwMDAwMCJ9.i6A-hbQxOC4ZaoeInW6gA5IJntGxcaW632cCpYQfnyfhbpyIRmrfQ4s175o50pUEzZQLItczX4Uy4P1TsROhJSSBLdILomJV6mcoY27pQEEb6ylDxypqwoG03bCte5B7iCitg_v7nsJVDMTv6yXKEzSJJIW6XX_cWn_WzaKPJo8O8-3CW5tUYqrGJgAyKj2gj2bXH-nypGGsB-vxo7DKubfI9VAplxpBoy07b1O-As6VscqF_nUy_FMAifx_Ppwn6WjkeYwa0NBboZEGnrB4VnD2GFb3zaAHWVr5nM_VIhCvEaDVuJThZJN5Xk96WRd0W-QdWyxXObDPudWgQMRWRA","expires_in":300,"refresh_expires_in":1800,"refresh_token":"eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTY0NjI2MDMsImlhdCI6MTcxNjQ2MDgwMywianRpIjoiMTA4N2RmYTItYjBjYS00ZjA2LTgzNmEtNWQ1Y2ZjNTU4ZWZmIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0IiwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiYWExMGNmYzctMmM0ZC00MWY2LThmYWMtN2JmNDA1YzU3MmM0IiwidHlwIjoiUmVmcmVzaCIsImF6cCI6InRlc3RpZCIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsInNlc3Npb25fc3RhdGUiOiJiOTlmM2FkMi00MTA4LTRlNzItOWE1Yi02ODVkMWRlNTY1MjAiLCJzY29wZSI6Im9wZW5pZCBlbWFpbCBwcm9maWxlIGt2ayBic24iLCJzaWQiOiJiOTlmM2FkMi00MTA4LTRlNzItOWE1Yi02ODVkMWRlNTY1MjAifQ.opB6N6okncOEcMwRKbR20mQc-u-iUsqkkQfOfFFhAhA","token_type":"Bearer","id_token":"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTY0NjExMDMsImlhdCI6MTcxNjQ2MDgwMywiYXV0aF90aW1lIjoxNzE2NDYwODAzLCJqdGkiOiI4MjgzMjk2OC05NmZjLTQ1ZWItOGYzOS1iZGM3YmQ0ZDM4MDciLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJ0ZXN0aWQiLCJzdWIiOiJhYTEwY2ZjNy0yYzRkLTQxZjYtOGZhYy03YmY0MDVjNTcyYzQiLCJ0eXAiOiJJRCIsImF6cCI6InRlc3RpZCIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsInNlc3Npb25fc3RhdGUiOiJiOTlmM2FkMi00MTA4LTRlNzItOWE1Yi02ODVkMWRlNTY1MjAiLCJhdF9oYXNoIjoiczQteVhnWEtzc1gxSEp1dnRGMW9tZyIsImFjciI6IjAiLCJzaWQiOiJiOTlmM2FkMi00MTA4LTRlNzItOWE1Yi02ODVkMWRlNTY1MjAiLCJrdmsiOiIwMTIzNDU2NzgiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsInByZWZlcnJlZF91c2VybmFtZSI6InRlc3R1c2VyIiwiYnNuIjoiMDAwMDAwMDAwIn0.yUDqG7BxSJPlr6Y6gVfd_x2gvAnmO9qN3k1z-HrPnNypN41UEpVux8pJW43F3sQWcRRLB6YriNuXrgTuwvFshfkTmeaMiy8ssylrp-DyUmmUXc_yyN0Avaj5xCLt1GRf-f75Fh9ft2B8eh-H3qf7A-eQ827EfBBF6vVLQZQW70QrxetQ6afE18E2NJ_MFNvV_MQgyxiXFdwJBXoUAHuY6HRgruOmU0egklXqDUUEARjrEc7XnuyqNiD6bfOJSuyUF1Z0HtvyAFckvorhzkAZiqFoBUCDMBuC-TBRneyeWiMBsmW_RFSTqTPVnZ6HG7ADhm6GdaMCzBH3Et2ab1sY5Q","not-before-policy":0,"session_state":"b99f3ad2-4108-4e72-9a5b-685d1de56520","scope":"openid
+ email profile kvk bsn"}'
+ headers:
+ Cache-Control:
+ - no-store
+ Content-Type:
+ - application/json
+ Pragma:
+ - no-cache
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '3475'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/certs
+ response:
+ body:
+ string: '{"keys":[{"kid":"4UNQAcvUcv-DFUOx_4O1gt13OdJSotqEKPZurs2vQW8","kty":"RSA","alg":"RS256","use":"sig","n":"2DOZ0qHie73SuFVR7civrl6r82YUiAghfzaMowjCg0o06AF--2lIS7vNV_PbsVVznPAAMqVrNG-8CcevEzvVZMQD9nH4DI7xlOxK0lrYu8rmMeSfOvXVbBVsWBZe0jnGNukZqjwmRE5__ttJdxPfIBT5-2L6mguQbDfhSUEEdIW7y7UfOXvqLqEcBtoIEB-ORKDTUIQwGZM5mSCy-cY3cHvvZfZVgaUUy5NvujPRXTMje4n_hG0KfEV-40G9qC2_Xvx4EooJzBZ6FSThiWhCpwhIvzcQqB6M9lHW7nU6wADhYPNCa2OKWvphwZ_zbrF4B9dmS6Zli5rBvbox9Hh45w","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMLTANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANgzmdKh4nu90rhVUe3Ir65eq/NmFIgIIX82jKMIwoNKNOgBfvtpSEu7zVfz27FVc5zwADKlazRvvAnHrxM71WTEA/Zx+AyO8ZTsStJa2LvK5jHknzr11WwVbFgWXtI5xjbpGao8JkROf/7bSXcT3yAU+fti+poLkGw34UlBBHSFu8u1Hzl76i6hHAbaCBAfjkSg01CEMBmTOZkgsvnGN3B772X2VYGlFMuTb7oz0V0zI3uJ/4RtCnxFfuNBvagtv178eBKKCcwWehUk4YloQqcISL83EKgejPZR1u51OsAA4WDzQmtjilr6YcGf826xeAfXZkumZYuawb26MfR4eOcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAsnQG/Yi2g1XTCJn74hWv9MjxVAaZb4gBAc2AWm5VgAjhFEM9h6x6m1mQkq7JM4rIdAj8jw55Ok9CBVBIqq4G4cME3eUvVytkj2lC9zcRoAivjjZF2HPg7zNPa2TTR50asmHPRokppV6gewO/C+o5as+4P2zqDXBh61aRd/9kdQfkg14LBbH5/dYccAuvUqlTYC4IEPCvVmBNC1xsMjf0vohvoSjm9vL2bfqG/RJH0ScdCjOd5d2zju4/e2oVdluWm+vzKBQplc7tVMuKpn6LcLmVHiGNAl+EBIZH+WVLlTx0D1+kbHZsfLYG53lQg2LsvurRbWyF/a5fVM/oLTn5ag=="],"x5t":"H5xfs1pRtvX0HyVTskx7eTXx88U","x5t#S256":"XurVtKAIEyc4w9HCGOhnjoRHnYu4d9HCn_5YHmkScJg"},{"kid":"TV3Tl5jIY1nrJLSb53UKEubLR5gYiq9slq1SsDDg1HU","kty":"RSA","alg":"RSA-OAEP","use":"enc","n":"pNvU3ecpVHbJT4bCOEpw6cnV1yi65tB3I0bRF2ilLVOY944QRAGnjBBECPIzNbgqavghYp1j75F2nq6_ny1CYfoaxTV2iDpRUw8_f7sliYbl8FrLLat0S25ItlZrg5TEJHObvOqlG2_nXoeH36MRWwNhms2uCqfhn5VgtenIzpQIBolnM7zzGp21NvdJ1C_ZAUzkXC-l3oQ-BXTtpEVM4h2KpYh4gfZJWCbYij5d1e1YApKD6V61_Cs3Oa2OY7CAUyq5kgAWJZFDB6CpzIr226u3bV7F9RbrQu3Ybc_Lv33EwykscLznKWZY2Mbs3Iz_rFNv3sVX_vHpH4DHWlKu7Q","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMlzANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKTb1N3nKVR2yU+GwjhKcOnJ1dcouubQdyNG0RdopS1TmPeOEEQBp4wQRAjyMzW4Kmr4IWKdY++Rdp6uv58tQmH6GsU1dog6UVMPP3+7JYmG5fBayy2rdEtuSLZWa4OUxCRzm7zqpRtv516Hh9+jEVsDYZrNrgqn4Z+VYLXpyM6UCAaJZzO88xqdtTb3SdQv2QFM5Fwvpd6EPgV07aRFTOIdiqWIeIH2SVgm2Io+XdXtWAKSg+letfwrNzmtjmOwgFMquZIAFiWRQwegqcyK9turt21exfUW60Lt2G3Py799xMMpLHC85ylmWNjG7NyM/6xTb97FV/7x6R+Ax1pSru0CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAQGJHeTYSMvp0yndbIn7DLohO9lom5nRrx/bLyb7TiRfogyJEF6rQZ66CAkQFk5eMF878fsHTuMVjtmXVBnhojhVmK91HwjsNQu/8xR6QMXNKJQMvHR245vwUGxlWRw/36ObM1D7QjCd/q+FonpBEY4m5Y6Uz1U0HR2Cbh0E2afVlPLeV+F0LKrlyVMdIaWBGWftCGIKDAHaG/PD66zbAKtxerv2fBIDq100WHPhd57BZxX+2aGJp1IaRDgkxV0E/CjEy3+Knd8xbAgUSW0Tl6OTC75exIvlbzeluEBe0wlapAb7WvBKYsipSW8G8Ey7tjoolDT4AU82EaKUPstiMnA=="],"x5t":"AlfHDI0FOPQpt3RBAILt0dtW1yw","x5t#S256":"a7bhm8-JsnfY7bL_m8Yl72hgmp5516VZlFcVloKzk08"}]}'
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/json;charset=UTF-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '2909'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Authorization:
+ - Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTY0NjExMDMsImlhdCI6MTcxNjQ2MDgwMywiYXV0aF90aW1lIjoxNzE2NDYwODAzLCJqdGkiOiI3OGYwNWZjMC1mNDQ0LTQ2M2MtYTVjMi01MWQ2ZmFiMDU2ZDgiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiYWExMGNmYzctMmM0ZC00MWY2LThmYWMtN2JmNDA1YzU3MmM0IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoidGVzdGlkIiwibm9uY2UiOiJub3QtYS1yYW5kb20tc3RyaW5nIiwic2Vzc2lvbl9zdGF0ZSI6ImI5OWYzYWQyLTQxMDgtNGU3Mi05YTViLTY4NWQxZGU1NjUyMCIsImFjciI6IjAiLCJhbGxvd2VkLW9yaWdpbnMiOlsiaHR0cDovLzEyNy4wLjAuMTo4MDAwIl0sInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJkZWZhdWx0LXJvbGVzLXRlc3QiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgZW1haWwgcHJvZmlsZSBrdmsgYnNuIiwic2lkIjoiYjk5ZjNhZDItNDEwOC00ZTcyLTlhNWItNjg1ZDFkZTU2NTIwIiwia3ZrIjoiMDEyMzQ1Njc4IiwiZW1haWxfdmVyaWZpZWQiOmZhbHNlLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJ0ZXN0dXNlciIsImJzbiI6IjAwMDAwMDAwMCJ9.i6A-hbQxOC4ZaoeInW6gA5IJntGxcaW632cCpYQfnyfhbpyIRmrfQ4s175o50pUEzZQLItczX4Uy4P1TsROhJSSBLdILomJV6mcoY27pQEEb6ylDxypqwoG03bCte5B7iCitg_v7nsJVDMTv6yXKEzSJJIW6XX_cWn_WzaKPJo8O8-3CW5tUYqrGJgAyKj2gj2bXH-nypGGsB-vxo7DKubfI9VAplxpBoy07b1O-As6VscqF_nUy_FMAifx_Ppwn6WjkeYwa0NBboZEGnrB4VnD2GFb3zaAHWVr5nM_VIhCvEaDVuJThZJN5Xk96WRd0W-QdWyxXObDPudWgQMRWRA
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/userinfo
+ response:
+ body:
+ string: eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJzdWIiOiJhYTEwY2ZjNy0yYzRkLTQxZjYtOGZhYy03YmY0MDVjNTcyYzQiLCJrdmsiOiIwMTIzNDU2NzgiLCJhdWQiOiJ0ZXN0aWQiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9yZWFsbXMvdGVzdCIsInByZWZlcnJlZF91c2VybmFtZSI6InRlc3R1c2VyIiwiYnNuIjoiMDAwMDAwMDAwIn0.CKub7h5He-7acsX5pli41jZiatfM3eM-f5bl6M9GaSSVJLy-NHH5RDSIvpNu4K3PA5uO1nn2sfiDWvfBgsqPxvssiqcmkenf1RpgaEdn7fS_bRn1ziAkYFq5tVEICluPeYELR8FNt7XGVGPakhezPnUwsdaUOBWf7ELTgbxVdBBy3Nkjg2op456glHO4C84zjABNK5grWfLCDDEwKnw4o1gz-QWAS1TPa7yQaPOJr71zjFT-o3P7EBBkASN_CiELOpno3bBxIeTa631m9BHZ8dECiffp_GQhxMqPS9bTwqTlffc-EkIamZr_90uHs3Dw8gVySYL7YTGoGDeq6w6jEw
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/jwt
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '714'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/certs
+ response:
+ body:
+ string: '{"keys":[{"kid":"4UNQAcvUcv-DFUOx_4O1gt13OdJSotqEKPZurs2vQW8","kty":"RSA","alg":"RS256","use":"sig","n":"2DOZ0qHie73SuFVR7civrl6r82YUiAghfzaMowjCg0o06AF--2lIS7vNV_PbsVVznPAAMqVrNG-8CcevEzvVZMQD9nH4DI7xlOxK0lrYu8rmMeSfOvXVbBVsWBZe0jnGNukZqjwmRE5__ttJdxPfIBT5-2L6mguQbDfhSUEEdIW7y7UfOXvqLqEcBtoIEB-ORKDTUIQwGZM5mSCy-cY3cHvvZfZVgaUUy5NvujPRXTMje4n_hG0KfEV-40G9qC2_Xvx4EooJzBZ6FSThiWhCpwhIvzcQqB6M9lHW7nU6wADhYPNCa2OKWvphwZ_zbrF4B9dmS6Zli5rBvbox9Hh45w","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMLTANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANgzmdKh4nu90rhVUe3Ir65eq/NmFIgIIX82jKMIwoNKNOgBfvtpSEu7zVfz27FVc5zwADKlazRvvAnHrxM71WTEA/Zx+AyO8ZTsStJa2LvK5jHknzr11WwVbFgWXtI5xjbpGao8JkROf/7bSXcT3yAU+fti+poLkGw34UlBBHSFu8u1Hzl76i6hHAbaCBAfjkSg01CEMBmTOZkgsvnGN3B772X2VYGlFMuTb7oz0V0zI3uJ/4RtCnxFfuNBvagtv178eBKKCcwWehUk4YloQqcISL83EKgejPZR1u51OsAA4WDzQmtjilr6YcGf826xeAfXZkumZYuawb26MfR4eOcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAsnQG/Yi2g1XTCJn74hWv9MjxVAaZb4gBAc2AWm5VgAjhFEM9h6x6m1mQkq7JM4rIdAj8jw55Ok9CBVBIqq4G4cME3eUvVytkj2lC9zcRoAivjjZF2HPg7zNPa2TTR50asmHPRokppV6gewO/C+o5as+4P2zqDXBh61aRd/9kdQfkg14LBbH5/dYccAuvUqlTYC4IEPCvVmBNC1xsMjf0vohvoSjm9vL2bfqG/RJH0ScdCjOd5d2zju4/e2oVdluWm+vzKBQplc7tVMuKpn6LcLmVHiGNAl+EBIZH+WVLlTx0D1+kbHZsfLYG53lQg2LsvurRbWyF/a5fVM/oLTn5ag=="],"x5t":"H5xfs1pRtvX0HyVTskx7eTXx88U","x5t#S256":"XurVtKAIEyc4w9HCGOhnjoRHnYu4d9HCn_5YHmkScJg"},{"kid":"TV3Tl5jIY1nrJLSb53UKEubLR5gYiq9slq1SsDDg1HU","kty":"RSA","alg":"RSA-OAEP","use":"enc","n":"pNvU3ecpVHbJT4bCOEpw6cnV1yi65tB3I0bRF2ilLVOY944QRAGnjBBECPIzNbgqavghYp1j75F2nq6_ny1CYfoaxTV2iDpRUw8_f7sliYbl8FrLLat0S25ItlZrg5TEJHObvOqlG2_nXoeH36MRWwNhms2uCqfhn5VgtenIzpQIBolnM7zzGp21NvdJ1C_ZAUzkXC-l3oQ-BXTtpEVM4h2KpYh4gfZJWCbYij5d1e1YApKD6V61_Cs3Oa2OY7CAUyq5kgAWJZFDB6CpzIr226u3bV7F9RbrQu3Ybc_Lv33EwykscLznKWZY2Mbs3Iz_rFNv3sVX_vHpH4DHWlKu7Q","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMlzANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKTb1N3nKVR2yU+GwjhKcOnJ1dcouubQdyNG0RdopS1TmPeOEEQBp4wQRAjyMzW4Kmr4IWKdY++Rdp6uv58tQmH6GsU1dog6UVMPP3+7JYmG5fBayy2rdEtuSLZWa4OUxCRzm7zqpRtv516Hh9+jEVsDYZrNrgqn4Z+VYLXpyM6UCAaJZzO88xqdtTb3SdQv2QFM5Fwvpd6EPgV07aRFTOIdiqWIeIH2SVgm2Io+XdXtWAKSg+letfwrNzmtjmOwgFMquZIAFiWRQwegqcyK9turt21exfUW60Lt2G3Py799xMMpLHC85ylmWNjG7NyM/6xTb97FV/7x6R+Ax1pSru0CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAQGJHeTYSMvp0yndbIn7DLohO9lom5nRrx/bLyb7TiRfogyJEF6rQZ66CAkQFk5eMF878fsHTuMVjtmXVBnhojhVmK91HwjsNQu/8xR6QMXNKJQMvHR245vwUGxlWRw/36ObM1D7QjCd/q+FonpBEY4m5Y6Uz1U0HR2Cbh0E2afVlPLeV+F0LKrlyVMdIaWBGWftCGIKDAHaG/PD66zbAKtxerv2fBIDq100WHPhd57BZxX+2aGJp1IaRDgkxV0E/CjEy3+Knd8xbAgUSW0Tl6OTC75exIvlbzeluEBe0wlapAb7WvBKYsipSW8G8Ey7tjoolDT4AU82EaKUPstiMnA=="],"x5t":"AlfHDI0FOPQpt3RBAILt0dtW1yw","x5t#S256":"a7bhm8-JsnfY7bL_m8Yl72hgmp5516VZlFcVloKzk08"}]}'
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/json;charset=UTF-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '2909'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: id_token_hint=eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTY0NjExMDMsImlhdCI6MTcxNjQ2MDgwMywiYXV0aF90aW1lIjoxNzE2NDYwODAzLCJqdGkiOiI4MjgzMjk2OC05NmZjLTQ1ZWItOGYzOS1iZGM3YmQ0ZDM4MDciLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJ0ZXN0aWQiLCJzdWIiOiJhYTEwY2ZjNy0yYzRkLTQxZjYtOGZhYy03YmY0MDVjNTcyYzQiLCJ0eXAiOiJJRCIsImF6cCI6InRlc3RpZCIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsInNlc3Npb25fc3RhdGUiOiJiOTlmM2FkMi00MTA4LTRlNzItOWE1Yi02ODVkMWRlNTY1MjAiLCJhdF9oYXNoIjoiczQteVhnWEtzc1gxSEp1dnRGMW9tZyIsImFjciI6IjAiLCJzaWQiOiJiOTlmM2FkMi00MTA4LTRlNzItOWE1Yi02ODVkMWRlNTY1MjAiLCJrdmsiOiIwMTIzNDU2NzgiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsInByZWZlcnJlZF91c2VybmFtZSI6InRlc3R1c2VyIiwiYnNuIjoiMDAwMDAwMDAwIn0.yUDqG7BxSJPlr6Y6gVfd_x2gvAnmO9qN3k1z-HrPnNypN41UEpVux8pJW43F3sQWcRRLB6YriNuXrgTuwvFshfkTmeaMiy8ssylrp-DyUmmUXc_yyN0Avaj5xCLt1GRf-f75Fh9ft2B8eh-H3qf7A-eQ827EfBBF6vVLQZQW70QrxetQ6afE18E2NJ_MFNvV_MQgyxiXFdwJBXoUAHuY6HRgruOmU0egklXqDUUEARjrEc7XnuyqNiD6bfOJSuyUF1Z0HtvyAFckvorhzkAZiqFoBUCDMBuC-TBRneyeWiMBsmW_RFSTqTPVnZ6HG7ADhm6GdaMCzBH3Et2ab1sY5Q
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '1132'
+ Content-Type:
+ - application/x-www-form-urlencoded
+ User-Agent:
+ - python-requests/2.31.0
+ method: POST
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/logout
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n\n\n\n\n
+ \ \n
\n
+ \ \n
\n
+ \
\n\n\n
\n
+ \
You are logged out
\n
\n\n\n\n
+ \
\n
\n\n
\n
\n\n\n"
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Set-Cookie:
+ - AUTH_SESSION_ID=3002fd48-03dc-458e-80f4-3dcd5a426be5; Version=1; Path=/realms/test/;
+ SameSite=None; Secure; HttpOnly
+ - AUTH_SESSION_ID_LEGACY=3002fd48-03dc-458e-80f4-3dcd5a426be5; Version=1; Path=/realms/test/;
+ HttpOnly
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '1566'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n\n\n\n\n\n\n"
+ headers:
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '1573'
+ status:
+ code: 400
+ message: Bad Request
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ Cookie:
+ - AUTH_SESSION_ID_LEGACY=b99f3ad2-4108-4e72-9a5b-685d1de56520; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJjaWQiOiJ0ZXN0aWQiLCJwdHkiOiJvcGVuaWQtY29ubmVjdCIsInJ1cmkiOiJodHRwOi8vdGVzdHNlcnZlci9laGVya2VubmluZy1vaWRjL2NhbGxiYWNrLyIsImFjdCI6IkFVVEhFTlRJQ0FURSIsIm5vdGVzIjp7InNjb3BlIjoib3BlbmlkIGt2ayIsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9yZWFsbXMvdGVzdCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwicmVkaXJlY3RfdXJpIjoiaHR0cDovL3Rlc3RzZXJ2ZXIvZWhlcmtlbm5pbmctb2lkYy9jYWxsYmFjay8iLCJzdGF0ZSI6Im5vdC1hLXJhbmRvbS1zdHJpbmciLCJub25jZSI6Im5vdC1hLXJhbmRvbS1zdHJpbmcifX0.SpI7JvuDjU8Dn4CR3RD56sJAxNizNRciRym82v57Ylo;
+ KEYCLOAK_IDENTITY_LEGACY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTY0OTY4MDMsImlhdCI6MTcxNjQ2MDgwMywianRpIjoiZTkxYmRkN2UtZTUwNi00NjViLWFhZjQtMDIyZTY0MzM0NjFjIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiYWExMGNmYzctMmM0ZC00MWY2LThmYWMtN2JmNDA1YzU3MmM0IiwidHlwIjoiU2VyaWFsaXplZC1JRCIsInNlc3Npb25fc3RhdGUiOiJiOTlmM2FkMi00MTA4LTRlNzItOWE1Yi02ODVkMWRlNTY1MjAiLCJzaWQiOiJiOTlmM2FkMi00MTA4LTRlNzItOWE1Yi02ODVkMWRlNTY1MjAiLCJzdGF0ZV9jaGVja2VyIjoiZ2xlbnBIa3NBU0pxOUh3Z2tPTE1zUFVpLWxqcjNsbFBDYUpEdWRTTUx5SSJ9.YyIoob_v_bdeEpwl7BNB74nD6aRrkI1bol_Sa0Wktvg;
+ KEYCLOAK_SESSION_LEGACY=test/aa10cfc7-2c4d-41f6-8fac-7bf405c572c4/b99f3ad2-4108-4e72-9a5b-685d1de56520
+ User-Agent:
+ - python-requests/2.31.0
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth?response_type=code&scope=openid+kvk&client_id=testid&redirect_uri=http%3A%2F%2Ftestserver%2Feherkenning-oidc%2Fcallback%2F&state=not-a-random-string&nonce=not-a-random-string
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n \n\n\n\n\n
+ \ \n
\n
+ \ \n
\n
+ \
\n\n\n
\n \n\n\n\n\n\n
+ \
\n
\n\n
\n
\n\n\n"
+ headers:
+ Cache-Control:
+ - no-store, must-revalidate, max-age=0
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Set-Cookie:
+ - KEYCLOAK_IDENTITY=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test/; HttpOnly
+ - KEYCLOAK_IDENTITY_LEGACY=; Version=1; Comment=Expiring cookie; Expires=Thu,
+ 01-Jan-1970 00:00:10 GMT; Max-Age=0; Path=/realms/test/; HttpOnly
+ - KEYCLOAK_SESSION=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test/
+ - KEYCLOAK_SESSION_LEGACY=; Version=1; Comment=Expiring cookie; Expires=Thu,
+ 01-Jan-1970 00:00:10 GMT; Max-Age=0; Path=/realms/test/
+ - KEYCLOAK_IDENTITY=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test; HttpOnly
+ - KEYCLOAK_IDENTITY_LEGACY=; Version=1; Comment=Expiring cookie; Expires=Thu,
+ 01-Jan-1970 00:00:10 GMT; Max-Age=0; Path=/realms/test; HttpOnly
+ - KEYCLOAK_SESSION=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test
+ - KEYCLOAK_SESSION_LEGACY=; Version=1; Comment=Expiring cookie; Expires=Thu,
+ 01-Jan-1970 00:00:10 GMT; Max-Age=0; Path=/realms/test
+ - AUTH_SESSION_ID=a7dcc4f9-0f70-48bd-8532-6d784d084d9b; Version=1; Path=/realms/test/;
+ SameSite=None; Secure; HttpOnly
+ - AUTH_SESSION_ID_LEGACY=a7dcc4f9-0f70-48bd-8532-6d784d084d9b; Version=1; Path=/realms/test/;
+ HttpOnly
+ - KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJjaWQiOiJ0ZXN0aWQiLCJwdHkiOiJvcGVuaWQtY29ubmVjdCIsInJ1cmkiOiJodHRwOi8vdGVzdHNlcnZlci9laGVya2VubmluZy1vaWRjL2NhbGxiYWNrLyIsImFjdCI6IkFVVEhFTlRJQ0FURSIsIm5vdGVzIjp7InNjb3BlIjoib3BlbmlkIGt2ayIsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9yZWFsbXMvdGVzdCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwicmVkaXJlY3RfdXJpIjoiaHR0cDovL3Rlc3RzZXJ2ZXIvZWhlcmtlbm5pbmctb2lkYy9jYWxsYmFjay8iLCJzdGF0ZSI6Im5vdC1hLXJhbmRvbS1zdHJpbmciLCJub25jZSI6Im5vdC1hLXJhbmRvbS1zdHJpbmcifX0.SpI7JvuDjU8Dn4CR3RD56sJAxNizNRciRym82v57Ylo;
+ Version=1; Path=/realms/test/; HttpOnly
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '4466'
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/digid/test_admin.py b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/digid/test_admin.py
deleted file mode 100644
index 6355a8c1d7..0000000000
--- a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/digid/test_admin.py
+++ /dev/null
@@ -1,80 +0,0 @@
-import json
-
-from django.test import override_settings
-from django.urls import reverse
-
-from django_webtest import WebTest
-from maykin_2fa.test import disable_admin_mfa
-
-from digid_eherkenning_oidc_generics.models import OpenIDConnectPublicConfig
-from openforms.accounts.tests.factories import SuperUserFactory
-from openforms.forms.tests.factories import FormFactory
-
-default_config = dict(
- enabled=True,
- oidc_rp_client_id="testclient",
- oidc_rp_client_secret="secret",
- oidc_rp_sign_algo="RS256",
- oidc_rp_scopes_list=["openid", "bsn"],
- oidc_op_jwks_endpoint="http://provider.com/auth/realms/master/protocol/openid-connect/certs",
- oidc_op_authorization_endpoint="http://provider.com/auth/realms/master/protocol/openid-connect/auth",
- oidc_op_token_endpoint="http://provider.com/auth/realms/master/protocol/openid-connect/token",
- oidc_op_user_endpoint="http://provider.com/auth/realms/master/protocol/openid-connect/userinfo",
- oidc_op_logout_endpoint="http://provider.com/auth/realms/master/protocol/openid-connect/logout",
-)
-
-
-@disable_admin_mfa()
-@override_settings(CORS_ALLOW_ALL_ORIGINS=True, IS_HTTPS=True)
-class DigiDOIDCFormAdminTests(WebTest):
- def setUp(self):
- super().setUp()
-
- self.user = SuperUserFactory.create()
- self.app.set_user(self.user)
-
- def test_digid_oidc_disable_allowed(self):
- # Patching `get_solo()` doesn't seem to work when retrieving the change_form
- config = OpenIDConnectPublicConfig(**default_config)
- config.save()
-
- FormFactory.create(authentication_backends=["eherkenning_oidc"])
-
- response = self.app.get(
- reverse(
- "admin:digid_eherkenning_oidc_generics_openidconnectpublicconfig_change"
- )
- )
-
- form = response.forms["openidconnectpublicconfig_form"]
- form["enabled"] = False
- # set the value manually, normally this is done through JS
- form["oidc_rp_scopes_list"] = json.dumps(config.oidc_rp_scopes_list)
- form["oidc_exempt_urls"] = json.dumps(config.oidc_exempt_urls)
- response = form.submit()
-
- self.assertEqual(response.status_code, 302)
- self.assertFalse(OpenIDConnectPublicConfig.get_solo().enabled)
-
- def test_digid_oidc_disable_not_allowed(self):
- # Patching `get_solo()` doesn't seem to work when retrieving the change_form
- config = OpenIDConnectPublicConfig(**default_config)
- config.save()
-
- FormFactory.create(authentication_backends=["digid_oidc"])
-
- response = self.app.get(
- reverse(
- "admin:digid_eherkenning_oidc_generics_openidconnectpublicconfig_change"
- )
- )
-
- form = response.forms["openidconnectpublicconfig_form"]
- form["enabled"] = False
- # set the value manually, normally this is done through JS
- form["oidc_rp_scopes_list"] = json.dumps(config.oidc_rp_scopes_list)
- form["oidc_exempt_urls"] = json.dumps(config.oidc_exempt_urls)
- response = form.submit()
-
- self.assertEqual(response.status_code, 200)
- self.assertTrue(OpenIDConnectPublicConfig.get_solo().enabled)
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/digid/test_auth_plugin_endpoint.py b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/digid/test_auth_plugin_endpoint.py
deleted file mode 100644
index ca1b829846..0000000000
--- a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/digid/test_auth_plugin_endpoint.py
+++ /dev/null
@@ -1,58 +0,0 @@
-from unittest.mock import patch
-
-from django.urls import reverse
-
-from rest_framework import status
-from rest_framework.test import APITestCase
-
-from openforms.accounts.tests.factories import UserFactory
-from openforms.config.models import GlobalConfiguration
-
-
-class DigiDOIDCAuthPluginEndpointTests(APITestCase):
- @classmethod
- def setUpTestData(cls):
- super().setUpTestData()
-
- cls.user = UserFactory.create(is_staff=True)
-
- def setUp(self):
- super().setUp()
-
- self.client.force_authenticate(user=self.user)
-
- @patch("openforms.plugins.plugin.GlobalConfiguration.get_solo")
- def test_plugin_list_digid_oidc_enabled(self, mock_get_solo):
- mock_get_solo.return_value = GlobalConfiguration(
- plugin_configuration={
- "authentication": {
- "digid_oidc": {"enabled": True},
- },
- }
- )
-
- endpoint = reverse("api:authentication-plugin-list")
-
- response = self.client.get(endpoint)
- self.assertEqual(response.status_code, status.HTTP_200_OK)
-
- plugin_names = [p["id"] for p in response.data]
- self.assertIn("digid_oidc", plugin_names)
-
- @patch("openforms.plugins.plugin.GlobalConfiguration.get_solo")
- def test_plugin_list_digid_oidc_not_enabled(self, mock_get_solo):
- mock_get_solo.return_value = GlobalConfiguration(
- plugin_configuration={
- "authentication": {
- "digid_oidc": {"enabled": False},
- },
- }
- )
-
- endpoint = reverse("api:authentication-plugin-list")
-
- response = self.client.get(endpoint)
- self.assertEqual(response.status_code, status.HTTP_200_OK)
-
- plugin_names = [p["id"] for p in response.data]
- self.assertNotIn("digid_oidc", plugin_names)
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/digid/test_auth_procedure.py b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/digid/test_auth_procedure.py
deleted file mode 100644
index 0bc1593627..0000000000
--- a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/digid/test_auth_procedure.py
+++ /dev/null
@@ -1,253 +0,0 @@
-from unittest.mock import patch
-
-from django.test import TestCase, override_settings, tag
-from django.urls import reverse
-
-import requests_mock
-from furl import furl
-from rest_framework import status
-
-from digid_eherkenning_oidc_generics.models import OpenIDConnectPublicConfig
-from openforms.accounts.tests.factories import StaffUserFactory
-from openforms.authentication.tests.utils import get_start_form_url, get_start_url
-from openforms.authentication.views import BACKEND_OUTAGE_RESPONSE_PARAMETER
-from openforms.forms.tests.factories import FormFactory
-
-default_config = OpenIDConnectPublicConfig(
- enabled=True,
- oidc_rp_client_id="testclient",
- oidc_rp_client_secret="secret",
- oidc_rp_sign_algo="RS256",
- oidc_rp_scopes_list=["openid", "bsn"],
- oidc_op_jwks_endpoint="http://provider.com/auth/realms/master/protocol/openid-connect/certs",
- oidc_op_authorization_endpoint="http://provider.com/auth/realms/master/protocol/openid-connect/auth",
- oidc_op_token_endpoint="http://provider.com/auth/realms/master/protocol/openid-connect/token",
- oidc_op_user_endpoint="http://provider.com/auth/realms/master/protocol/openid-connect/userinfo",
-)
-
-
-@override_settings(CORS_ALLOW_ALL_ORIGINS=True, IS_HTTPS=True)
-class DigiDOIDCTests(TestCase):
- @classmethod
- def setUpTestData(cls):
- super().setUpTestData()
- cls.form = FormFactory.create(
- generate_minimal_setup=True,
- authentication_backends=["digid_oidc"],
- )
-
- def setUp(self):
- super().setUp()
-
- config_patcher = patch(
- "digid_eherkenning_oidc_generics.models.OpenIDConnectPublicConfig.get_solo",
- return_value=default_config,
- )
- self.mock_config = config_patcher.start()
- self.addCleanup(config_patcher.stop)
-
- self.requests_mocker = requests_mock.Mocker()
- self.addCleanup(self.requests_mocker.stop)
- self.requests_mocker.start()
-
- def test_redirect_to_digid_oidc(self):
- self.requests_mocker.get(
- "http://provider.com/auth/realms/master/protocol/openid-connect/auth",
- status_code=200,
- )
- form_url = get_start_form_url(self.form)
- start_url = get_start_url(self.form, plugin_id="digid_oidc")
-
- response = self.client.get(start_url)
-
- with self.subTest("Sends user to IdP"):
- self.assertEqual(status.HTTP_302_FOUND, response.status_code)
-
- redirect_target = furl(response.url) # type: ignore
- query_params = redirect_target.query.params
-
- self.assertEqual(redirect_target.host, "provider.com")
- self.assertEqual(
- redirect_target.path,
- "/auth/realms/master/protocol/openid-connect/auth",
- )
- self.assertEqual(query_params["scope"], "openid bsn")
- self.assertEqual(query_params["client_id"], "testclient")
- self.assertEqual(
- query_params["redirect_uri"],
- f"http://testserver{reverse('digid_oidc:oidc_authentication_callback')}",
- )
-
- with self.subTest("Return state setup"):
- oidc_login_next = furl(self.client.session["oidc_login_next"])
- query_params = oidc_login_next.query.params
-
- self.assertEqual(
- oidc_login_next.path,
- reverse(
- "authentication:return",
- kwargs={"slug": self.form.slug, "plugin_id": "digid_oidc"},
- ),
- )
- self.assertEqual(query_params["next"], form_url)
-
- def test_redirect_to_digid_oidc_internal_server_error(self):
- self.requests_mocker.get(
- "http://provider.com/auth/realms/master/protocol/openid-connect/auth",
- status_code=500,
- )
- start_url = get_start_url(self.form, plugin_id="digid_oidc")
-
- response = self.client.get(start_url)
-
- self.assertEqual(status.HTTP_302_FOUND, response.status_code)
- assert self.requests_mocker.last_request is not None
- self.assertEqual(
- self.requests_mocker.last_request.url,
- "http://provider.com/auth/realms/master/protocol/openid-connect/auth",
- )
- parsed = furl(response.url) # type: ignore
-
- self.assertEqual(parsed.host, "testserver")
- self.assertEqual(parsed.path, f"/{self.form.slug}/")
- query_params = parsed.query.params
- self.assertEqual(query_params[BACKEND_OUTAGE_RESPONSE_PARAMETER], "digid_oidc")
-
- def test_redirect_to_digid_oidc_callback_error(self):
- # set up session/state
- self.requests_mocker.get(
- "http://provider.com/auth/realms/master/protocol/openid-connect/auth",
- status_code=200,
- )
- start_url = get_start_url(self.form, plugin_id="digid_oidc")
- response = self.client.get(start_url)
- assert response.status_code == 302
- assert response.url.startswith("http://provider.com") # type: ignore
-
- with patch(
- "openforms.authentication.contrib.digid_eherkenning_oidc.backends"
- ".OIDCAuthenticationDigiDBackend.verify_claims",
- return_value=False,
- ):
- response = self.client.get(reverse("digid_oidc:callback"))
-
- self.assertEqual(response.status_code, status.HTTP_302_FOUND)
-
- parsed = furl(response.url)
- query_params = parsed.query.params
-
- self.assertEqual(parsed.path, f"/{self.form.slug}/")
- self.assertEqual(query_params["_start"], "1")
- self.assertEqual(query_params[BACKEND_OUTAGE_RESPONSE_PARAMETER], "digid_oidc")
-
- @override_settings(CORS_ALLOW_ALL_ORIGINS=False, CORS_ALLOWED_ORIGINS=[])
- def test_redirect_to_disallowed_domain(self):
- start_url = get_start_url(
- self.form, plugin_id="digid_oidc", host="http://example.com"
- )
-
- response = self.client.get(start_url)
-
- self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
-
- @override_settings(
- CORS_ALLOW_ALL_ORIGINS=False, CORS_ALLOWED_ORIGINS=["http://example.com"]
- )
- def test_redirect_to_allowed_domain(self):
- self.requests_mocker.get(
- "http://provider.com/auth/realms/master/protocol/openid-connect/auth",
- status_code=200,
- )
- form_url = get_start_form_url(self.form, host="http://example.com")
- start_url = get_start_url(
- self.form, plugin_id="digid_oidc", host="http://example.com"
- )
-
- response = self.client.get(start_url)
-
- with self.subTest("Sends user to IdP"):
- self.assertEqual(status.HTTP_302_FOUND, response.status_code)
- self.assertTrue(response.url.startswith("http://provider.com/")) # type: ignore
-
- with self.subTest("Return state setup"):
- oidc_login_next = furl(self.client.session["oidc_login_next"])
- expected_next = reverse(
- "authentication:return",
- kwargs={"slug": self.form.slug, "plugin_id": "digid_oidc"},
- )
- self.assertEqual(oidc_login_next.path, expected_next)
- query_params = oidc_login_next.query.params
- self.assertEqual(query_params["next"], form_url)
-
- def test_redirect_with_keycloak_identity_provider_hint(self, *m):
- self.mock_config.return_value.oidc_keycloak_idp_hint = "oidc-digid"
- self.requests_mocker.get(
- "http://provider.com/auth/realms/master/protocol/openid-connect/auth",
- status_code=200,
- )
- start_url = get_start_url(self.form, plugin_id="digid_oidc")
-
- response = self.client.get(start_url)
-
- self.assertEqual(status.HTTP_302_FOUND, response.status_code)
- parsed = furl(response.url) # type: ignore
- query_params = parsed.query.params
- self.assertEqual(query_params["kc_idp_hint"], "oidc-digid")
-
- @tag("gh-3656", "gh-3692")
- # This is an example of a specific provider. It may differ when a different provider is used.
- # According to https://openid.net/specs/openid-connect-core-1_0.html#AuthError and
- # https://www.rfc-editor.org/rfc/rfc6749.html#section-4.1.2.1 , this is the error we expect from OIDC
- def test_redirect_to_form_when_login_cancelled_by_anonymous_user(self):
- # set up session/state
- self.requests_mocker.get(
- "http://provider.com/auth/realms/master/protocol/openid-connect/auth",
- status_code=200,
- )
- start_url = get_start_url(self.form, plugin_id="digid_oidc")
- response = self.client.get(start_url)
- assert response.status_code == 302
- assert response.url.startswith("http://provider.com") # type: ignore
-
- response = self.client.get(
- reverse("digid_oidc:callback"),
- {
- "error": "access_denied",
- "error_description": "The user cancelled",
- },
- )
-
- self.assertEqual(response.status_code, status.HTTP_302_FOUND)
-
- parsed = furl(response.url) # type: ignore
- query_params = parsed.query.params
-
- self.assertEqual(query_params["_digid-message"], "login-cancelled")
- self.assertIsNone(query_params.get(BACKEND_OUTAGE_RESPONSE_PARAMETER))
-
- @tag("gh-3656", "gh-3692")
- def test_redirect_to_form_when_login_cancelled_by_authenticated_user(self):
- # set up session/state
- self.requests_mocker.get(
- "http://provider.com/auth/realms/master/protocol/openid-connect/auth",
- status_code=200,
- )
- user = StaffUserFactory.create()
- start_url = get_start_url(self.form, plugin_id="digid_oidc")
- self.client.force_login(user=user)
- response = self.client.get(start_url)
- assert response.status_code == 302
- assert response.url.startswith("http://provider.com") # type: ignore
-
- response = self.client.get(
- reverse("digid_oidc:callback"),
- {"error": "access_denied", "error_description": "The user cancelled"},
- )
-
- self.assertEqual(response.status_code, status.HTTP_302_FOUND)
-
- parsed = furl(response.url)
- query_params = parsed.query.params
-
- self.assertEqual(query_params["_digid-message"], "login-cancelled")
- self.assertIsNone(query_params.get(BACKEND_OUTAGE_RESPONSE_PARAMETER))
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/digid_machtigen/__init__.py b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/digid_machtigen/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/digid_machtigen/test_auth_plugin.py b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/digid_machtigen/test_auth_plugin.py
deleted file mode 100644
index ab99320909..0000000000
--- a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/digid_machtigen/test_auth_plugin.py
+++ /dev/null
@@ -1,58 +0,0 @@
-from unittest.mock import patch
-
-from django.urls import reverse
-
-from rest_framework import status
-from rest_framework.test import APITestCase
-
-from openforms.accounts.tests.factories import UserFactory
-from openforms.config.models import GlobalConfiguration
-
-
-class DigiDMachtigenOIDCAuthPluginEndpointTests(APITestCase):
- @classmethod
- def setUpTestData(cls):
- super().setUpTestData()
-
- cls.user = UserFactory.create(is_staff=True)
-
- def setUp(self):
- super().setUp()
-
- self.client.force_authenticate(user=self.user)
-
- @patch("openforms.plugins.plugin.GlobalConfiguration.get_solo")
- def test_plugin_list_digid_machtigen_oidc_enabled(self, mock_get_solo):
- mock_get_solo.return_value = GlobalConfiguration(
- plugin_configuration={
- "authentication": {
- "digid_machtigen_oidc": {"enabled": True},
- },
- }
- )
-
- endpoint = reverse("api:authentication-plugin-list")
-
- response = self.client.get(endpoint)
- self.assertEqual(response.status_code, status.HTTP_200_OK)
-
- plugin_names = [p["id"] for p in response.data]
- self.assertIn("digid_machtigen_oidc", plugin_names)
-
- @patch("openforms.plugins.plugin.GlobalConfiguration.get_solo")
- def test_plugin_list_digid_machtigen_oidc_not_enabled(self, mock_get_solo):
- mock_get_solo.return_value = GlobalConfiguration(
- plugin_configuration={
- "authentication": {
- "digid_machtigen_oidc": {"enabled": False},
- },
- }
- )
-
- endpoint = reverse("api:authentication-plugin-list")
-
- response = self.client.get(endpoint)
- self.assertEqual(response.status_code, status.HTTP_200_OK)
-
- plugin_names = [p["id"] for p in response.data]
- self.assertNotIn("digid_machtigen_oidc", plugin_names)
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/digid_machtigen/test_auth_procedure.py b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/digid_machtigen/test_auth_procedure.py
deleted file mode 100644
index a804fd7cc9..0000000000
--- a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/digid_machtigen/test_auth_procedure.py
+++ /dev/null
@@ -1,332 +0,0 @@
-from unittest.mock import patch
-
-from django.test import TestCase, override_settings, tag
-from django.urls import reverse
-
-import requests_mock
-from furl import furl
-from rest_framework import status
-from rest_framework.test import APIRequestFactory
-
-from digid_eherkenning_oidc_generics.models import OpenIDConnectDigiDMachtigenConfig
-from openforms.accounts.tests.factories import StaffUserFactory
-from openforms.authentication.constants import (
- CO_SIGN_PARAMETER,
- FORM_AUTH_SESSION_KEY,
- AuthAttribute,
-)
-from openforms.authentication.tests.utils import get_start_form_url, get_start_url
-from openforms.authentication.views import BACKEND_OUTAGE_RESPONSE_PARAMETER
-from openforms.forms.tests.factories import FormFactory
-
-from ...constants import DIGID_MACHTIGEN_OIDC_AUTH_SESSION_KEY
-from ...plugin import DigiDMachtigenOIDCAuthentication
-
-default_config = OpenIDConnectDigiDMachtigenConfig(
- enabled=True,
- oidc_rp_client_id="testclient",
- oidc_rp_client_secret="secret",
- oidc_rp_sign_algo="RS256",
- oidc_rp_scopes_list=["openid", "bsn"],
- oidc_op_jwks_endpoint="http://provider.com/auth/realms/master/protocol/openid-connect/certs",
- oidc_op_authorization_endpoint="http://provider.com/auth/realms/master/protocol/openid-connect/auth",
- oidc_op_token_endpoint="http://provider.com/auth/realms/master/protocol/openid-connect/token",
- oidc_op_user_endpoint="http://provider.com/auth/realms/master/protocol/openid-connect/userinfo",
-)
-
-
-class MockConfigMixin:
- def setUp(self):
- super().setUp()
-
- config_patcher = patch(
- "digid_eherkenning_oidc_generics.models.OpenIDConnectDigiDMachtigenConfig.get_solo",
- return_value=default_config,
- )
- self.mock_config = config_patcher.start()
- self.addCleanup(config_patcher.stop)
-
-
-@override_settings(CORS_ALLOW_ALL_ORIGINS=True, IS_HTTPS=True)
-class DigiDMachtigenOIDCTests(MockConfigMixin, TestCase):
- @classmethod
- def setUpTestData(cls):
- super().setUpTestData()
- cls.form = FormFactory.create(
- generate_minimal_setup=True,
- authentication_backends=["digid_machtigen_oidc"],
- )
-
- def setUp(self):
- super().setUp()
-
- self.requests_mocker = requests_mock.Mocker()
- self.addCleanup(self.requests_mocker.stop)
- self.requests_mocker.start()
-
- def test_redirect_to_digid_machtigen_oidc(self):
- self.requests_mocker.get(
- "http://provider.com/auth/realms/master/protocol/openid-connect/auth",
- status_code=200,
- )
- form_url = get_start_form_url(self.form)
- start_url = get_start_url(self.form, plugin_id="digid_machtigen_oidc")
-
- response = self.client.get(start_url)
-
- with self.subTest("Sends user to IdP"):
- self.assertEqual(status.HTTP_302_FOUND, response.status_code)
-
- redirect_target = furl(response.url) # type: ignore
- query_params = redirect_target.query.params
-
- self.assertEqual(redirect_target.host, "provider.com")
- self.assertEqual(
- redirect_target.path,
- "/auth/realms/master/protocol/openid-connect/auth",
- )
- self.assertEqual(query_params["scope"], "openid bsn")
- self.assertEqual(query_params["client_id"], "testclient")
- self.assertEqual(
- query_params["redirect_uri"],
- f"http://testserver{reverse('digid_machtigen_oidc:oidc_authentication_callback')}",
- )
-
- with self.subTest("Return state setup"):
- oidc_login_next = furl(self.client.session["oidc_login_next"])
- query_params = oidc_login_next.query.params
-
- self.assertEqual(
- oidc_login_next.path,
- reverse(
- "authentication:return",
- kwargs={
- "slug": self.form.slug,
- "plugin_id": "digid_machtigen_oidc",
- },
- ),
- )
- self.assertEqual(query_params["next"], form_url)
-
- def test_redirect_to_digid_machtigen_oidc_internal_server_error(self):
- self.requests_mocker.get(
- "http://provider.com/auth/realms/master/protocol/openid-connect/auth",
- status_code=500,
- )
- start_url = get_start_url(self.form, plugin_id="digid_machtigen_oidc")
-
- response = self.client.get(start_url)
-
- self.assertEqual(status.HTTP_302_FOUND, response.status_code)
- assert self.requests_mocker.last_request is not None
- self.assertEqual(
- self.requests_mocker.last_request.url,
- "http://provider.com/auth/realms/master/protocol/openid-connect/auth",
- )
- parsed = furl(response.url) # type: ignore
-
- self.assertEqual(parsed.host, "testserver")
- self.assertEqual(parsed.path, f"/{self.form.slug}/")
- query_params = parsed.query.params
- self.assertEqual(
- query_params[BACKEND_OUTAGE_RESPONSE_PARAMETER], "digid_machtigen_oidc"
- )
-
- def test_redirect_to_digid_machtigen_oidc_callback_error(self):
- # set up session/state
- self.requests_mocker.get(
- "http://provider.com/auth/realms/master/protocol/openid-connect/auth",
- status_code=200,
- )
- start_url = get_start_url(self.form, plugin_id="digid_machtigen_oidc")
- response = self.client.get(start_url)
- assert response.status_code == 302
- assert response.url.startswith("http://provider.com") # type: ignore
-
- with patch(
- "openforms.authentication.contrib.digid_eherkenning_oidc.backends"
- ".OIDCAuthenticationDigiDBackend.verify_claims",
- return_value=False,
- ):
- response = self.client.get(reverse("digid_machtigen_oidc:callback"))
-
- self.assertEqual(response.status_code, status.HTTP_302_FOUND)
-
- parsed = furl(response.url)
- query_params = parsed.query.params
-
- self.assertEqual(parsed.path, f"/{self.form.slug}/")
- self.assertEqual(query_params["_start"], "1")
- self.assertEqual(
- query_params[BACKEND_OUTAGE_RESPONSE_PARAMETER], "digid_machtigen_oidc"
- )
-
- @override_settings(CORS_ALLOW_ALL_ORIGINS=False, CORS_ALLOWED_ORIGINS=[])
- def test_redirect_to_disallowed_domain(self):
- start_url = get_start_url(
- self.form, plugin_id="digid_machtigen_oidc", host="http://example.com"
- )
-
- response = self.client.get(start_url)
-
- self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
-
- @override_settings(
- CORS_ALLOW_ALL_ORIGINS=False, CORS_ALLOWED_ORIGINS=["http://example.com"]
- )
- def test_redirect_to_allowed_domain(self):
- self.requests_mocker.get(
- "http://provider.com/auth/realms/master/protocol/openid-connect/auth",
- status_code=200,
- )
- form_url = get_start_form_url(self.form, host="http://example.com")
- start_url = get_start_url(
- self.form, plugin_id="digid_machtigen_oidc", host="http://example.com"
- )
-
- response = self.client.get(start_url)
-
- with self.subTest("Sends user to IdP"):
- self.assertEqual(status.HTTP_302_FOUND, response.status_code)
- self.assertTrue(response.url.startswith("http://provider.com/")) # type: ignore
-
- with self.subTest("Return state setup"):
- oidc_login_next = furl(self.client.session["oidc_login_next"])
- expected_next = reverse(
- "authentication:return",
- kwargs={"slug": self.form.slug, "plugin_id": "digid_machtigen_oidc"},
- )
- self.assertEqual(oidc_login_next.path, expected_next)
- query_params = oidc_login_next.query.params
- self.assertEqual(query_params["next"], form_url)
-
- def test_redirect_with_keycloak_identity_provider_hint(self):
- self.mock_config.return_value.oidc_keycloak_idp_hint = "oidc-digid-machtigen"
- self.requests_mocker.get(
- "http://provider.com/auth/realms/master/protocol/openid-connect/auth",
- status_code=200,
- )
- start_url = get_start_url(self.form, plugin_id="digid_machtigen_oidc")
-
- response = self.client.get(start_url)
-
- self.assertEqual(status.HTTP_302_FOUND, response.status_code)
- parsed = furl(response.url) # type: ignore
- query_params = parsed.query.params
- self.assertEqual(query_params["kc_idp_hint"], "oidc-digid-machtigen")
-
- @tag("gh-3656", "gh-3692")
- # This is an example of a specific provider. It may differ when a different provider is used.
- # According to https://openid.net/specs/openid-connect-core-1_0.html#AuthError and
- # https://www.rfc-editor.org/rfc/rfc6749.html#section-4.1.2.1 , this is the error we expect from OIDC
- def test_redirect_to_form_when_login_cancelled_by_anonymous_user(self):
- # set up session/state
- self.requests_mocker.get(
- "http://provider.com/auth/realms/master/protocol/openid-connect/auth",
- status_code=200,
- )
- start_url = get_start_url(self.form, plugin_id="digid_machtigen_oidc")
- response = self.client.get(start_url)
- assert response.status_code == 302
- assert response.url.startswith("http://provider.com") # type: ignore
-
- response = self.client.get(
- reverse("digid_machtigen_oidc:callback"),
- {
- "error": "access_denied",
- "error_description": "The user cancelled",
- },
- )
-
- self.assertEqual(response.status_code, status.HTTP_302_FOUND)
-
- parsed = furl(response.url) # type: ignore
- query_params = parsed.query.params
-
- self.assertEqual(query_params["_digid-message"], "login-cancelled")
- self.assertIsNone(query_params.get(BACKEND_OUTAGE_RESPONSE_PARAMETER))
-
- @tag("gh-3656", "gh-3692")
- def test_redirect_to_form_when_login_cancelled_by_authenticated_user(self):
- # set up session/state
- self.requests_mocker.get(
- "http://provider.com/auth/realms/master/protocol/openid-connect/auth",
- status_code=200,
- )
- user = StaffUserFactory.create()
- start_url = get_start_url(self.form, plugin_id="digid_machtigen_oidc")
- self.client.force_login(user=user)
- response = self.client.get(start_url)
- assert response.status_code == 302
- assert response.url.startswith("http://provider.com") # type: ignore
-
- response = self.client.get(
- reverse("digid_machtigen_oidc:callback"),
- {"error": "access_denied", "error_description": "The user cancelled"},
- )
-
- self.assertEqual(response.status_code, status.HTTP_302_FOUND)
-
- parsed = furl(response.url)
- query_params = parsed.query.params
-
- self.assertEqual(query_params["_digid-message"], "login-cancelled")
- self.assertIsNone(query_params.get(BACKEND_OUTAGE_RESPONSE_PARAMETER))
-
-
-class AddClaimsToSessionTests(MockConfigMixin, TestCase):
-
- def test_handle_return_without_claim_digid_machtigen(self):
- factory = APIRequestFactory()
- request = factory.get("/xyz")
- request.session = {} # type: ignore
-
- plugin = DigiDMachtigenOIDCAuthentication(identifier="boh")
- plugin.add_claims_to_sessions_if_not_cosigning(claim="", request=request)
-
- self.assertNotIn(FORM_AUTH_SESSION_KEY, request.session)
-
- def test_handle_return_with_cosign_param_digid_machtigen(self):
- factory = APIRequestFactory()
- request = factory.get(f"/xyz?{CO_SIGN_PARAMETER}=tralala")
- request.session = {} # type: ignore
-
- plugin = DigiDMachtigenOIDCAuthentication(identifier="boh")
- plugin.add_claims_to_sessions_if_not_cosigning(claim="tralala", request=request)
-
- self.assertNotIn(FORM_AUTH_SESSION_KEY, request.session)
-
- def test_handle_return_digid_machtigen(self):
- factory = APIRequestFactory()
- request = factory.get("/xyz")
- request.session = { # type: ignore
- DIGID_MACHTIGEN_OIDC_AUTH_SESSION_KEY: {"aanvrager.bsn": "222222222"}
- }
-
- plugin = DigiDMachtigenOIDCAuthentication(identifier="boh")
-
- with patch(
- "openforms.authentication.contrib.digid_eherkenning_oidc"
- ".plugin.OpenIDConnectDigiDMachtigenConfig.get_solo",
- return_value=OpenIDConnectDigiDMachtigenConfig(
- vertegenwoordigde_claim_name="gemachtige.bsn",
- gemachtigde_claim_name="aanvrager.bsn",
- ),
- ):
- plugin.add_claims_to_sessions_if_not_cosigning(
- claim={
- "gemachtige.bsn": "111111111",
- },
- request=request,
- )
-
- self.assertIn(FORM_AUTH_SESSION_KEY, request.session)
- self.assertEqual(
- {
- "plugin": "boh",
- "attribute": AuthAttribute.bsn,
- "value": "111111111",
- "machtigen": {"identifier_value": "222222222"},
- },
- request.session[FORM_AUTH_SESSION_KEY],
- )
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/eherkenning/__init__.py b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/eherkenning/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/eherkenning/test_admin.py b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/eherkenning/test_admin.py
deleted file mode 100644
index bde3385bb0..0000000000
--- a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/eherkenning/test_admin.py
+++ /dev/null
@@ -1,80 +0,0 @@
-import json
-
-from django.test import override_settings
-from django.urls import reverse
-
-from django_webtest import WebTest
-from maykin_2fa.test import disable_admin_mfa
-
-from digid_eherkenning_oidc_generics.models import OpenIDConnectEHerkenningConfig
-from openforms.accounts.tests.factories import SuperUserFactory
-from openforms.forms.tests.factories import FormFactory
-
-default_config = dict(
- enabled=True,
- oidc_rp_client_id="testclient",
- oidc_rp_client_secret="secret",
- oidc_rp_sign_algo="RS256",
- oidc_rp_scopes_list=["openid", "kvk"],
- oidc_op_jwks_endpoint="http://provider.com/auth/realms/master/protocol/openid-connect/certs",
- oidc_op_authorization_endpoint="http://provider.com/auth/realms/master/protocol/openid-connect/auth",
- oidc_op_token_endpoint="http://provider.com/auth/realms/master/protocol/openid-connect/token",
- oidc_op_user_endpoint="http://provider.com/auth/realms/master/protocol/openid-connect/userinfo",
- oidc_op_logout_endpoint="http://provider.com/auth/realms/master/protocol/openid-connect/logout",
-)
-
-
-@disable_admin_mfa()
-@override_settings(CORS_ALLOW_ALL_ORIGINS=True, IS_HTTPS=True)
-class eHerkenningOIDCFormAdminTests(WebTest):
- def setUp(self):
- super().setUp()
-
- self.user = SuperUserFactory.create()
- self.app.set_user(self.user)
-
- def test_eherkenning_oidc_disable_allowed(self):
- # Patching `get_solo()` doesn't seem to work when retrieving the change_form
- config = OpenIDConnectEHerkenningConfig(**default_config)
- config.save()
-
- FormFactory.create(authentication_backends=["digid_oidc"])
-
- response = self.app.get(
- reverse(
- "admin:digid_eherkenning_oidc_generics_openidconnecteherkenningconfig_change"
- )
- )
-
- form = response.forms["openidconnecteherkenningconfig_form"]
- form["enabled"] = False
- # set the value manually, normally this is done through JS
- form["oidc_rp_scopes_list"] = json.dumps(config.oidc_rp_scopes_list)
- form["oidc_exempt_urls"] = json.dumps(config.oidc_exempt_urls)
- response = form.submit()
-
- self.assertEqual(response.status_code, 302)
- self.assertFalse(OpenIDConnectEHerkenningConfig.get_solo().enabled)
-
- def test_eherkenning_oidc_disable_not_allowed(self):
- # Patching `get_solo()` doesn't seem to work when retrieving the change_form
- config = OpenIDConnectEHerkenningConfig(**default_config)
- config.save()
-
- FormFactory.create(authentication_backends=["eherkenning_oidc"])
-
- response = self.app.get(
- reverse(
- "admin:digid_eherkenning_oidc_generics_openidconnecteherkenningconfig_change"
- )
- )
-
- form = response.forms["openidconnecteherkenningconfig_form"]
- form["enabled"] = False
- # set the value manually, normally this is done through JS
- form["oidc_rp_scopes_list"] = json.dumps(config.oidc_rp_scopes_list)
- form["oidc_exempt_urls"] = json.dumps(config.oidc_exempt_urls)
- response = form.submit()
-
- self.assertEqual(response.status_code, 200)
- self.assertTrue(OpenIDConnectEHerkenningConfig.get_solo().enabled)
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/eherkenning/test_auth_logout.py b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/eherkenning/test_auth_logout.py
deleted file mode 100644
index a0cdadc908..0000000000
--- a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/eherkenning/test_auth_logout.py
+++ /dev/null
@@ -1,94 +0,0 @@
-from unittest.mock import patch
-
-from django.test import RequestFactory, TestCase
-
-import requests_mock
-
-from digid_eherkenning_oidc_generics.models import (
- OpenIDConnectEHerkenningConfig,
- OpenIDConnectPublicConfig,
-)
-from openforms.authentication.contrib.digid_eherkenning_oidc.plugin import (
- DigiDOIDCAuthentication,
- eHerkenningOIDCAuthentication,
-)
-
-
-class PluginLogoutTest(TestCase):
- @patch(
- "digid_eherkenning_oidc_generics.models.OpenIDConnectPublicConfig.get_solo",
- return_value=OpenIDConnectPublicConfig(
- oidc_op_logout_endpoint="http://foo/logout",
- ),
- )
- @requests_mock.Mocker(real_http=False)
- def test_logout_digid(self, p, mocker):
- mocker.get(
- "http://foo/logout",
- text="ignored",
- )
-
- plugin = DigiDOIDCAuthentication("digid")
-
- with self.subTest("empty session"):
- request = RequestFactory().post("/dummy")
- request.session = self.client.session
-
- plugin.logout(request)
-
- self.assertEqual(list(request.session.keys()), [])
- self.assertFalse(mocker.called)
-
- with self.subTest("session"):
- session = self.client.session
- session["oidc_id_token"] = "xyz"
- session["oidc_login_next"] = "xyz"
- session[plugin.session_key] = "xyz"
- session.save()
-
- request = RequestFactory().post("/dummy")
- request.session = session
-
- plugin.logout(request)
-
- self.assertEqual(list(request.session.keys()), [])
- self.assertTrue(mocker.called)
-
- @patch(
- "digid_eherkenning_oidc_generics.models.OpenIDConnectEHerkenningConfig.get_solo",
- return_value=OpenIDConnectEHerkenningConfig(
- oidc_op_logout_endpoint="http://foo/logout",
- ),
- )
- @requests_mock.Mocker(real_http=False)
- def test_logout_eherkenning(self, p, mocker):
- mocker.get(
- "http://foo/logout",
- text="ignored",
- )
-
- plugin = eHerkenningOIDCAuthentication("eherkenning")
-
- with self.subTest("empty session"):
- request = RequestFactory().post("/dummy")
- request.session = self.client.session
-
- plugin.logout(request)
-
- self.assertEqual(list(request.session.keys()), [])
- self.assertFalse(mocker.called)
-
- with self.subTest("session"):
- session = self.client.session
- session["oidc_id_token"] = "xyz"
- session["oidc_login_next"] = "xyz"
- session[plugin.session_key] = "xyz"
- session.save()
-
- request = RequestFactory().post("/dummy")
- request.session = session
-
- plugin.logout(request)
-
- self.assertEqual(list(request.session.keys()), [])
- self.assertTrue(mocker.called)
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/eherkenning/test_auth_plugin_endpoint.py b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/eherkenning/test_auth_plugin_endpoint.py
deleted file mode 100644
index 191f7cd045..0000000000
--- a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/eherkenning/test_auth_plugin_endpoint.py
+++ /dev/null
@@ -1,58 +0,0 @@
-from unittest.mock import patch
-
-from django.urls import reverse
-
-from rest_framework import status
-from rest_framework.test import APITestCase
-
-from openforms.accounts.tests.factories import UserFactory
-from openforms.config.models import GlobalConfiguration
-
-
-class eHerkenningOIDCAuthPluginEndpointTests(APITestCase):
- @classmethod
- def setUpTestData(cls):
- super().setUpTestData()
-
- cls.user = UserFactory.create(is_staff=True)
-
- def setUp(self):
- super().setUp()
-
- self.client.force_authenticate(user=self.user)
-
- @patch("openforms.plugins.plugin.GlobalConfiguration.get_solo")
- def test_plugin_list_eherkenning_oidc_enabled(self, mock_get_solo):
- mock_get_solo.return_value = GlobalConfiguration(
- plugin_configuration={
- "authentication": {
- "eherkenning_oidc": {"enabled": True},
- },
- },
- )
-
- endpoint = reverse("api:authentication-plugin-list")
-
- response = self.client.get(endpoint)
- self.assertEqual(response.status_code, status.HTTP_200_OK)
-
- plugin_names = [p["id"] for p in response.data]
- self.assertIn("eherkenning_oidc", plugin_names)
-
- @patch("openforms.plugins.plugin.GlobalConfiguration.get_solo")
- def test_plugin_list_eherkenning_oidc_not_enabled(self, mock_get_solo):
- mock_get_solo.return_value = GlobalConfiguration(
- plugin_configuration={
- "authentication": {
- "eherkenning_oidc": {"enabled": False},
- },
- }
- )
-
- endpoint = reverse("api:authentication-plugin-list")
-
- response = self.client.get(endpoint)
- self.assertEqual(response.status_code, status.HTTP_200_OK)
-
- plugin_names = [p["id"] for p in response.data]
- self.assertNotIn("eherkenning_oidc", plugin_names)
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/eherkenning/test_auth_procedure.py b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/eherkenning/test_auth_procedure.py
deleted file mode 100644
index 162d1dced4..0000000000
--- a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/eherkenning/test_auth_procedure.py
+++ /dev/null
@@ -1,256 +0,0 @@
-from unittest.mock import patch
-
-from django.test import TestCase, override_settings, tag
-from django.urls import reverse
-
-import requests_mock
-from furl import furl
-from rest_framework import status
-
-from digid_eherkenning_oidc_generics.models import OpenIDConnectEHerkenningConfig
-from openforms.accounts.tests.factories import StaffUserFactory
-from openforms.authentication.tests.utils import get_start_form_url, get_start_url
-from openforms.authentication.views import BACKEND_OUTAGE_RESPONSE_PARAMETER
-from openforms.forms.tests.factories import FormFactory
-
-default_config = OpenIDConnectEHerkenningConfig(
- enabled=True,
- oidc_rp_client_id="testclient",
- oidc_rp_client_secret="secret",
- oidc_rp_sign_algo="RS256",
- oidc_rp_scopes_list=["openid", "kvk"],
- oidc_op_jwks_endpoint="http://provider.com/auth/realms/master/protocol/openid-connect/certs",
- oidc_op_authorization_endpoint="http://provider.com/auth/realms/master/protocol/openid-connect/auth",
- oidc_op_token_endpoint="http://provider.com/auth/realms/master/protocol/openid-connect/token",
- oidc_op_user_endpoint="http://provider.com/auth/realms/master/protocol/openid-connect/userinfo",
-)
-
-
-@override_settings(CORS_ALLOW_ALL_ORIGINS=True, IS_HTTPS=True)
-class eHerkenningOIDCTests(TestCase):
- @classmethod
- def setUpTestData(cls):
- super().setUpTestData()
- cls.form = FormFactory.create(
- generate_minimal_setup=True,
- authentication_backends=["eherkenning_oidc"],
- )
-
- def setUp(self):
- super().setUp()
-
- config_patcher = patch(
- "digid_eherkenning_oidc_generics.models.OpenIDConnectEHerkenningConfig.get_solo",
- return_value=default_config,
- )
- self.mock_config = config_patcher.start()
- self.addCleanup(config_patcher.stop)
-
- self.requests_mocker = requests_mock.Mocker()
- self.addCleanup(self.requests_mocker.stop)
- self.requests_mocker.start()
-
- def test_redirect_to_eherkenning_oidc(self):
- self.requests_mocker.get(
- "http://provider.com/auth/realms/master/protocol/openid-connect/auth",
- status_code=200,
- )
- form_url = get_start_form_url(self.form)
- start_url = get_start_url(self.form, plugin_id="eherkenning_oidc")
-
- response = self.client.get(start_url)
-
- with self.subTest("Sends user to IdP"):
- self.assertEqual(status.HTTP_302_FOUND, response.status_code)
-
- redirect_target = furl(response.url) # type: ignore
- query_params = redirect_target.query.params
-
- self.assertEqual(redirect_target.host, "provider.com")
- self.assertEqual(
- redirect_target.path,
- "/auth/realms/master/protocol/openid-connect/auth",
- )
- self.assertEqual(query_params["scope"], "openid kvk")
- self.assertEqual(query_params["client_id"], "testclient")
- self.assertEqual(
- query_params["redirect_uri"],
- f"http://testserver{reverse('eherkenning_oidc:oidc_authentication_callback')}",
- )
-
- with self.subTest("Return state setup"):
- oidc_login_next = furl(self.client.session["oidc_login_next"])
- query_params = oidc_login_next.query.params
-
- self.assertEqual(
- oidc_login_next.path,
- reverse(
- "authentication:return",
- kwargs={"slug": self.form.slug, "plugin_id": "eherkenning_oidc"},
- ),
- )
- self.assertEqual(query_params["next"], form_url)
-
- def test_redirect_to_eherkenning_oidc_internal_server_error(self):
- self.requests_mocker.get(
- "http://provider.com/auth/realms/master/protocol/openid-connect/auth",
- status_code=500,
- )
- start_url = get_start_url(self.form, plugin_id="eherkenning_oidc")
-
- response = self.client.get(start_url)
-
- self.assertEqual(status.HTTP_302_FOUND, response.status_code)
- assert self.requests_mocker.last_request is not None
- self.assertEqual(
- self.requests_mocker.last_request.url,
- "http://provider.com/auth/realms/master/protocol/openid-connect/auth",
- )
- parsed = furl(response.url) # type: ignore
-
- self.assertEqual(parsed.host, "testserver")
- self.assertEqual(parsed.path, f"/{self.form.slug}/")
- query_params = parsed.query.params
- self.assertEqual(
- query_params[BACKEND_OUTAGE_RESPONSE_PARAMETER], "eherkenning_oidc"
- )
-
- def test_redirect_to_eherkenning_oidc_callback_error(self):
- # set up session/state
- self.requests_mocker.get(
- "http://provider.com/auth/realms/master/protocol/openid-connect/auth",
- status_code=200,
- )
- start_url = get_start_url(self.form, plugin_id="eherkenning_oidc")
- response = self.client.get(start_url)
- assert response.status_code == 302
- assert response.url.startswith("http://provider.com") # type: ignore
-
- with patch(
- "openforms.authentication.contrib.digid_eherkenning_oidc.backends"
- ".OIDCAuthenticationEHerkenningBackend.verify_claims",
- return_value=False,
- ):
- response = self.client.get(reverse("eherkenning_oidc:callback"))
-
- self.assertEqual(response.status_code, status.HTTP_302_FOUND)
-
- parsed = furl(response.url)
- query_params = parsed.query.params
-
- self.assertEqual(parsed.path, f"/{self.form.slug}/")
- self.assertEqual(query_params["_start"], "1")
- self.assertEqual(
- query_params[BACKEND_OUTAGE_RESPONSE_PARAMETER], "eherkenning_oidc"
- )
-
- @override_settings(CORS_ALLOW_ALL_ORIGINS=False, CORS_ALLOWED_ORIGINS=[])
- def test_redirect_to_disallowed_domain(self):
- start_url = get_start_url(
- self.form, plugin_id="eherkenning_oidc", host="http://example.com"
- )
-
- response = self.client.get(start_url)
-
- self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
-
- @override_settings(
- CORS_ALLOW_ALL_ORIGINS=False, CORS_ALLOWED_ORIGINS=["http://example.com"]
- )
- def test_redirect_to_allowed_domain(self):
- self.requests_mocker.get(
- "http://provider.com/auth/realms/master/protocol/openid-connect/auth",
- status_code=200,
- )
- form_url = get_start_form_url(self.form, host="http://example.com")
- start_url = get_start_url(
- self.form, plugin_id="eherkenning_oidc", host="http://example.com"
- )
-
- response = self.client.get(start_url)
-
- with self.subTest("Sends user to IdP"):
- self.assertEqual(status.HTTP_302_FOUND, response.status_code)
- self.assertTrue(response.url.startswith("http://provider.com/")) # type: ignore
-
- with self.subTest("Return state setup"):
- oidc_login_next = furl(self.client.session["oidc_login_next"])
- expected_next = reverse(
- "authentication:return",
- kwargs={"slug": self.form.slug, "plugin_id": "eherkenning_oidc"},
- )
- self.assertEqual(oidc_login_next.path, expected_next)
- query_params = oidc_login_next.query.params
- self.assertEqual(query_params["next"], form_url)
-
- def test_redirect_with_keycloak_identity_provider_hint(self):
- self.mock_config.return_value.oidc_keycloak_idp_hint = "oidc-eHerkenning"
- self.requests_mocker.get(
- "http://provider.com/auth/realms/master/protocol/openid-connect/auth",
- status_code=200,
- )
- start_url = get_start_url(self.form, plugin_id="eherkenning_oidc")
-
- response = self.client.get(start_url)
-
- self.assertEqual(status.HTTP_302_FOUND, response.status_code)
- parsed = furl(response.url) # type: ignore
- query_params = parsed.query.params
- self.assertEqual(query_params["kc_idp_hint"], "oidc-eHerkenning")
-
- @tag("gh-3656", "gh-3692")
- # This is an example of a specific provider. It may differ when a different provider is used.
- # According to https://openid.net/specs/openid-connect-core-1_0.html#AuthError and
- # https://www.rfc-editor.org/rfc/rfc6749.html#section-4.1.2.1 , this is the error we expect from OIDC
- def test_redirect_to_form_when_login_cancelled_by_anonymous_user(self):
- self.requests_mocker.get(
- "http://provider.com/auth/realms/master/protocol/openid-connect/auth",
- status_code=200,
- )
- start_url = get_start_url(self.form, plugin_id="eherkenning_oidc")
- response = self.client.get(start_url)
- assert response.status_code == 302
- assert response.url.startswith("http://provider.com") # type: ignore
-
- response = self.client.get(
- reverse("eherkenning_oidc:callback"),
- {
- "error": "access_denied",
- "error_description": "The user cancelled",
- },
- )
-
- self.assertEqual(response.status_code, status.HTTP_302_FOUND)
-
- parsed = furl(response.url) # type: ignore
- query_params = parsed.query.params
-
- self.assertEqual(query_params["_eherkenning-message"], "login-cancelled")
- self.assertIsNone(query_params.get(BACKEND_OUTAGE_RESPONSE_PARAMETER))
-
- @tag("gh-3656", "gh-3692")
- def test_redirect_to_form_when_login_cancelled_by_authenticated_user(self):
- # set up session/state
- self.requests_mocker.get(
- "http://provider.com/auth/realms/master/protocol/openid-connect/auth",
- status_code=200,
- )
- user = StaffUserFactory.create()
- start_url = get_start_url(self.form, plugin_id="eherkenning_oidc")
- self.client.force_login(user=user)
- response = self.client.get(start_url)
- assert response.status_code == 302
- assert response.url.startswith("http://provider.com") # type: ignore
-
- response = self.client.get(
- reverse("eherkenning_oidc:callback"),
- {"error": "access_denied", "error_description": "The user cancelled"},
- )
-
- self.assertEqual(response.status_code, status.HTTP_302_FOUND)
-
- parsed = furl(response.url)
- query_params = parsed.query.params
-
- self.assertEqual(query_params["_eherkenning-message"], "login-cancelled")
- self.assertIsNone(query_params.get(BACKEND_OUTAGE_RESPONSE_PARAMETER))
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/eherkenning_bewindvoering/__init__.py b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/eherkenning_bewindvoering/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/eherkenning_bewindvoering/test_auth_plugin.py b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/eherkenning_bewindvoering/test_auth_plugin.py
deleted file mode 100644
index 7e60629c3c..0000000000
--- a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/eherkenning_bewindvoering/test_auth_plugin.py
+++ /dev/null
@@ -1,60 +0,0 @@
-from unittest.mock import patch
-
-from django.urls import reverse
-
-from rest_framework import status
-from rest_framework.test import APITestCase
-
-from openforms.accounts.tests.factories import UserFactory
-from openforms.config.models import GlobalConfiguration
-
-
-class EHerkenningBewindvoeringOIDCAuthPluginEndpointTests(APITestCase):
- @classmethod
- def setUpTestData(cls):
- super().setUpTestData()
-
- cls.user = UserFactory.create(is_staff=True)
-
- def setUp(self):
- super().setUp()
-
- self.client.force_authenticate(user=self.user)
-
- @patch("openforms.plugins.plugin.GlobalConfiguration.get_solo")
- def test_plugin_list_eherkenning_bewindvoering_oidc_enabled(self, mock_get_solo):
- mock_get_solo.return_value = GlobalConfiguration(
- plugin_configuration={
- "authentication": {
- "eherkenning_bewindvoering_oidc": {"enabled": True},
- },
- }
- )
-
- endpoint = reverse("api:authentication-plugin-list")
-
- response = self.client.get(endpoint)
- self.assertEqual(response.status_code, status.HTTP_200_OK)
-
- plugin_names = [p["id"] for p in response.data]
- self.assertIn("eherkenning_bewindvoering_oidc", plugin_names)
-
- @patch("openforms.plugins.plugin.GlobalConfiguration.get_solo")
- def test_plugin_list_eherkenning_bewindvoering_oidc_not_enabled(
- self, mock_get_solo
- ):
- mock_get_solo.return_value = GlobalConfiguration(
- plugin_configuration={
- "authentication": {
- "eherkenning_bewindvoering_oidc": {"enabled": False},
- },
- }
- )
-
- endpoint = reverse("api:authentication-plugin-list")
-
- response = self.client.get(endpoint)
- self.assertEqual(response.status_code, status.HTTP_200_OK)
-
- plugin_names = [p["id"] for p in response.data]
- self.assertNotIn("eherkenning_bewindvoering_oidc", plugin_names)
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/eherkenning_bewindvoering/test_auth_procedure.py b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/eherkenning_bewindvoering/test_auth_procedure.py
deleted file mode 100644
index 3b00f84aae..0000000000
--- a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/eherkenning_bewindvoering/test_auth_procedure.py
+++ /dev/null
@@ -1,286 +0,0 @@
-from unittest.mock import patch
-
-from django.test import TestCase, override_settings
-from django.urls import reverse
-
-import requests_mock
-from furl import furl
-from rest_framework import status
-from rest_framework.test import APIRequestFactory
-
-from digid_eherkenning_oidc_generics.models import (
- OpenIDConnectEHerkenningBewindvoeringConfig,
-)
-from openforms.authentication.constants import (
- CO_SIGN_PARAMETER,
- FORM_AUTH_SESSION_KEY,
- AuthAttribute,
-)
-from openforms.authentication.tests.utils import get_start_form_url, get_start_url
-from openforms.authentication.views import BACKEND_OUTAGE_RESPONSE_PARAMETER
-from openforms.forms.tests.factories import FormFactory
-
-from ...constants import EHERKENNING_BEWINDVOERING_OIDC_AUTH_SESSION_KEY
-from ...plugin import EHerkenningBewindvoeringOIDCAuthentication
-
-default_config = OpenIDConnectEHerkenningBewindvoeringConfig(
- enabled=True,
- oidc_rp_client_id="testclient",
- oidc_rp_client_secret="secret",
- oidc_rp_sign_algo="RS256",
- oidc_rp_scopes_list=["openid", "bsn"],
- oidc_op_jwks_endpoint="http://provider.com/auth/realms/master/protocol/openid-connect/certs",
- oidc_op_authorization_endpoint="http://provider.com/auth/realms/master/protocol/openid-connect/auth",
- oidc_op_token_endpoint="http://provider.com/auth/realms/master/protocol/openid-connect/token",
- oidc_op_user_endpoint="http://provider.com/auth/realms/master/protocol/openid-connect/userinfo",
-)
-
-
-class MockConfigMixin:
- def setUp(self):
- super().setUp()
-
- config_patcher = patch(
- "digid_eherkenning_oidc_generics.models"
- ".OpenIDConnectEHerkenningBewindvoeringConfig.get_solo",
- return_value=default_config,
- )
- self.mock_config = config_patcher.start()
- self.addCleanup(config_patcher.stop)
-
-
-@override_settings(CORS_ALLOW_ALL_ORIGINS=True, IS_HTTPS=True)
-class EHerkenningBewindvoeringOIDCTests(MockConfigMixin, TestCase):
- @classmethod
- def setUpTestData(cls):
- cls.form = FormFactory.create(
- generate_minimal_setup=True,
- authentication_backends=["eherkenning_bewindvoering_oidc"],
- )
-
- def setUp(self):
- super().setUp()
-
- self.requests_mocker = requests_mock.Mocker()
- self.addCleanup(self.requests_mocker.stop)
- self.requests_mocker.start()
-
- def test_redirect_to_eherkenning_bewindvoering_oidc(self):
- self.requests_mocker.get(
- "http://provider.com/auth/realms/master/protocol/openid-connect/auth",
- status_code=200,
- )
- form_url = get_start_form_url(self.form)
- start_url = get_start_url(self.form, plugin_id="eherkenning_bewindvoering_oidc")
-
- response = self.client.get(start_url)
-
- with self.subTest("Sends user to IdP"):
- self.assertEqual(status.HTTP_302_FOUND, response.status_code)
-
- redirect_target = furl(response.url) # type: ignore
- query_params = redirect_target.query.params
-
- self.assertEqual(redirect_target.host, "provider.com")
- self.assertEqual(
- redirect_target.path,
- "/auth/realms/master/protocol/openid-connect/auth",
- )
- self.assertEqual(query_params["scope"], "openid bsn")
- self.assertEqual(query_params["client_id"], "testclient")
- self.assertEqual(
- query_params["redirect_uri"],
- f"http://testserver{reverse('eherkenning_bewindvoering_oidc:oidc_authentication_callback')}",
- )
-
- with self.subTest("Return state setup"):
- oidc_login_next = furl(self.client.session["oidc_login_next"])
- query_params = oidc_login_next.query.params
-
- self.assertEqual(
- oidc_login_next.path,
- reverse(
- "authentication:return",
- kwargs={
- "slug": self.form.slug,
- "plugin_id": "eherkenning_bewindvoering_oidc",
- },
- ),
- )
- self.assertEqual(query_params["next"], form_url)
-
- def test_redirect_to_eherkenning_bewindvoering_oidc_internal_server_error(self):
- self.requests_mocker.get(
- "http://provider.com/auth/realms/master/protocol/openid-connect/auth",
- status_code=500,
- )
- start_url = get_start_url(self.form, plugin_id="eherkenning_bewindvoering_oidc")
-
- response = self.client.get(start_url)
-
- self.assertEqual(status.HTTP_302_FOUND, response.status_code)
- assert self.requests_mocker.last_request is not None
- self.assertEqual(
- self.requests_mocker.last_request.url,
- "http://provider.com/auth/realms/master/protocol/openid-connect/auth",
- )
- parsed = furl(response.url) # type: ignore
-
- self.assertEqual(parsed.host, "testserver")
- self.assertEqual(parsed.path, f"/{self.form.slug}/")
- query_params = parsed.query.params
- self.assertEqual(
- query_params[BACKEND_OUTAGE_RESPONSE_PARAMETER],
- "eherkenning_bewindvoering_oidc",
- )
-
- def test_redirect_to_eherkenning_bewindvoering_oidc_callback_error(self):
- # set up session/state
- self.requests_mocker.get(
- "http://provider.com/auth/realms/master/protocol/openid-connect/auth",
- status_code=200,
- )
- start_url = get_start_url(self.form, plugin_id="eherkenning_bewindvoering_oidc")
- response = self.client.get(start_url)
- assert response.status_code == 302
- assert response.url.startswith("http://provider.com") # type: ignore
-
- with patch(
- "openforms.authentication.contrib.digid_eherkenning_oidc.backends"
- ".OIDCAuthenticationEHerkenningBewindvoeringBackend.verify_claims",
- return_value=False,
- ):
- response = self.client.get(
- reverse("eherkenning_bewindvoering_oidc:callback")
- )
-
- self.assertEqual(response.status_code, status.HTTP_302_FOUND)
-
- parsed = furl(response.url)
- query_params = parsed.query.params
-
- self.assertEqual(parsed.path, f"/{self.form.slug}/")
- self.assertEqual(query_params["_start"], "1")
- self.assertEqual(
- query_params[BACKEND_OUTAGE_RESPONSE_PARAMETER],
- "eherkenning_bewindvoering_oidc",
- )
-
- @override_settings(CORS_ALLOW_ALL_ORIGINS=False, CORS_ALLOWED_ORIGINS=[])
- def test_redirect_to_disallowed_domain(self):
- start_url = get_start_url(
- self.form,
- plugin_id="eherkenning_bewindvoering_oidc",
- host="http://example.com",
- )
-
- response = self.client.get(start_url)
-
- self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
-
- @override_settings(
- CORS_ALLOW_ALL_ORIGINS=False, CORS_ALLOWED_ORIGINS=["http://example.com"]
- )
- def test_redirect_to_allowed_domain(self):
- self.requests_mocker.get(
- "http://provider.com/auth/realms/master/protocol/openid-connect/auth",
- status_code=200,
- )
- form_url = get_start_form_url(self.form, host="http://example.com")
- start_url = get_start_url(
- self.form,
- plugin_id="eherkenning_bewindvoering_oidc",
- host="http://example.com",
- )
-
- response = self.client.get(start_url)
-
- with self.subTest("Sends user to IdP"):
- self.assertEqual(status.HTTP_302_FOUND, response.status_code)
- self.assertTrue(response.url.startswith("http://provider.com/")) # type: ignore
-
- with self.subTest("Return state setup"):
- oidc_login_next = furl(self.client.session["oidc_login_next"])
- expected_next = reverse(
- "authentication:return",
- kwargs={
- "slug": self.form.slug,
- "plugin_id": "eherkenning_bewindvoering_oidc",
- },
- )
- self.assertEqual(oidc_login_next.path, expected_next)
- query_params = oidc_login_next.query.params
- self.assertEqual(query_params["next"], form_url)
-
- def test_redirect_with_keycloak_identity_provider_hint(self):
- self.mock_config.return_value.oidc_keycloak_idp_hint = "oidc-eHerkenning-bewind"
- self.requests_mocker.get(
- "http://provider.com/auth/realms/master/protocol/openid-connect/auth",
- status_code=200,
- )
- start_url = get_start_url(self.form, plugin_id="eherkenning_bewindvoering_oidc")
-
- response = self.client.get(start_url)
-
- self.assertEqual(status.HTTP_302_FOUND, response.status_code)
- parsed = furl(response.url) # type: ignore
- query_params = parsed.query.params
- self.assertEqual(query_params["kc_idp_hint"], "oidc-eHerkenning-bewind")
-
-
-class AddClaimsToSessionTests(MockConfigMixin, TestCase):
- def test_handle_return_without_claim_eherkenning_bewindvoering(self):
- factory = APIRequestFactory()
- request = factory.get("/xyz")
- request.session = {} # type: ignore
-
- plugin = EHerkenningBewindvoeringOIDCAuthentication(identifier="boh")
- plugin.add_claims_to_sessions_if_not_cosigning(claim="", request=request)
-
- self.assertNotIn(FORM_AUTH_SESSION_KEY, request.session)
-
- def test_handle_return_with_cosign_param_eherkenning_bewindvoering(self):
- factory = APIRequestFactory()
- request = factory.get(f"/xyz?{CO_SIGN_PARAMETER}=tralala")
- request.session = {} # type: ignore
-
- plugin = EHerkenningBewindvoeringOIDCAuthentication(identifier="boh")
- plugin.add_claims_to_sessions_if_not_cosigning(claim="tralala", request=request)
-
- self.assertNotIn(FORM_AUTH_SESSION_KEY, request.session)
-
- def test_handle_return_eherkenning_bewindvoering(self):
- factory = APIRequestFactory()
- request = factory.get("/xyz")
- request.session = { # type: ignore
- EHERKENNING_BEWINDVOERING_OIDC_AUTH_SESSION_KEY: {
- "aanvrager.bsn": "222222222"
- }
- }
-
- plugin = EHerkenningBewindvoeringOIDCAuthentication(identifier="boh")
-
- with patch(
- "openforms.authentication.contrib.digid_eherkenning_oidc.plugin.OpenIDConnectEHerkenningBewindvoeringConfig.get_solo",
- return_value=OpenIDConnectEHerkenningBewindvoeringConfig(
- vertegenwoordigde_company_claim_name="gemachtige.kvk",
- gemachtigde_person_claim_name="aanvrager.bsn",
- ),
- ):
- plugin.add_claims_to_sessions_if_not_cosigning(
- claim={
- "gemachtige.kvk": "111111111",
- },
- request=request,
- )
-
- self.assertIn(FORM_AUTH_SESSION_KEY, request.session)
- self.assertEqual(
- {
- "plugin": "boh",
- "attribute": AuthAttribute.kvk,
- "value": "111111111",
- "machtigen": {"identifier_value": "222222222"},
- },
- request.session[FORM_AUTH_SESSION_KEY],
- )
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/test_admin.py b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/test_admin.py
new file mode 100644
index 0000000000..ab07612aea
--- /dev/null
+++ b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/test_admin.py
@@ -0,0 +1,260 @@
+import json
+
+from django.contrib.postgres.fields import ArrayField
+from django.db import models
+from django.test import override_settings
+from django.urls import reverse_lazy
+
+from django_webtest import WebTest
+from maykin_2fa.test import disable_admin_mfa
+
+from openforms.accounts.tests.factories import SuperUserFactory
+from openforms.forms.tests.factories import FormFactory
+
+from ..models import (
+ OFDigiDConfig,
+ OFDigiDMachtigenConfig,
+ OFEHerkenningBewindvoeringConfig,
+ OFEHerkenningConfig,
+)
+
+
+# disable django solo cache to prevent test isolation breakage
+@override_settings(SOLO_CACHE=None)
+@disable_admin_mfa()
+class AdminTestsBase(WebTest):
+ pass
+
+
+def _set_arrayfields(form, config: type[models.Model]) -> None:
+ """
+ Set the field values manually, normally this is done through JS in the admin.
+ """
+ fields = [f.name for f in config._meta.get_fields() if isinstance(f, ArrayField)]
+ for field in fields:
+ form[field] = json.dumps(getattr(config, field))
+
+
+class DigiDConfigAdminTests(AdminTestsBase):
+ CHANGE_PAGE_URL = reverse_lazy("admin:digid_eherkenning_oidc_ofdigidconfig_change")
+
+ @classmethod
+ def setUpTestData(cls):
+ super().setUpTestData()
+
+ # minimal configuration to pass form validation & not do network IO
+ cls.config = config = OFDigiDConfig(
+ enabled=True,
+ oidc_rp_client_id="testclient",
+ oidc_rp_client_secret="secret",
+ oidc_op_authorization_endpoint="http://localhost/oidc/auth",
+ oidc_op_token_endpoint="http://localhost/oidc/token",
+ oidc_op_user_endpoint="http://localhost/oidc/userinfo",
+ oidc_op_logout_endpoint="http://localhost/oidc/logout",
+ )
+ config.save()
+ cls.user = SuperUserFactory.create()
+
+ def test_can_disable_backend_iff_unused_in_forms(self):
+ FormFactory.create(authentication_backends=["other-backend"])
+ change_page = self.app.get(self.CHANGE_PAGE_URL, user=self.user)
+
+ form = change_page.forms["ofdigidconfig_form"]
+ _set_arrayfields(form, self.config)
+
+ # disable the backend
+ form["enabled"] = False
+ response = form.submit()
+
+ self.assertEqual(response.status_code, 302)
+ self.config.refresh_from_db()
+ self.assertFalse(self.config.enabled)
+
+ def test_cannot_disable_backend_if_used_in_any_form(self):
+ FormFactory.create(authentication_backends=["digid_oidc"])
+ change_page = self.app.get(self.CHANGE_PAGE_URL, user=self.user)
+
+ form = change_page.forms["ofdigidconfig_form"]
+ _set_arrayfields(form, self.config)
+
+ # disable the backend
+ form["enabled"] = False
+ response = form.submit()
+
+ self.assertEqual(response.status_code, 200) # there are validation errors
+ self.config.refresh_from_db()
+ self.assertTrue(self.config.enabled)
+
+ def test_leave_enabled(self):
+ FormFactory.create(authentication_backends=["other-backend"])
+ change_page = self.app.get(self.CHANGE_PAGE_URL, user=self.user)
+
+ form = change_page.forms["ofdigidconfig_form"]
+ _set_arrayfields(form, self.config)
+
+ # enable the backend
+ form["enabled"] = True
+ response = form.submit()
+
+ self.assertEqual(response.status_code, 302)
+ self.config.refresh_from_db()
+ self.assertTrue(self.config.enabled)
+
+
+class DigiDMachtigenConfigAdminTests(AdminTestsBase):
+ CHANGE_PAGE_URL = reverse_lazy(
+ "admin:digid_eherkenning_oidc_ofdigidmachtigenconfig_change"
+ )
+
+ @classmethod
+ def setUpTestData(cls):
+ super().setUpTestData()
+
+ # minimal configuration to pass form validation & not do network IO
+ cls.config = config = OFDigiDMachtigenConfig(
+ enabled=True,
+ oidc_rp_client_id="testclient",
+ oidc_rp_client_secret="secret",
+ oidc_op_authorization_endpoint="http://localhost/oidc/auth",
+ oidc_op_token_endpoint="http://localhost/oidc/token",
+ oidc_op_user_endpoint="http://localhost/oidc/userinfo",
+ oidc_op_logout_endpoint="http://localhost/oidc/logout",
+ )
+ config.save()
+ cls.user = SuperUserFactory.create()
+
+ def test_can_disable_backend_iff_unused_in_forms(self):
+ FormFactory.create(authentication_backends=["other-backend"])
+ change_page = self.app.get(self.CHANGE_PAGE_URL, user=self.user)
+
+ form = change_page.forms["ofdigidmachtigenconfig_form"]
+ _set_arrayfields(form, self.config)
+
+ # disable the backend
+ form["enabled"] = False
+ response = form.submit()
+
+ self.assertEqual(response.status_code, 302)
+ self.config.refresh_from_db()
+ self.assertFalse(self.config.enabled)
+
+ def test_cannot_disable_backend_if_used_in_any_form(self):
+ FormFactory.create(authentication_backends=["digid_machtigen_oidc"])
+ change_page = self.app.get(self.CHANGE_PAGE_URL, user=self.user)
+
+ form = change_page.forms["ofdigidmachtigenconfig_form"]
+ _set_arrayfields(form, self.config)
+
+ # disable the backend
+ form["enabled"] = False
+ response = form.submit()
+
+ self.assertEqual(response.status_code, 200) # there are validation errors
+ self.config.refresh_from_db()
+ self.assertTrue(self.config.enabled)
+
+
+class EHerkenningConfigAdminTests(AdminTestsBase):
+ CHANGE_PAGE_URL = reverse_lazy(
+ "admin:digid_eherkenning_oidc_ofeherkenningconfig_change"
+ )
+
+ @classmethod
+ def setUpTestData(cls):
+ super().setUpTestData()
+
+ # minimal configuration to pass form validation & not do network IO
+ cls.config = config = OFEHerkenningConfig(
+ enabled=True,
+ oidc_rp_client_id="testclient",
+ oidc_rp_client_secret="secret",
+ oidc_op_authorization_endpoint="http://localhost/oidc/auth",
+ oidc_op_token_endpoint="http://localhost/oidc/token",
+ oidc_op_user_endpoint="http://localhost/oidc/userinfo",
+ oidc_op_logout_endpoint="http://localhost/oidc/logout",
+ )
+ config.save()
+ cls.user = SuperUserFactory.create()
+
+ def test_can_disable_backend_iff_unused_in_forms(self):
+ FormFactory.create(authentication_backends=["other-backend"])
+ change_page = self.app.get(self.CHANGE_PAGE_URL, user=self.user)
+
+ form = change_page.forms["ofeherkenningconfig_form"]
+ _set_arrayfields(form, self.config)
+
+ # disable the backend
+ form["enabled"] = False
+ response = form.submit()
+
+ self.assertEqual(response.status_code, 302)
+ self.config.refresh_from_db()
+ self.assertFalse(self.config.enabled)
+
+ def test_cannot_disable_backend_if_used_in_any_form(self):
+ FormFactory.create(authentication_backends=["eherkenning_oidc"])
+ change_page = self.app.get(self.CHANGE_PAGE_URL, user=self.user)
+
+ form = change_page.forms["ofeherkenningconfig_form"]
+ _set_arrayfields(form, self.config)
+
+ # disable the backend
+ form["enabled"] = False
+ response = form.submit()
+
+ self.assertEqual(response.status_code, 200) # there are validation errors
+ self.config.refresh_from_db()
+ self.assertTrue(self.config.enabled)
+
+
+class EHerkenningBewindvoeringConfigAdminTests(AdminTestsBase):
+ CHANGE_PAGE_URL = reverse_lazy(
+ "admin:digid_eherkenning_oidc_ofeherkenningbewindvoeringconfig_change"
+ )
+
+ @classmethod
+ def setUpTestData(cls):
+ super().setUpTestData()
+
+ # minimal configuration to pass form validation & not do network IO
+ cls.config = config = OFEHerkenningBewindvoeringConfig(
+ enabled=True,
+ oidc_rp_client_id="testclient",
+ oidc_rp_client_secret="secret",
+ oidc_op_authorization_endpoint="http://localhost/oidc/auth",
+ oidc_op_token_endpoint="http://localhost/oidc/token",
+ oidc_op_user_endpoint="http://localhost/oidc/userinfo",
+ oidc_op_logout_endpoint="http://localhost/oidc/logout",
+ )
+ config.save()
+ cls.user = SuperUserFactory.create()
+
+ def test_can_disable_backend_iff_unused_in_forms(self):
+ FormFactory.create(authentication_backends=["other-backend"])
+ change_page = self.app.get(self.CHANGE_PAGE_URL, user=self.user)
+
+ form = change_page.forms["ofeherkenningbewindvoeringconfig_form"]
+ _set_arrayfields(form, self.config)
+
+ # disable the backend
+ form["enabled"] = False
+ response = form.submit()
+
+ self.assertEqual(response.status_code, 302)
+ self.config.refresh_from_db()
+ self.assertFalse(self.config.enabled)
+
+ def test_cannot_disable_backend_if_used_in_any_form(self):
+ FormFactory.create(authentication_backends=["eherkenning_bewindvoering_oidc"])
+ change_page = self.app.get(self.CHANGE_PAGE_URL, user=self.user)
+
+ form = change_page.forms["ofeherkenningbewindvoeringconfig_form"]
+ _set_arrayfields(form, self.config)
+
+ # disable the backend
+ form["enabled"] = False
+ response = form.submit()
+
+ self.assertEqual(response.status_code, 200) # there are validation errors
+ self.config.refresh_from_db()
+ self.assertTrue(self.config.enabled)
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/test_auth_flow_callbacks.py b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/test_auth_flow_callbacks.py
new file mode 100644
index 0000000000..96ae0969ca
--- /dev/null
+++ b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/test_auth_flow_callbacks.py
@@ -0,0 +1,486 @@
+"""
+Test the authentication flow for a form.
+
+These tests use VCR. When re-recording, making sure to:
+
+.. code-block:: bash
+
+ cd docker
+ docker compose -f docker-compose.keycloak.yml up
+
+to bring up a Keycloak instance.
+"""
+
+from django.test import tag
+
+import requests
+from furl import furl
+
+from openforms.accounts.tests.factories import StaffUserFactory
+from openforms.authentication.constants import FORM_AUTH_SESSION_KEY
+from openforms.authentication.tests.utils import URLsHelper
+from openforms.authentication.views import BACKEND_OUTAGE_RESPONSE_PARAMETER
+from openforms.forms.tests.factories import FormFactory
+from openforms.utils.tests.keycloak import keycloak_login
+
+from .base import (
+ IntegrationTestsBase,
+ mock_digid_config,
+ mock_digid_machtigen_config,
+ mock_eherkenning_bewindvoering_config,
+ mock_eherkenning_config,
+)
+
+
+class DigiDCallbackTests(IntegrationTestsBase):
+ """
+ Test the return/callback side after authenticating with the identity provider.
+ """
+
+ @mock_digid_config()
+ def test_redirects_after_successful_auth(self):
+ form = FormFactory.create(authentication_backends=["digid_oidc"])
+ url_helper = URLsHelper(form=form)
+ start_url = url_helper.get_auth_start(plugin_id="digid_oidc")
+ start_response = self.app.get(start_url)
+
+ # simulate login to Keycloak
+ redirect_uri = keycloak_login(start_response["Location"])
+
+ # complete the login flow on our end
+ callback_response = self.app.get(redirect_uri, auto_follow=True)
+
+ self.assertEqual(callback_response.request.url, url_helper.frontend_start)
+
+ @mock_digid_config(bsn_claim="absent-claim")
+ def test_failing_claim_verification(self):
+ form = FormFactory.create(authentication_backends=["digid_oidc"])
+ url_helper = URLsHelper(form=form)
+ start_url = url_helper.get_auth_start(plugin_id="digid_oidc")
+ start_response = self.app.get(start_url)
+ # simulate login to Keycloak
+ redirect_uri = keycloak_login(start_response["Location"])
+
+ # complete the login flow on our end
+ callback_response = self.app.get(redirect_uri, auto_follow=True)
+
+ # XXX: shouldn't this be "digid" so that the correct error message is rendered?
+ # Query: ?_digid-message=error
+ expected_url = furl(url_helper.frontend_start).add(
+ {BACKEND_OUTAGE_RESPONSE_PARAMETER: "digid_oidc"}
+ )
+ self.assertEqual(callback_response.request.url, str(expected_url))
+ self.assertNotIn(FORM_AUTH_SESSION_KEY, self.app.session)
+
+ @tag("gh-3656", "gh-3692")
+ @mock_digid_config(oidc_rp_scopes_list=["badscope"])
+ def test_digid_error_reported_for_cancelled_login_anon_django_user(self):
+ form = FormFactory.create(authentication_backends=["digid_oidc"])
+ url_helper = URLsHelper(form=form)
+ start_url = url_helper.get_auth_start(plugin_id="digid_oidc")
+ # initialize state, but don't actually log in - we have an invalid config and
+ # keycloak redirects back to our callback URL with error parameters.
+ start_response = self.app.get(start_url)
+ auth_response = requests.get(start_response["Location"], allow_redirects=False)
+ # check out assumptions/expectations before proceeding
+ callback_url = furl(auth_response.headers["Location"])
+ assert callback_url.netloc == "testserver"
+ assert "state" in callback_url.args
+ # modify the error parameters - there doesn't seem to be an obvious way to trigger
+ # this via keycloak itself.
+ # Note: this is an example of a specific provider. It may differ when a
+ # different provider is used. According to
+ # https://openid.net/specs/openid-connect-core-1_0.html#AuthError and
+ # https://www.rfc-editor.org/rfc/rfc6749.html#section-4.1.2.1 , this is the
+ # error we expect from OIDC.
+ callback_url.args.update(
+ {"error": "access_denied", "error_description": "The user cancelled"}
+ )
+
+ callback_response = self.app.get(str(callback_url), auto_follow=True)
+
+ self.assertEqual(callback_response.status_code, 200)
+ expected_url = furl(url_helper.frontend_start).add(
+ {"_digid-message": "login-cancelled"}
+ )
+ assert BACKEND_OUTAGE_RESPONSE_PARAMETER not in expected_url.args
+ self.assertEqual(callback_response.request.url, str(expected_url))
+
+ @tag("gh-3656", "gh-3692")
+ @mock_digid_config(oidc_rp_scopes_list=["badscope"])
+ def test_digid_error_reported_for_cancelled_login_with_staff_django_user(self):
+ self.app.set_user(StaffUserFactory.create())
+ form = FormFactory.create(authentication_backends=["digid_oidc"])
+ url_helper = URLsHelper(form=form)
+ start_url = url_helper.get_auth_start(plugin_id="digid_oidc")
+ # initialize state, but don't actually log in - we have an invalid config and
+ # keycloak redirects back to our callback URL with error parameters.
+ start_response = self.app.get(start_url)
+ auth_response = requests.get(start_response["Location"], allow_redirects=False)
+ # check out assumptions/expectations before proceeding
+ callback_url = furl(auth_response.headers["Location"])
+ assert callback_url.netloc == "testserver"
+ assert "state" in callback_url.args
+ callback_url.args.update(
+ {"error": "access_denied", "error_description": "The user cancelled"}
+ )
+
+ callback_response = self.app.get(str(callback_url), auto_follow=True)
+
+ self.assertEqual(callback_response.status_code, 200)
+ expected_url = furl(url_helper.frontend_start).add(
+ {"_digid-message": "login-cancelled"}
+ )
+ assert BACKEND_OUTAGE_RESPONSE_PARAMETER not in expected_url.args
+ self.assertEqual(callback_response.request.url, str(expected_url))
+
+
+class EHerkenningCallbackTests(IntegrationTestsBase):
+ """
+ Test the return/callback side after authenticating with the identity provider.
+ """
+
+ @mock_eherkenning_config()
+ def test_redirects_after_successful_auth(self):
+ form = FormFactory.create(authentication_backends=["eherkenning_oidc"])
+ url_helper = URLsHelper(form=form)
+ start_url = url_helper.get_auth_start(plugin_id="eherkenning_oidc")
+ start_response = self.app.get(start_url)
+
+ # simulate login to Keycloak
+ redirect_uri = keycloak_login(start_response["Location"])
+
+ # complete the login flow on our end
+ callback_response = self.app.get(redirect_uri, auto_follow=True)
+
+ self.assertEqual(callback_response.request.url, url_helper.frontend_start)
+
+ @mock_eherkenning_config(legal_subject_claim="absent-claim")
+ def test_failing_claim_verification(self):
+ form = FormFactory.create(authentication_backends=["eherkenning_oidc"])
+ url_helper = URLsHelper(form=form)
+ start_url = url_helper.get_auth_start(plugin_id="eherkenning_oidc")
+ start_response = self.app.get(start_url)
+ # simulate login to Keycloak
+ redirect_uri = keycloak_login(start_response["Location"])
+
+ # complete the login flow on our end
+ callback_response = self.app.get(redirect_uri, auto_follow=True)
+
+ # XXX: shouldn't this be "eherkenning" so that the correct error message is rendered?
+ # Query: ?_eherkenning-message=error
+ expected_url = furl(url_helper.frontend_start).add(
+ {BACKEND_OUTAGE_RESPONSE_PARAMETER: "eherkenning_oidc"}
+ )
+ self.assertEqual(callback_response.request.url, str(expected_url))
+ self.assertNotIn(FORM_AUTH_SESSION_KEY, self.app.session)
+
+ @tag("gh-3656", "gh-3692")
+ @mock_eherkenning_config(oidc_rp_scopes_list=["badscope"])
+ def test_eherkenning_error_reported_for_cancelled_login_anon_django_user(self):
+ form = FormFactory.create(authentication_backends=["eherkenning_oidc"])
+ url_helper = URLsHelper(form=form)
+ start_url = url_helper.get_auth_start(plugin_id="eherkenning_oidc")
+ # initialize state, but don't actually log in - we have an invalid config and
+ # keycloak redirects back to our callback URL with error parameters.
+ start_response = self.app.get(start_url)
+ auth_response = requests.get(start_response["Location"], allow_redirects=False)
+ # check out assumptions/expectations before proceeding
+ callback_url = furl(auth_response.headers["Location"])
+ assert callback_url.netloc == "testserver"
+ assert "state" in callback_url.args
+ # modify the error parameters - there doesn't seem to be an obvious way to trigger
+ # this via keycloak itself.
+ # Note: this is an example of a specific provider. It may differ when a
+ # different provider is used. According to
+ # https://openid.net/specs/openid-connect-core-1_0.html#AuthError and
+ # https://www.rfc-editor.org/rfc/rfc6749.html#section-4.1.2.1 , this is the
+ # error we expect from OIDC.
+ callback_url.args.update(
+ {"error": "access_denied", "error_description": "The user cancelled"}
+ )
+
+ callback_response = self.app.get(str(callback_url), auto_follow=True)
+
+ self.assertEqual(callback_response.status_code, 200)
+ expected_url = furl(url_helper.frontend_start).add(
+ {"_eherkenning-message": "login-cancelled"}
+ )
+ assert BACKEND_OUTAGE_RESPONSE_PARAMETER not in expected_url.args
+ self.assertEqual(callback_response.request.url, str(expected_url))
+
+ @tag("gh-3656", "gh-3692")
+ @mock_eherkenning_config(oidc_rp_scopes_list=["badscope"])
+ def test_eherkenning_error_reported_for_cancelled_login_with_staff_django_user(
+ self,
+ ):
+ self.app.set_user(StaffUserFactory.create())
+ form = FormFactory.create(authentication_backends=["eherkenning_oidc"])
+ url_helper = URLsHelper(form=form)
+ start_url = url_helper.get_auth_start(plugin_id="eherkenning_oidc")
+ # initialize state, but don't actually log in - we have an invalid config and
+ # keycloak redirects back to our callback URL with error parameters.
+ start_response = self.app.get(start_url)
+ auth_response = requests.get(start_response["Location"], allow_redirects=False)
+ # check out assumptions/expectations before proceeding
+ callback_url = furl(auth_response.headers["Location"])
+ assert callback_url.netloc == "testserver"
+ assert "state" in callback_url.args
+ callback_url.args.update(
+ {"error": "access_denied", "error_description": "The user cancelled"}
+ )
+
+ callback_response = self.app.get(str(callback_url), auto_follow=True)
+
+ self.assertEqual(callback_response.status_code, 200)
+ expected_url = furl(url_helper.frontend_start).add(
+ {"_eherkenning-message": "login-cancelled"}
+ )
+ assert BACKEND_OUTAGE_RESPONSE_PARAMETER not in expected_url.args
+ self.assertEqual(callback_response.request.url, str(expected_url))
+
+
+class DigiDMachtigenCallbackTests(IntegrationTestsBase):
+ """
+ Test the return/callback side after authenticating with the identity provider.
+ """
+
+ @mock_digid_machtigen_config()
+ def test_redirects_after_successful_auth(self):
+ form = FormFactory.create(authentication_backends=["digid_machtigen_oidc"])
+ url_helper = URLsHelper(form=form)
+ start_url = url_helper.get_auth_start(plugin_id="digid_machtigen_oidc")
+ start_response = self.app.get(start_url)
+
+ # simulate login to Keycloak
+ redirect_uri = keycloak_login(
+ start_response["Location"],
+ username="digid-machtigen",
+ password="digid-machtigen",
+ )
+
+ # complete the login flow on our end
+ callback_response = self.app.get(redirect_uri, auto_follow=True)
+
+ self.assertEqual(callback_response.request.url, url_helper.frontend_start)
+
+ @mock_digid_machtigen_config(
+ representee_bsn_claim="absent-claim",
+ authorizee_bsn_claim="absent-claim",
+ )
+ def test_failing_claim_verification(self):
+ form = FormFactory.create(authentication_backends=["digid_machtigen_oidc"])
+ url_helper = URLsHelper(form=form)
+ start_url = url_helper.get_auth_start(plugin_id="digid_machtigen_oidc")
+ start_response = self.app.get(start_url)
+ # simulate login to Keycloak
+ redirect_uri = keycloak_login(
+ start_response["Location"],
+ username="digid-machtigen",
+ password="digid-machtigen",
+ )
+
+ # complete the login flow on our end
+ callback_response = self.app.get(redirect_uri, auto_follow=True)
+
+ # XXX: shouldn't this be "digid" so that the correct error message is rendered?
+ # Query: ?_digid-message=error
+ expected_url = furl(url_helper.frontend_start).add(
+ {BACKEND_OUTAGE_RESPONSE_PARAMETER: "digid_machtigen_oidc"}
+ )
+ self.assertEqual(callback_response.request.url, str(expected_url))
+ self.assertNotIn(FORM_AUTH_SESSION_KEY, self.app.session)
+
+ @tag("gh-3656", "gh-3692")
+ @mock_digid_machtigen_config(oidc_rp_scopes_list=["badscope"])
+ def test_digid_error_reported_for_cancelled_login_anon_django_user(self):
+ form = FormFactory.create(authentication_backends=["digid_machtigen_oidc"])
+ url_helper = URLsHelper(form=form)
+ start_url = url_helper.get_auth_start(plugin_id="digid_machtigen_oidc")
+ # initialize state, but don't actually log in - we have an invalid config and
+ # keycloak redirects back to our callback URL with error parameters.
+ start_response = self.app.get(start_url)
+ auth_response = requests.get(start_response["Location"], allow_redirects=False)
+ # check out assumptions/expectations before proceeding
+ callback_url = furl(auth_response.headers["Location"])
+ assert callback_url.netloc == "testserver"
+ assert "state" in callback_url.args
+ # modify the error parameters - there doesn't seem to be an obvious way to trigger
+ # this via keycloak itself.
+ # Note: this is an example of a specific provider. It may differ when a
+ # different provider is used. According to
+ # https://openid.net/specs/openid-connect-core-1_0.html#AuthError and
+ # https://www.rfc-editor.org/rfc/rfc6749.html#section-4.1.2.1 , this is the
+ # error we expect from OIDC.
+ callback_url.args.update(
+ {"error": "access_denied", "error_description": "The user cancelled"}
+ )
+
+ callback_response = self.app.get(str(callback_url), auto_follow=True)
+
+ self.assertEqual(callback_response.status_code, 200)
+ expected_url = furl(url_helper.frontend_start).add(
+ {"_digid-message": "login-cancelled"}
+ )
+ assert BACKEND_OUTAGE_RESPONSE_PARAMETER not in expected_url.args
+ self.assertEqual(callback_response.request.url, str(expected_url))
+
+ @tag("gh-3656", "gh-3692")
+ @mock_digid_machtigen_config(oidc_rp_scopes_list=["badscope"])
+ def test_digid_error_reported_for_cancelled_login_with_staff_django_user(self):
+ self.app.set_user(StaffUserFactory.create())
+ form = FormFactory.create(authentication_backends=["digid_machtigen_oidc"])
+ url_helper = URLsHelper(form=form)
+ start_url = url_helper.get_auth_start(plugin_id="digid_machtigen_oidc")
+ # initialize state, but don't actually log in - we have an invalid config and
+ # keycloak redirects back to our callback URL with error parameters.
+ start_response = self.app.get(start_url)
+ auth_response = requests.get(start_response["Location"], allow_redirects=False)
+ # check out assumptions/expectations before proceeding
+ callback_url = furl(auth_response.headers["Location"])
+ assert callback_url.netloc == "testserver"
+ assert "state" in callback_url.args
+ callback_url.args.update(
+ {"error": "access_denied", "error_description": "The user cancelled"}
+ )
+
+ callback_response = self.app.get(str(callback_url), auto_follow=True)
+
+ self.assertEqual(callback_response.status_code, 200)
+ expected_url = furl(url_helper.frontend_start).add(
+ {"_digid-message": "login-cancelled"}
+ )
+ assert BACKEND_OUTAGE_RESPONSE_PARAMETER not in expected_url.args
+ self.assertEqual(callback_response.request.url, str(expected_url))
+
+
+class EHerkenningBewindvoeringCallbackTests(IntegrationTestsBase):
+ """
+ Test the return/callback side after authenticating with the identity provider.
+ """
+
+ @mock_eherkenning_bewindvoering_config()
+ def test_redirects_after_successful_auth(self):
+ form = FormFactory.create(
+ authentication_backends=["eherkenning_bewindvoering_oidc"]
+ )
+ url_helper = URLsHelper(form=form)
+ start_url = url_helper.get_auth_start(
+ plugin_id="eherkenning_bewindvoering_oidc"
+ )
+ start_response = self.app.get(start_url)
+
+ # simulate login to Keycloak
+ redirect_uri = keycloak_login(
+ start_response["Location"],
+ username="eherkenning-bewindvoering",
+ password="eherkenning-bewindvoering",
+ )
+
+ # complete the login flow on our end
+ callback_response = self.app.get(redirect_uri, auto_follow=True)
+
+ self.assertEqual(callback_response.request.url, url_helper.frontend_start)
+
+ @mock_eherkenning_bewindvoering_config(
+ legal_subject_claim="absent-claim",
+ representee_claim="absent-claim",
+ )
+ def test_failing_claim_verification(self):
+ form = FormFactory.create(
+ authentication_backends=["eherkenning_bewindvoering_oidc"]
+ )
+ url_helper = URLsHelper(form=form)
+ start_url = url_helper.get_auth_start(
+ plugin_id="eherkenning_bewindvoering_oidc"
+ )
+ start_response = self.app.get(start_url)
+ # simulate login to Keycloak
+ redirect_uri = keycloak_login(
+ start_response["Location"],
+ username="eherkenning-bewindvoering",
+ password="eherkenning-bewindvoering",
+ )
+
+ # complete the login flow on our end
+ callback_response = self.app.get(redirect_uri, auto_follow=True)
+
+ # XXX: shouldn't this be "eherkenning" so that the correct error message is rendered?
+ # Query: ?_eherkenning-message=error
+ expected_url = furl(url_helper.frontend_start).add(
+ {BACKEND_OUTAGE_RESPONSE_PARAMETER: "eherkenning_bewindvoering_oidc"}
+ )
+ self.assertEqual(callback_response.request.url, str(expected_url))
+ self.assertNotIn(FORM_AUTH_SESSION_KEY, self.app.session)
+
+ @tag("gh-3656", "gh-3692")
+ @mock_eherkenning_bewindvoering_config(oidc_rp_scopes_list=["badscope"])
+ def test_eherkenning_error_reported_for_cancelled_login_anon_django_user(self):
+ form = FormFactory.create(
+ authentication_backends=["eherkenning_bewindvoering_oidc"]
+ )
+ url_helper = URLsHelper(form=form)
+ start_url = url_helper.get_auth_start(
+ plugin_id="eherkenning_bewindvoering_oidc"
+ )
+ # initialize state, but don't actually log in - we have an invalid config and
+ # keycloak redirects back to our callback URL with error parameters.
+ start_response = self.app.get(start_url)
+ auth_response = requests.get(start_response["Location"], allow_redirects=False)
+ # check out assumptions/expectations before proceeding
+ callback_url = furl(auth_response.headers["Location"])
+ assert callback_url.netloc == "testserver"
+ assert "state" in callback_url.args
+ # modify the error parameters - there doesn't seem to be an obvious way to trigger
+ # this via keycloak itself.
+ # Note: this is an example of a specific provider. It may differ when a
+ # different provider is used. According to
+ # https://openid.net/specs/openid-connect-core-1_0.html#AuthError and
+ # https://www.rfc-editor.org/rfc/rfc6749.html#section-4.1.2.1 , this is the
+ # error we expect from OIDC.
+ callback_url.args.update(
+ {"error": "access_denied", "error_description": "The user cancelled"}
+ )
+
+ callback_response = self.app.get(str(callback_url), auto_follow=True)
+
+ self.assertEqual(callback_response.status_code, 200)
+ expected_url = furl(url_helper.frontend_start).add(
+ {"_eherkenning-message": "login-cancelled"}
+ )
+ assert BACKEND_OUTAGE_RESPONSE_PARAMETER not in expected_url.args
+ self.assertEqual(callback_response.request.url, str(expected_url))
+
+ @tag("gh-3656", "gh-3692")
+ @mock_eherkenning_bewindvoering_config(oidc_rp_scopes_list=["badscope"])
+ def test_eherkenning_error_reported_for_cancelled_login_with_staff_django_user(
+ self,
+ ):
+ self.app.set_user(StaffUserFactory.create())
+ form = FormFactory.create(
+ authentication_backends=["eherkenning_bewindvoering_oidc"]
+ )
+ url_helper = URLsHelper(form=form)
+ start_url = url_helper.get_auth_start(
+ plugin_id="eherkenning_bewindvoering_oidc"
+ )
+ # initialize state, but don't actually log in - we have an invalid config and
+ # keycloak redirects back to our callback URL with error parameters.
+ start_response = self.app.get(start_url)
+ auth_response = requests.get(start_response["Location"], allow_redirects=False)
+ # check out assumptions/expectations before proceeding
+ callback_url = furl(auth_response.headers["Location"])
+ assert callback_url.netloc == "testserver"
+ assert "state" in callback_url.args
+ callback_url.args.update(
+ {"error": "access_denied", "error_description": "The user cancelled"}
+ )
+
+ callback_response = self.app.get(str(callback_url), auto_follow=True)
+
+ self.assertEqual(callback_response.status_code, 200)
+ expected_url = furl(url_helper.frontend_start).add(
+ {"_eherkenning-message": "login-cancelled"}
+ )
+ assert BACKEND_OUTAGE_RESPONSE_PARAMETER not in expected_url.args
+ self.assertEqual(callback_response.request.url, str(expected_url))
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/test_auth_flow_init.py b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/test_auth_flow_init.py
new file mode 100644
index 0000000000..06e0883958
--- /dev/null
+++ b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/test_auth_flow_init.py
@@ -0,0 +1,283 @@
+"""
+Test the authentication flow for a form.
+
+These tests use VCR. When re-recording, making sure to:
+
+.. code-block:: bash
+
+ cd docker
+ docker compose -f docker-compose.keycloak.yml up
+
+to bring up a Keycloak instance.
+"""
+
+from django.urls import reverse_lazy
+
+from furl import furl
+
+from openforms.authentication.tests.utils import URLsHelper
+from openforms.authentication.views import BACKEND_OUTAGE_RESPONSE_PARAMETER
+from openforms.forms.tests.factories import FormFactory
+
+from .base import (
+ IntegrationTestsBase,
+ mock_digid_config,
+ mock_digid_machtigen_config,
+ mock_eherkenning_bewindvoering_config,
+ mock_eherkenning_config,
+)
+
+
+class DigiDInitTests(IntegrationTestsBase):
+ """
+ Test the outbound part of OIDC-based DigiD authentication.
+ """
+
+ CALLBACK_URL = f"http://testserver{reverse_lazy('digid_oidc:callback')}"
+
+ @mock_digid_config()
+ def test_start_flow_redirects_to_oidc_provider(self):
+ form = FormFactory.create(authentication_backends=["digid_oidc"])
+ start_url = URLsHelper(form=form).get_auth_start(plugin_id="digid_oidc")
+
+ response = self.app.get(start_url)
+
+ self.assertEqual(response.status_code, 302)
+ redirect_target = furl(response["Location"])
+ query_params = redirect_target.query.params
+ self.assertEqual(redirect_target.host, "localhost")
+ self.assertEqual(redirect_target.port, 8080)
+ self.assertEqual(
+ redirect_target.path,
+ "/realms/test/protocol/openid-connect/auth",
+ )
+ self.assertEqual(query_params["scope"], "openid bsn")
+ self.assertEqual(query_params["client_id"], "testid")
+ self.assertEqual(query_params["redirect_uri"], self.CALLBACK_URL)
+
+ @mock_digid_config(
+ oidc_op_authorization_endpoint="http://localhost:8080/i-dont-exist"
+ )
+ def test_idp_availability_check(self):
+ form = FormFactory.create(authentication_backends=["digid_oidc"])
+ url_helper = URLsHelper(form=form)
+ start_url = url_helper.get_auth_start(plugin_id="digid_oidc")
+
+ response = self.app.get(start_url)
+
+ self.assertEqual(response.status_code, 302)
+ redirect_url = furl(response["Location"])
+ self.assertEqual(redirect_url.host, "testserver")
+ self.assertEqual(redirect_url.path, url_helper.form_path)
+ query_params = redirect_url.query.params
+ self.assertEqual(query_params[BACKEND_OUTAGE_RESPONSE_PARAMETER], "digid_oidc")
+
+ @mock_digid_config(oidc_keycloak_idp_hint="oidc-digid")
+ def test_keycloak_idp_hint_is_respected(self):
+ form = FormFactory.create(authentication_backends=["digid_oidc"])
+ url_helper = URLsHelper(form=form)
+ start_url = url_helper.get_auth_start(plugin_id="digid_oidc")
+
+ response = self.app.get(start_url)
+
+ self.assertEqual(response.status_code, 302)
+ redirect_url = furl(response["Location"])
+ self.assertEqual(redirect_url.args["kc_idp_hint"], "oidc-digid")
+
+
+class EHerkenningInitTests(IntegrationTestsBase):
+ """
+ Test the outbound part of OIDC-based eHerkenning authentication.
+ """
+
+ CALLBACK_URL = f"http://testserver{reverse_lazy('eherkenning_oidc:callback')}"
+
+ @mock_eherkenning_config()
+ def test_start_flow_redirects_to_oidc_provider(self):
+ form = FormFactory.create(authentication_backends=["eherkenning_oidc"])
+ start_url = URLsHelper(form=form).get_auth_start(plugin_id="eherkenning_oidc")
+
+ response = self.app.get(start_url)
+
+ self.assertEqual(response.status_code, 302)
+ redirect_target = furl(response["Location"])
+ query_params = redirect_target.query.params
+ self.assertEqual(redirect_target.host, "localhost")
+ self.assertEqual(redirect_target.port, 8080)
+ self.assertEqual(
+ redirect_target.path,
+ "/realms/test/protocol/openid-connect/auth",
+ )
+ self.assertEqual(query_params["scope"], "openid kvk")
+ self.assertEqual(query_params["client_id"], "testid")
+ self.assertEqual(query_params["redirect_uri"], self.CALLBACK_URL)
+
+ @mock_eherkenning_config(
+ oidc_op_authorization_endpoint="http://localhost:8080/i-dont-exist"
+ )
+ def test_idp_availability_check(self):
+ form = FormFactory.create(authentication_backends=["eherkenning_oidc"])
+ url_helper = URLsHelper(form=form)
+ start_url = url_helper.get_auth_start(plugin_id="eherkenning_oidc")
+
+ response = self.app.get(start_url)
+
+ self.assertEqual(response.status_code, 302)
+ redirect_url = furl(response["Location"])
+ self.assertEqual(redirect_url.host, "testserver")
+ self.assertEqual(redirect_url.path, url_helper.form_path)
+ query_params = redirect_url.query.params
+ self.assertEqual(
+ query_params[BACKEND_OUTAGE_RESPONSE_PARAMETER], "eherkenning_oidc"
+ )
+
+ @mock_eherkenning_config(oidc_keycloak_idp_hint="oidc-eherkenning")
+ def test_keycloak_idp_hint_is_respected(self):
+ form = FormFactory.create(authentication_backends=["eherkenning_oidc"])
+ url_helper = URLsHelper(form=form)
+ start_url = url_helper.get_auth_start(plugin_id="eherkenning_oidc")
+
+ response = self.app.get(start_url)
+
+ self.assertEqual(response.status_code, 302)
+ redirect_url = furl(response["Location"])
+ self.assertEqual(redirect_url.args["kc_idp_hint"], "oidc-eherkenning")
+
+
+class DigiDMachtigenInitTests(IntegrationTestsBase):
+ """
+ Test the outbound part of OIDC-based DigiD machtigen authentication.
+ """
+
+ CALLBACK_URL = f"http://testserver{reverse_lazy('digid_machtigen_oidc:callback')}"
+
+ @mock_digid_machtigen_config()
+ def test_start_flow_redirects_to_oidc_provider(self):
+ form = FormFactory.create(authentication_backends=["digid_machtigen_oidc"])
+ start_url = URLsHelper(form=form).get_auth_start(
+ plugin_id="digid_machtigen_oidc"
+ )
+
+ response = self.app.get(start_url)
+
+ self.assertEqual(response.status_code, 302)
+ redirect_target = furl(response["Location"])
+ query_params = redirect_target.query.params
+ self.assertEqual(redirect_target.host, "localhost")
+ self.assertEqual(redirect_target.port, 8080)
+ self.assertEqual(
+ redirect_target.path,
+ "/realms/test/protocol/openid-connect/auth",
+ )
+ self.assertEqual(query_params["scope"], "openid bsn")
+ self.assertEqual(query_params["client_id"], "testid")
+ self.assertEqual(query_params["redirect_uri"], self.CALLBACK_URL)
+
+ @mock_digid_machtigen_config(
+ oidc_op_authorization_endpoint="http://localhost:8080/i-dont-exist"
+ )
+ def test_idp_availability_check(self):
+ form = FormFactory.create(authentication_backends=["digid_machtigen_oidc"])
+ url_helper = URLsHelper(form=form)
+ start_url = url_helper.get_auth_start(plugin_id="digid_machtigen_oidc")
+
+ response = self.app.get(start_url)
+
+ self.assertEqual(response.status_code, 302)
+ redirect_url = furl(response["Location"])
+ self.assertEqual(redirect_url.host, "testserver")
+ self.assertEqual(redirect_url.path, url_helper.form_path)
+ query_params = redirect_url.query.params
+ self.assertEqual(
+ query_params[BACKEND_OUTAGE_RESPONSE_PARAMETER], "digid_machtigen_oidc"
+ )
+
+ @mock_digid_machtigen_config(oidc_keycloak_idp_hint="oidc-digid-machtigen")
+ def test_keycloak_idp_hint_is_respected(self):
+ form = FormFactory.create(authentication_backends=["digid_machtigen_oidc"])
+ url_helper = URLsHelper(form=form)
+ start_url = url_helper.get_auth_start(plugin_id="digid_machtigen_oidc")
+
+ response = self.app.get(start_url)
+
+ self.assertEqual(response.status_code, 302)
+ redirect_url = furl(response["Location"])
+ self.assertEqual(redirect_url.args["kc_idp_hint"], "oidc-digid-machtigen")
+
+
+class EHerkenningBewindvoeringInitTests(IntegrationTestsBase):
+ """
+ Test the outbound part of OIDC-based eHerkenning_bewindvoering authentication.
+ """
+
+ CALLBACK_URL = (
+ f"http://testserver{reverse_lazy('eherkenning_bewindvoering_oidc:callback')}"
+ )
+
+ @mock_eherkenning_bewindvoering_config()
+ def test_start_flow_redirects_to_oidc_provider(self):
+ form = FormFactory.create(
+ authentication_backends=["eherkenning_bewindvoering_oidc"]
+ )
+ start_url = URLsHelper(form=form).get_auth_start(
+ plugin_id="eherkenning_bewindvoering_oidc"
+ )
+
+ response = self.app.get(start_url)
+
+ self.assertEqual(response.status_code, 302)
+ redirect_target = furl(response["Location"])
+ query_params = redirect_target.query.params
+ self.assertEqual(redirect_target.host, "localhost")
+ self.assertEqual(redirect_target.port, 8080)
+ self.assertEqual(
+ redirect_target.path,
+ "/realms/test/protocol/openid-connect/auth",
+ )
+ self.assertEqual(query_params["scope"], "openid bsn")
+ self.assertEqual(query_params["client_id"], "testid")
+ self.assertEqual(query_params["redirect_uri"], self.CALLBACK_URL)
+
+ @mock_eherkenning_bewindvoering_config(
+ oidc_op_authorization_endpoint="http://localhost:8080/i-dont-exist"
+ )
+ def test_idp_availability_check(self):
+ form = FormFactory.create(
+ authentication_backends=["eherkenning_bewindvoering_oidc"]
+ )
+ url_helper = URLsHelper(form=form)
+ start_url = url_helper.get_auth_start(
+ plugin_id="eherkenning_bewindvoering_oidc"
+ )
+
+ response = self.app.get(start_url)
+
+ self.assertEqual(response.status_code, 302)
+ redirect_url = furl(response["Location"])
+ self.assertEqual(redirect_url.host, "testserver")
+ self.assertEqual(redirect_url.path, url_helper.form_path)
+ query_params = redirect_url.query.params
+ self.assertEqual(
+ query_params[BACKEND_OUTAGE_RESPONSE_PARAMETER],
+ "eherkenning_bewindvoering_oidc",
+ )
+
+ @mock_eherkenning_bewindvoering_config(
+ oidc_keycloak_idp_hint="oidc-eherkenning-bewindvoering"
+ )
+ def test_keycloak_idp_hint_is_respected(self):
+ form = FormFactory.create(
+ authentication_backends=["eherkenning_bewindvoering_oidc"]
+ )
+ url_helper = URLsHelper(form=form)
+ start_url = url_helper.get_auth_start(
+ plugin_id="eherkenning_bewindvoering_oidc"
+ )
+
+ response = self.app.get(start_url)
+
+ self.assertEqual(response.status_code, 302)
+ redirect_url = furl(response["Location"])
+ self.assertEqual(
+ redirect_url.args["kc_idp_hint"], "oidc-eherkenning-bewindvoering"
+ )
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/test_auth_flow_logout.py b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/test_auth_flow_logout.py
new file mode 100644
index 0000000000..83b4b1efda
--- /dev/null
+++ b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/test_auth_flow_logout.py
@@ -0,0 +1,263 @@
+"""
+Test that logouts in our application propagate to the OpenID Connect provider.
+
+See the standard: https://openid.net/specs/openid-connect-rpinitiated-1_0.html#RPLogout,
+section '2. RP-Initiated Logout'.
+
+This is tested against Keycloak, which seems to take some liberties, most notably:
+
+ by redirecting the End-User's User Agent to the OP's Logout Endpoint
+
+KC appears to support logout with an API call too, rather than redirecting the user's
+browser to this endpoint.
+
+The specification appears to allow for this though, by providing the `id_token_hint`
+parameter. If this is not provided, then section '6. Security considerations' says:
+
+ Logout requests without a valid id_token_hint value are a potential means of denial
+ of service; therefore, OPs should obtain explicit confirmation from the End-User
+ before acting upon them.
+
+Terms:
+
+Relying Party (RP)
+ The application using OpenID Connect, Open Forms in this case.
+
+OpenID Provider (OP)
+ The application acting as an identity provider, Keycloak in this case.
+"""
+
+import uuid
+
+from django_webtest import DjangoTestApp
+from furl import furl
+from requests import Session
+from rest_framework.test import APIRequestFactory
+
+from openforms.authentication.registry import register
+from openforms.authentication.tests.utils import URLsHelper
+from openforms.forms.tests.factories import FormFactory
+from openforms.utils.tests.keycloak import keycloak_login
+
+from ..plugin import OIDC_ID_TOKEN_SESSION_KEY
+from .base import (
+ IntegrationTestsBase,
+ mock_digid_config,
+ mock_digid_machtigen_config,
+ mock_eherkenning_bewindvoering_config,
+ mock_eherkenning_config,
+)
+
+
+class LogoutTestsMixin:
+ app: DjangoTestApp
+
+ def _do_keycloak_login(
+ self, session: Session, start_url: str, username: str, password: str
+ ) -> str:
+ """
+ Login to keycloak and capture the callback URL to finish the OIDC flow.
+ """
+ start_response1 = self.app.get(start_url)
+ # login to Keycloak - this sets up a session in keycloak
+ redirect_uri1 = keycloak_login(
+ start_response1["Location"],
+ username=username,
+ password=password,
+ session=session,
+ )
+ login_code1 = furl(redirect_uri1).args["code"]
+ assert login_code1
+
+ # now hit the auth flow again to verify that we don't need to enter credentials
+ # again while still logged in on the OpenID Provider side of things.
+ start_response2 = self.app.get(start_url)
+ resp = session.get(start_response2["Location"], allow_redirects=False)
+ assert resp.status_code == 302
+ redirect_uri2 = resp.headers["Location"]
+ login_code2 = furl(redirect_uri2).args["code"]
+ assert login_code2 and login_code2 != login_code1
+
+ return redirect_uri2
+
+ def _do_plugin_logout(self, plugin_id: str) -> None:
+ request = APIRequestFactory().delete(
+ f"/api/v2/authentication/{uuid.uuid4()}/session"
+ )
+ request.session = self.app.session # type: ignore
+ plugin = register[plugin_id]
+ plugin.logout(request)
+ if not isinstance(request.session, dict):
+ request.session.save()
+
+ def assertNotLoggedInToKeycloak(self, session: Session, start_url: str):
+ start_response = self.app.get(start_url)
+ login_response = session.get(start_response["Location"], allow_redirects=False)
+ # presents the login screen again, if we were still logged in, this would be a
+ # HTTP 302 redirect to the callback endpoint
+ self.assertEqual(login_response.status_code, 200) # type: ignore
+
+
+class DigiDLogoutTests(LogoutTestsMixin, IntegrationTestsBase):
+ """
+ Test the (RP-initiated) logout flow for the DigiD plugin.
+ """
+
+ @mock_digid_config()
+ def test_logout_also_logs_out_user_in_openid_provider(self):
+ form = FormFactory.create(authentication_backends=["digid_oidc"])
+ start_url = URLsHelper(form=form).get_auth_start(plugin_id="digid_oidc")
+ # use shared session to maintain cookie state
+ session = Session()
+ self.addCleanup(session.close)
+ callback_url = self._do_keycloak_login(
+ session, start_url, username="testuser", password="testuser"
+ )
+ # proceed by completing the login flow
+ callback_response = self.app.get(callback_url, auto_follow=True)
+ assert callback_response.status_code == 200
+ assert OIDC_ID_TOKEN_SESSION_KEY in self.app.session
+
+ # now, initiate the logout, which must trigger the OP logout too
+ self._do_plugin_logout("digid_oidc")
+
+ self.assertNotIn(OIDC_ID_TOKEN_SESSION_KEY, self.app.session)
+ self.assertNotLoggedInToKeycloak(session, start_url)
+
+ @mock_digid_config()
+ def test_logout_with_empty_session(self):
+ assert OIDC_ID_TOKEN_SESSION_KEY not in self.app.session
+
+ # now, initiate the logout, which must trigger the OP logout too
+ try:
+ self._do_plugin_logout("digid_oidc")
+ except Exception as exc:
+ raise self.failureException(
+ "Logout with empty session unexpectedly crashed"
+ ) from exc
+
+
+class EHerkenningLogoutTests(LogoutTestsMixin, IntegrationTestsBase):
+ """
+ Test the (RP-initiated) logout flow for the eHerkenning plugin.
+ """
+
+ @mock_eherkenning_config()
+ def test_logout_also_logs_out_user_in_openid_provider(self):
+ form = FormFactory.create(authentication_backends=["eherkenning_oidc"])
+ start_url = URLsHelper(form=form).get_auth_start(plugin_id="eherkenning_oidc")
+ # use shared session to maintain cookie state
+ session = Session()
+ self.addCleanup(session.close)
+ callback_url = self._do_keycloak_login(
+ session, start_url, username="testuser", password="testuser"
+ )
+ # proceed by completing the login flow
+ callback_response = self.app.get(callback_url, auto_follow=True)
+ assert callback_response.status_code == 200
+ assert OIDC_ID_TOKEN_SESSION_KEY in self.app.session
+
+ # now, initiate the logout, which must trigger the OP logout too
+ self._do_plugin_logout("eherkenning_oidc")
+
+ self.assertNotIn(OIDC_ID_TOKEN_SESSION_KEY, self.app.session)
+ self.assertNotLoggedInToKeycloak(session, start_url)
+
+ @mock_eherkenning_config()
+ def test_logout_with_empty_session(self):
+ assert OIDC_ID_TOKEN_SESSION_KEY not in self.app.session
+
+ # now, initiate the logout, which must trigger the OP logout too
+ try:
+ self._do_plugin_logout("eherkenning_oidc")
+ except Exception as exc:
+ raise self.failureException(
+ "Logout with empty session unexpectedly crashed"
+ ) from exc
+
+
+class DigiDMachtigenLogoutTests(LogoutTestsMixin, IntegrationTestsBase):
+ """
+ Test the (RP-initiated) logout flow for the DigiD Nachtigen plugin.
+ """
+
+ @mock_digid_machtigen_config()
+ def test_logout_also_logs_out_user_in_openid_provider(self):
+ form = FormFactory.create(authentication_backends=["digid_machtigen_oidc"])
+ start_url = URLsHelper(form=form).get_auth_start(
+ plugin_id="digid_machtigen_oidc"
+ )
+ # use shared session to maintain cookie state
+ session = Session()
+ self.addCleanup(session.close)
+ callback_url = self._do_keycloak_login(
+ session, start_url, username="digid-machtigen", password="digid-machtigen"
+ )
+ # proceed by completing the login flow
+ callback_response = self.app.get(callback_url, auto_follow=True)
+ assert callback_response.status_code == 200
+ assert OIDC_ID_TOKEN_SESSION_KEY in self.app.session
+
+ # now, initiate the logout, which must trigger the OP logout too
+ self._do_plugin_logout("digid_machtigen_oidc")
+
+ self.assertNotIn(OIDC_ID_TOKEN_SESSION_KEY, self.app.session)
+ self.assertNotLoggedInToKeycloak(session, start_url)
+
+ @mock_digid_machtigen_config()
+ def test_logout_with_empty_session(self):
+ assert OIDC_ID_TOKEN_SESSION_KEY not in self.app.session
+
+ # now, initiate the logout, which must trigger the OP logout too
+ try:
+ self._do_plugin_logout("digid_machtigen_oidc")
+ except Exception as exc:
+ raise self.failureException(
+ "Logout with empty session unexpectedly crashed"
+ ) from exc
+
+
+class EHerkenningBewindvoeringLogoutTests(LogoutTestsMixin, IntegrationTestsBase):
+ """
+ Test the (RP-initiated) logout flow for the eHerkenning Bewindvoering plugin.
+ """
+
+ @mock_eherkenning_bewindvoering_config()
+ def test_logout_also_logs_out_user_in_openid_provider(self):
+ form = FormFactory.create(
+ authentication_backends=["eherkenning_bewindvoering_oidc"]
+ )
+ start_url = URLsHelper(form=form).get_auth_start(
+ plugin_id="eherkenning_bewindvoering_oidc"
+ )
+ # use shared session to maintain cookie state
+ session = Session()
+ self.addCleanup(session.close)
+ callback_url = self._do_keycloak_login(
+ session,
+ start_url,
+ username="eherkenning-bewindvoering",
+ password="eherkenning-bewindvoering",
+ )
+ # proceed by completing the login flow
+ callback_response = self.app.get(callback_url, auto_follow=True)
+ assert callback_response.status_code == 200
+ assert OIDC_ID_TOKEN_SESSION_KEY in self.app.session
+
+ # now, initiate the logout, which must trigger the OP logout too
+ self._do_plugin_logout("eherkenning_bewindvoering_oidc")
+
+ self.assertNotIn(OIDC_ID_TOKEN_SESSION_KEY, self.app.session)
+ self.assertNotLoggedInToKeycloak(session, start_url)
+
+ @mock_eherkenning_bewindvoering_config()
+ def test_logout_with_empty_session(self):
+ assert OIDC_ID_TOKEN_SESSION_KEY not in self.app.session
+
+ # now, initiate the logout, which must trigger the OP logout too
+ try:
+ self._do_plugin_logout("eherkenning_bewindvoering_oidc")
+ except Exception as exc:
+ raise self.failureException(
+ "Logout with empty session unexpectedly crashed"
+ ) from exc
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/test_configuration.py b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/test_configuration.py
new file mode 100644
index 0000000000..85786b8162
--- /dev/null
+++ b/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/test_configuration.py
@@ -0,0 +1,65 @@
+from django.test import TestCase, override_settings
+from django.urls import reverse
+
+from mozilla_django_oidc_db.views import OIDCInit
+
+from ..models import (
+ OFDigiDConfig,
+ OFDigiDMachtigenConfig,
+ OFEHerkenningBewindvoeringConfig,
+ OFEHerkenningConfig,
+)
+
+
+class CallbackURLConfigurationTests(TestCase):
+ """
+ Test the legacy and new behaviour for the OIDC Redirect URIs for each config.
+ """
+
+ def setUp(self):
+ super().setUp()
+
+ self.addCleanup(OFDigiDConfig.clear_cache)
+ self.addCleanup(OFEHerkenningConfig.clear_cache)
+ self.addCleanup(OFDigiDMachtigenConfig.clear_cache)
+ self.addCleanup(OFEHerkenningBewindvoeringConfig.clear_cache)
+
+ def test_default_settings_backwards_compatible(self):
+ cases = (
+ (OFDigiDConfig, "/digid-oidc/callback/"),
+ (OFEHerkenningConfig, "/eherkenning-oidc/callback/"),
+ (OFDigiDMachtigenConfig, "/digid-machtigen-oidc/callback/"),
+ (
+ OFEHerkenningBewindvoeringConfig,
+ "/eherkenning-bewindvoering-oidc/callback/",
+ ),
+ )
+
+ for config_cls, expected_url in cases:
+ with self.subTest(config_cls=config_cls, expected_url=expected_url):
+ # use an init view to decouple the implementation details from the
+ # desired behaviour.
+ view = OIDCInit(config_class=config_cls)
+
+ url = reverse(view.get_settings("OIDC_AUTHENTICATION_CALLBACK_URL"))
+
+ self.assertEqual(url, expected_url)
+
+ @override_settings(USE_LEGACY_DIGID_EH_OIDC_ENDPOINTS=False)
+ def test_new_behaviour(self):
+ cases = (
+ OFDigiDConfig,
+ OFEHerkenningConfig,
+ OFDigiDMachtigenConfig,
+ OFEHerkenningBewindvoeringConfig,
+ )
+
+ for config_cls in cases:
+ with self.subTest(config_cls=config_cls):
+ # use an init view to decouple the implementation details from the
+ # desired behaviour.
+ view = OIDCInit(config_class=config_cls)
+
+ url = reverse(view.get_settings("OIDC_AUTHENTICATION_CALLBACK_URL"))
+
+ self.assertEqual(url, "/auth/oidc/callback/")
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/views.py b/src/openforms/authentication/contrib/digid_eherkenning_oidc/views.py
index 02302aaa9c..b4cd33dc19 100644
--- a/src/openforms/authentication/contrib/digid_eherkenning_oidc/views.py
+++ b/src/openforms/authentication/contrib/digid_eherkenning_oidc/views.py
@@ -1,127 +1,134 @@
import logging
-from furl import furl
+from django.http import HttpRequest
-from digid_eherkenning_oidc_generics.mixins import (
- SoloConfigDigiDMachtigenMixin,
- SoloConfigDigiDMixin,
- SoloConfigEHerkenningBewindvoeringMixin,
- SoloConfigEHerkenningMixin,
-)
-from digid_eherkenning_oidc_generics.views import (
+from digid_eherkenning.oidc.models import OpenIDConnectBaseConfig
+from digid_eherkenning.oidc.views import (
OIDCAuthenticationCallbackView as _OIDCAuthenticationCallbackView,
)
+from furl import furl
+from mozilla_django_oidc_db.config import lookup_config
+from mozilla_django_oidc_db.views import _RETURN_URL_SESSION_KEY, OIDCInit
+
from openforms.authentication.contrib.digid.views import (
DIGID_MESSAGE_PARAMETER,
LOGIN_CANCELLED,
)
-from openforms.authentication.contrib.eherkenning.views import MESSAGE_PARAMETER
+from openforms.authentication.contrib.eherkenning.views import (
+ MESSAGE_PARAMETER as EH_MESSAGE_PARAMETER,
+)
from ...views import BACKEND_OUTAGE_RESPONSE_PARAMETER
-from .backends import (
- OIDCAuthenticationDigiDBackend,
- OIDCAuthenticationDigiDMachtigenBackend,
- OIDCAuthenticationEHerkenningBackend,
- OIDCAuthenticationEHerkenningBewindvoeringBackend,
+from .models import (
+ OFDigiDConfig,
+ OFDigiDMachtigenConfig,
+ OFEHerkenningBewindvoeringConfig,
+ OFEHerkenningConfig,
)
logger = logging.getLogger(__name__)
class OIDCAuthenticationCallbackView(_OIDCAuthenticationCallbackView):
- def get(self, request):
- self._redirect_next = request.session.get("of_redirect_next")
+ """
+ Relay error messages back to the frontend.
+
+ This custom callback view relays any failures back to the public frontend URL of the
+ form by setting the appropriate outage parameter and/or message.
+ """
+
+ expect_django_user: bool = False # do NOT create real Django users
+
+ _redirect_next: str
+
+ def get(self, request: HttpRequest):
+ # grab where the redirect next from the session and store it as a temporary
+ # attribute. in the event that the failure url needs to be overridden, we
+ # then have the value available even *after* mozilla_django_oidc has flushed
+ # the session.
+ self._redirect_next = request.session.get(_RETURN_URL_SESSION_KEY, "")
return super().get(request)
def get_error_message_parameters(
- self, parameter: str, problem_code: str
+ self, error: str, error_description: str
) -> tuple[str, str]:
"""
Return a tuple of the parameter type and the problem code.
"""
- return (
- parameter or BACKEND_OUTAGE_RESPONSE_PARAMETER,
- problem_code or self.plugin_identifier,
+ from .plugin import (
+ DigiDMachtigenOIDCAuthentication,
+ DigiDOIDCAuthentication,
+ EHerkenningBewindvoeringOIDCAuthentication,
+ eHerkenningOIDCAuthentication,
+ get_config_to_plugin,
)
+ config_to_plugin = get_config_to_plugin()
+ config_class = lookup_config(self.request)
+ assert issubclass(config_class, OpenIDConnectBaseConfig)
+ plugin = config_to_plugin[config_class]
+
+ match error, error_description, plugin:
+
+ case (
+ "access_denied",
+ "The user cancelled",
+ DigiDOIDCAuthentication() | DigiDMachtigenOIDCAuthentication(),
+ ):
+ return (DIGID_MESSAGE_PARAMETER, LOGIN_CANCELLED)
+
+ case (
+ "access_denied",
+ "The user cancelled",
+ eHerkenningOIDCAuthentication()
+ | EHerkenningBewindvoeringOIDCAuthentication(),
+ ):
+ eh_message_parameter = EH_MESSAGE_PARAMETER % {
+ "plugin_id": plugin.identifier.split("_")[0]
+ }
+ return (eh_message_parameter, LOGIN_CANCELLED)
+
+ case _:
+ return (BACKEND_OUTAGE_RESPONSE_PARAMETER, plugin.identifier)
+
@property
- def failure_url(self):
+ def failure_url(self) -> str:
"""
- On failure, redirect to the form with an appropriate error message
+ On failure, redirect to the form with an appropriate error message.
"""
- f = furl(self._redirect_next or self.get_settings("LOGIN_REDIRECT_URL", "/"))
- f = furl(f.args["next"])
+ # this is expected to be the auth plugin return url, set by the OIDCInit view
+ plugin_return_url = furl(
+ self._redirect_next or self.get_settings("LOGIN_REDIRECT_URL", "/")
+ )
+ # this URL is expected to have a ?next query param pointing back to the frontend
+ # where the form is rendered/embedded
+ _next = plugin_return_url.args["next"]
+ assert isinstance(_next, str)
+ form_url = furl(_next)
parameter, problem_code = self.get_error_message_parameters(
- self.request.GET.get("error", ""),
- self.request.GET.get("error_description", ""),
+ error=self.request.GET.get("error", ""),
+ error_description=self.request.GET.get("error_description", ""),
)
- f.args[parameter] = problem_code
-
- return f.url
-
-
-class DigiDOIDCAuthenticationCallbackView(
- SoloConfigDigiDMixin, OIDCAuthenticationCallbackView
-):
- plugin_identifier = "digid_oidc"
- auth_backend_class = OIDCAuthenticationDigiDBackend
-
- def get_error_message_parameters(
- self, error: str, error_description: str
- ) -> tuple[str, str]:
- if error == "access_denied" and error_description == "The user cancelled":
- return (DIGID_MESSAGE_PARAMETER, LOGIN_CANCELLED)
-
- return (BACKEND_OUTAGE_RESPONSE_PARAMETER, self.plugin_identifier)
-
+ form_url.args[parameter] = problem_code
+ return form_url.url
-class eHerkenningOIDCAuthenticationCallbackView(
- SoloConfigEHerkenningMixin, OIDCAuthenticationCallbackView
-):
- plugin_identifier = "eherkenning_oidc"
- auth_backend_class = OIDCAuthenticationEHerkenningBackend
- def get_error_message_parameters(
- self, error: str, error_description: str
- ) -> tuple[str, str]:
- if error == "access_denied" and error_description == "The user cancelled":
- return (
- MESSAGE_PARAMETER % {"plugin_id": self.plugin_identifier.split("_")[0]},
- LOGIN_CANCELLED,
- )
-
- return (BACKEND_OUTAGE_RESPONSE_PARAMETER, self.plugin_identifier)
-
-
-class DigiDMachtigenOIDCAuthenticationCallbackView(
- SoloConfigDigiDMachtigenMixin, OIDCAuthenticationCallbackView
-):
- plugin_identifier = "digid_machtigen_oidc"
- auth_backend_class = OIDCAuthenticationDigiDMachtigenBackend
-
- def get_error_message_parameters(
- self, error: str, error_description: str
- ) -> tuple[str, str]:
- if error == "access_denied" and error_description == "The user cancelled":
- return (DIGID_MESSAGE_PARAMETER, LOGIN_CANCELLED)
-
- return (BACKEND_OUTAGE_RESPONSE_PARAMETER, self.plugin_identifier)
-
-
-class EHerkenningBewindvoeringOIDCAuthenticationCallbackView(
- SoloConfigEHerkenningBewindvoeringMixin, OIDCAuthenticationCallbackView
-):
- plugin_identifier = "eherkenning_bewindvoering_oidc"
- auth_backend_class = OIDCAuthenticationEHerkenningBewindvoeringBackend
-
- def get_error_message_parameters(
- self, error: str, error_description: str
- ) -> tuple[str, str]:
- if error == "access_denied" and error_description == "The user cancelled":
- return (
- MESSAGE_PARAMETER % {"plugin_id": self.plugin_identifier.split("_")[0]},
- LOGIN_CANCELLED,
- )
+digid_init = OIDCInit.as_view(
+ config_class=OFDigiDConfig,
+ allow_next_from_query=False,
+)
+digid_machtigen_init = OIDCInit.as_view(
+ config_class=OFDigiDMachtigenConfig,
+ allow_next_from_query=False,
+)
+eherkenning_init = OIDCInit.as_view(
+ config_class=OFEHerkenningConfig,
+ allow_next_from_query=False,
+)
+eherkenning_bewindvoering_init = OIDCInit.as_view(
+ config_class=OFEHerkenningBewindvoeringConfig,
+ allow_next_from_query=False,
+)
- return (BACKEND_OUTAGE_RESPONSE_PARAMETER, self.plugin_identifier)
+callback_view = OIDCAuthenticationCallbackView.as_view()
diff --git a/src/openforms/authentication/contrib/org_oidc/backends.py b/src/openforms/authentication/contrib/org_oidc/backends.py
deleted file mode 100644
index cb0ce1fbb6..0000000000
--- a/src/openforms/authentication/contrib/org_oidc/backends.py
+++ /dev/null
@@ -1,12 +0,0 @@
-from mozilla_django_oidc_db.backends import (
- OIDCAuthenticationBackend as _OIDCAuthenticationBackend,
-)
-
-from .mixins import SoloConfigMixin
-
-
-class OIDCAuthenticationBackend(SoloConfigMixin, _OIDCAuthenticationBackend):
- @classmethod
- def get_import_path(cls):
- # needed for auth.login()/auth.logout()
- return f"{cls.__module__}.{cls.__qualname__}"
diff --git a/src/openforms/authentication/contrib/org_oidc/migrations/0001_initial.py b/src/openforms/authentication/contrib/org_oidc/migrations/0001_initial.py
new file mode 100644
index 0000000000..fddcd47bc6
--- /dev/null
+++ b/src/openforms/authentication/contrib/org_oidc/migrations/0001_initial.py
@@ -0,0 +1,25 @@
+# Generated by Django 4.2.11 on 2024-05-23 15:22
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ ("mozilla_django_oidc_db", "0002_migrate_to_claim_field"),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name="OrgOpenIDConnectConfig",
+ fields=[],
+ options={
+ "proxy": True,
+ "indexes": [],
+ "constraints": [],
+ },
+ bases=("mozilla_django_oidc_db.openidconnectconfig",),
+ ),
+ ]
diff --git a/src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/digid/__init__.py b/src/openforms/authentication/contrib/org_oidc/migrations/__init__.py
similarity index 100%
rename from src/openforms/authentication/contrib/digid_eherkenning_oidc/tests/digid/__init__.py
rename to src/openforms/authentication/contrib/org_oidc/migrations/__init__.py
diff --git a/src/openforms/authentication/contrib/org_oidc/mixins.py b/src/openforms/authentication/contrib/org_oidc/mixins.py
deleted file mode 100644
index 2d2d46384d..0000000000
--- a/src/openforms/authentication/contrib/org_oidc/mixins.py
+++ /dev/null
@@ -1,18 +0,0 @@
-from mozilla_django_oidc_db.mixins import SoloConfigMixin as _SoloConfigMixin
-from mozilla_django_oidc_db.models import OpenIDConnectConfig
-
-
-class SoloConfigMixin(_SoloConfigMixin):
- config_class = OpenIDConnectConfig
-
- plugin_identifier = "org-oidc"
-
- # override some settings we don't want configurable
- oidc_authentication_callback_url = "org-oidc:callback"
- oidc_redirect_field_name = "next"
-
- def get_settings(self, attr, *args):
- attr_lowercase = attr.lower()
- if hasattr(self, attr_lowercase):
- return getattr(self, attr_lowercase)
- return super().get_settings(attr, *args)
diff --git a/src/openforms/authentication/contrib/org_oidc/models.py b/src/openforms/authentication/contrib/org_oidc/models.py
new file mode 100644
index 0000000000..1eb079c201
--- /dev/null
+++ b/src/openforms/authentication/contrib/org_oidc/models.py
@@ -0,0 +1,30 @@
+import warnings
+
+from django.conf import settings
+from django.utils.functional import classproperty
+
+from mozilla_django_oidc_db.models import OpenIDConnectConfig
+
+
+class OrgOpenIDConnectConfig(OpenIDConnectConfig):
+ class Meta:
+ proxy = True
+
+ @classproperty
+ def oidcdb_check_idp_availability(cls) -> bool:
+ return True
+
+ @classproperty
+ def oidc_authentication_callback_url(cls) -> str: # type: ignore
+ if settings.USE_LEGACY_ORG_OIDC_ENDPOINTS:
+ warnings.warn(
+ "Legacy DigiD-eHerkenning callback endpoints will be removed in 3.0",
+ DeprecationWarning,
+ )
+ return "org-oidc-callback"
+ return "oidc_authentication_callback"
+
+ def get_callback_view(self):
+ from .views import callback_view
+
+ return callback_view
diff --git a/src/openforms/authentication/contrib/org_oidc/plugin.py b/src/openforms/authentication/contrib/org_oidc/plugin.py
index bf143ef1e6..d92ab4293a 100644
--- a/src/openforms/authentication/contrib/org_oidc/plugin.py
+++ b/src/openforms/authentication/contrib/org_oidc/plugin.py
@@ -1,17 +1,28 @@
from django.contrib import auth
from django.http import HttpRequest, HttpResponseBadRequest, HttpResponseRedirect
from django.templatetags.static import static
-from django.utils.translation import gettext_lazy as _
+from django.utils.translation import gettext, gettext_lazy as _
+from mozilla_django_oidc_db.views import OIDCInit
+
+from openforms.accounts.models import User
from openforms.forms.models import Form
from openforms.utils.urls import reverse_plus
from ...base import BasePlugin, LoginLogo
from ...constants import FORM_AUTH_SESSION_KEY, AuthAttribute, LogoAppearance
from ...registry import register
+from .models import OrgOpenIDConnectConfig
+
+PLUGIN_IDENTIFIER = "org-oidc"
+
+oidc_init = OIDCInit.as_view(
+ config_class=OrgOpenIDConnectConfig,
+ allow_next_from_query=False,
+)
-@register("org-oidc")
+@register(PLUGIN_IDENTIFIER)
class OIDCAuthentication(BasePlugin):
"""
Authentication plugin using the global mozilla-django-oidc-db (as used for the admin)
@@ -21,34 +32,30 @@ class OIDCAuthentication(BasePlugin):
provides_auth = AuthAttribute.employee_id
def start_login(self, request: HttpRequest, form: Form, form_url: str):
- auth_return_url = reverse_plus(
+ return_url = reverse_plus(
"authentication:return",
kwargs={"slug": form.slug, "plugin_id": self.identifier},
request=request,
- query={
- "next": form_url,
- },
- )
- redirect_url = reverse_plus(
- "org-oidc:init",
- request=request,
- query={
- "next": auth_return_url,
- },
+ query={"next": form_url},
)
if request.user.is_authenticated:
# logout user if logged in with other account
- # this is relevant when staff users are already logged in, the OIDC state/redirects get confused,
- # and could send the user back to the admin instead of the form.
- # this is likely because it picks a .success_url instead of session data
+ # this is relevant when staff users are already logged in, the OIDC
+ # state/redirects get confused, and could send the user back to the admin
+ # instead of the form. # this is likely because it picks a .success_url
+ # instead of session data
auth.logout(request)
- return HttpResponseRedirect(redirect_url)
+
+ response = oidc_init(request, return_url=return_url)
+ assert isinstance(response, HttpResponseRedirect)
+ return response
def handle_return(self, request, form):
"""
Redirect to form URL.
"""
assert request.user.is_authenticated
+ assert isinstance(request.user, User)
form_url = request.GET.get("next")
if not form_url:
@@ -79,7 +86,7 @@ def logout(self, request: HttpRequest):
assert not request.user.is_authenticated
def get_label(self):
- return _("OpenID Connect")
+ return gettext("OpenID Connect")
def get_logo(self, request: HttpRequest) -> LoginLogo:
return LoginLogo(
diff --git a/src/openforms/authentication/contrib/org_oidc/tests/base.py b/src/openforms/authentication/contrib/org_oidc/tests/base.py
new file mode 100644
index 0000000000..4b09c3cc40
--- /dev/null
+++ b/src/openforms/authentication/contrib/org_oidc/tests/base.py
@@ -0,0 +1,31 @@
+from functools import partial
+from pathlib import Path
+
+from django.test import override_settings
+
+from django_webtest import WebTest
+
+from openforms.utils.tests.keycloak import mock_oidc_db_config
+from openforms.utils.tests.vcr import OFVCRMixin
+
+TEST_FILES = (Path(__file__).parent / "data").resolve()
+
+
+mock_org_oidc_config = partial(
+ mock_oidc_db_config,
+ app_label="authentication_org_oidc",
+ model="OrgOpenIDConnectConfig",
+ id=1, # required for the group queries because we're using in-memory objects
+ oidc_rp_scopes_list=["openid", "email", "profile"],
+ username_claim=["preferred_username"],
+ claim_mapping={
+ "email": ["email"],
+ "employee_id": ["preferred_username"],
+ },
+ groups_claim=["groups"],
+)
+
+
+@override_settings(CORS_ALLOW_ALL_ORIGINS=True, IS_HTTPS=True)
+class IntegrationTestsBase(OFVCRMixin, WebTest):
+ VCR_TEST_FILES = TEST_FILES
diff --git a/src/openforms/authentication/contrib/org_oidc/tests/data/vcr_cassettes/OrgOIDCCallbackTests/OrgOIDCCallbackTests.test_failing_claim_verification.yaml b/src/openforms/authentication/contrib/org_oidc/tests/data/vcr_cassettes/OrgOIDCCallbackTests/OrgOIDCCallbackTests.test_failing_claim_verification.yaml
new file mode 100644
index 0000000000..6fb7097c53
--- /dev/null
+++ b/src/openforms/authentication/contrib/org_oidc/tests/data/vcr_cassettes/OrgOIDCCallbackTests/OrgOIDCCallbackTests.test_failing_claim_verification.yaml
@@ -0,0 +1,371 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.32.2
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n\n\n\n\n\n\n"
+ headers:
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '1573'
+ status:
+ code: 400
+ message: Bad Request
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.32.2
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth?response_type=code&scope=openid+email+profile&client_id=testid&redirect_uri=http%3A%2F%2Ftestserver%2Forg-oidc%2Fcallback%2F&state=not-a-random-string&nonce=not-a-random-string
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n \n\n\n\n\n
+ \ \n
\n
+ \ \n
\n
+ \
\n\n\n
\n \n\n\n\n\n\n
+ \
\n
\n\n
\n
\n\n\n"
+ headers:
+ Cache-Control:
+ - no-store, must-revalidate, max-age=0
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Set-Cookie:
+ - AUTH_SESSION_ID=21409fca-22ee-4b5b-acb9-1af85993d2af; Version=1; Path=/realms/test/;
+ SameSite=None; Secure; HttpOnly
+ - AUTH_SESSION_ID_LEGACY=21409fca-22ee-4b5b-acb9-1af85993d2af; Version=1; Path=/realms/test/;
+ HttpOnly
+ - KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJjaWQiOiJ0ZXN0aWQiLCJwdHkiOiJvcGVuaWQtY29ubmVjdCIsInJ1cmkiOiJodHRwOi8vdGVzdHNlcnZlci9vcmctb2lkYy9jYWxsYmFjay8iLCJhY3QiOiJBVVRIRU5USUNBVEUiLCJub3RlcyI6eyJzY29wZSI6Im9wZW5pZCBlbWFpbCBwcm9maWxlIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0IiwicmVzcG9uc2VfdHlwZSI6ImNvZGUiLCJyZWRpcmVjdF91cmkiOiJodHRwOi8vdGVzdHNlcnZlci9vcmctb2lkYy9jYWxsYmFjay8iLCJzdGF0ZSI6Im5vdC1hLXJhbmRvbS1zdHJpbmciLCJub25jZSI6Im5vdC1hLXJhbmRvbS1zdHJpbmcifX0.PVsoxNQ0-_nJN1HEGMJ6H1byID8wg96CZXFzWiaCgQk;
+ Version=1; Path=/realms/test/; HttpOnly
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '4466'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: username=admin&password=admin&credentialId=&login=Sign+In
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '57'
+ Content-Type:
+ - application/x-www-form-urlencoded
+ Cookie:
+ - AUTH_SESSION_ID_LEGACY=21409fca-22ee-4b5b-acb9-1af85993d2af; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJjaWQiOiJ0ZXN0aWQiLCJwdHkiOiJvcGVuaWQtY29ubmVjdCIsInJ1cmkiOiJodHRwOi8vdGVzdHNlcnZlci9vcmctb2lkYy9jYWxsYmFjay8iLCJhY3QiOiJBVVRIRU5USUNBVEUiLCJub3RlcyI6eyJzY29wZSI6Im9wZW5pZCBlbWFpbCBwcm9maWxlIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0IiwicmVzcG9uc2VfdHlwZSI6ImNvZGUiLCJyZWRpcmVjdF91cmkiOiJodHRwOi8vdGVzdHNlcnZlci9vcmctb2lkYy9jYWxsYmFjay8iLCJzdGF0ZSI6Im5vdC1hLXJhbmRvbS1zdHJpbmciLCJub25jZSI6Im5vdC1hLXJhbmRvbS1zdHJpbmcifX0.PVsoxNQ0-_nJN1HEGMJ6H1byID8wg96CZXFzWiaCgQk
+ User-Agent:
+ - python-requests/2.32.2
+ method: POST
+ uri: http://localhost:8080/realms/test/login-actions/authenticate?session_code=geH0fJZKQdbUzuM7JbByYOV8X8Z9ilYQTOs2GL--eac&execution=d8b8778e-a545-45d4-8f72-fd69facf4b72&client_id=testid&tab_id=1Ny6e8qA11s
+ response:
+ body:
+ string: ''
+ headers:
+ Cache-Control:
+ - no-store, must-revalidate, max-age=0
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Location:
+ - http://testserver/org-oidc/callback/?state=not-a-random-string&session_state=21409fca-22ee-4b5b-acb9-1af85993d2af&iss=http%3A%2F%2Flocalhost%3A8080%2Frealms%2Ftest&code=3d18ef85-6e9e-4edf-af74-448e46a08359.21409fca-22ee-4b5b-acb9-1af85993d2af.adf4ad83-4550-4619-9231-73bd8d700f45
+ Referrer-Policy:
+ - no-referrer
+ Set-Cookie:
+ - KEYCLOAK_LOCALE=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test/; HttpOnly
+ - KC_RESTART=; Version=1; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0;
+ Path=/realms/test/; HttpOnly
+ - KC_AUTH_STATE=; Version=1; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0;
+ Path=/realms/test/
+ - KEYCLOAK_IDENTITY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTg2NTU0NjYsImlhdCI6MTcxODYxOTQ2NiwianRpIjoiMjJiNDVlM2UtZGViOC00YjcwLTlhNjQtM2E3MTUwY2MxMDI4IiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiNmRiMmRiODctZGUzMS00ZTMwLTlmMjUtY2VmZTVkYThiMTU0IiwidHlwIjoiU2VyaWFsaXplZC1JRCIsInNlc3Npb25fc3RhdGUiOiIyMTQwOWZjYS0yMmVlLTRiNWItYWNiOS0xYWY4NTk5M2QyYWYiLCJzaWQiOiIyMTQwOWZjYS0yMmVlLTRiNWItYWNiOS0xYWY4NTk5M2QyYWYiLCJzdGF0ZV9jaGVja2VyIjoiX0c0TkNKZjVYTVgwOE9XSjBmS2dSc2g5d3ZXNlAtaGs0WnpYNlpvNi1FRSJ9.DpIfsvg9MP97soD-1Vr7KQo2wsrNGGUrXiagvXoxTOE;
+ Version=1; Path=/realms/test/; SameSite=None; Secure; HttpOnly
+ - KEYCLOAK_IDENTITY_LEGACY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTg2NTU0NjYsImlhdCI6MTcxODYxOTQ2NiwianRpIjoiMjJiNDVlM2UtZGViOC00YjcwLTlhNjQtM2E3MTUwY2MxMDI4IiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiNmRiMmRiODctZGUzMS00ZTMwLTlmMjUtY2VmZTVkYThiMTU0IiwidHlwIjoiU2VyaWFsaXplZC1JRCIsInNlc3Npb25fc3RhdGUiOiIyMTQwOWZjYS0yMmVlLTRiNWItYWNiOS0xYWY4NTk5M2QyYWYiLCJzaWQiOiIyMTQwOWZjYS0yMmVlLTRiNWItYWNiOS0xYWY4NTk5M2QyYWYiLCJzdGF0ZV9jaGVja2VyIjoiX0c0TkNKZjVYTVgwOE9XSjBmS2dSc2g5d3ZXNlAtaGs0WnpYNlpvNi1FRSJ9.DpIfsvg9MP97soD-1Vr7KQo2wsrNGGUrXiagvXoxTOE;
+ Version=1; Path=/realms/test/; HttpOnly
+ - KEYCLOAK_SESSION=test/6db2db87-de31-4e30-9f25-cefe5da8b154/21409fca-22ee-4b5b-acb9-1af85993d2af;
+ Version=1; Expires=Mon, 17-Jun-2024 20:17:46 GMT; Max-Age=36000; Path=/realms/test/;
+ SameSite=None; Secure
+ - KEYCLOAK_SESSION_LEGACY=test/6db2db87-de31-4e30-9f25-cefe5da8b154/21409fca-22ee-4b5b-acb9-1af85993d2af;
+ Version=1; Expires=Mon, 17-Jun-2024 20:17:46 GMT; Max-Age=36000; Path=/realms/test/
+ - KEYCLOAK_REMEMBER_ME=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test/; HttpOnly
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '0'
+ status:
+ code: 302
+ message: Found
+- request:
+ body: client_id=testid&client_secret=7DB3KUAAizYCcmZufpHRVOcD0TOkNO3I&grant_type=authorization_code&code=3d18ef85-6e9e-4edf-af74-448e46a08359.21409fca-22ee-4b5b-acb9-1af85993d2af.adf4ad83-4550-4619-9231-73bd8d700f45&redirect_uri=http%3A%2F%2Ftestserver%2Forg-oidc%2Fcallback%2F
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '271'
+ Content-Type:
+ - application/x-www-form-urlencoded
+ User-Agent:
+ - python-requests/2.32.2
+ method: POST
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/token
+ response:
+ body:
+ string: '{"access_token":"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTg2MTk3NjYsImlhdCI6MTcxODYxOTQ2NiwiYXV0aF90aW1lIjoxNzE4NjE5NDY2LCJqdGkiOiJjODIyMjNlZC03Yzc4LTQzMGMtOWUxZC02ZGMwY2I5N2FkNzMiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiNmRiMmRiODctZGUzMS00ZTMwLTlmMjUtY2VmZTVkYThiMTU0IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoidGVzdGlkIiwibm9uY2UiOiJub3QtYS1yYW5kb20tc3RyaW5nIiwic2Vzc2lvbl9zdGF0ZSI6IjIxNDA5ZmNhLTIyZWUtNGI1Yi1hY2I5LTFhZjg1OTkzZDJhZiIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOlsiaHR0cDovLzEyNy4wLjAuMTo4MDAwIl0sInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJkZWZhdWx0LXJvbGVzLXRlc3QiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgZW1haWwgcHJvZmlsZSBrdmsgZ3JvdXBzIGJzbiIsInNpZCI6IjIxNDA5ZmNhLTIyZWUtNGI1Yi1hY2I5LTFhZjg1OTkzZDJhZiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJncm91cHMiOlsiUmVnaXN0cmVlcmRlcnMiLCJkZWZhdWx0LXJvbGVzLXRlc3QiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl0sInByZWZlcnJlZF91c2VybmFtZSI6ImFkbWluIiwiZW1haWwiOiJhZG1pbkBleGFtcGxlLmNvbSJ9.X4GEqnD5FZWP_VCa4rwIOe2RZ1a3ddItOEjka_fnkx2F2qB6epkpiiM2eGH49pbhvctnvWT5GLj19XZw4NQUI-wygrMwIf7zNB5MLAh8TOew0kzujoltQKo6WgjwIUY2DrH4TyyrmBMuMqZ5NHSFwBlwnchOJSKQCo-zt0RmpMTqVFm74vCp_J-TQ8Ba_mgGVdP3oTUvTbk-D0716IJepji6vgK8Sla3WmvHVMgWDzLal9kmsx6CwqPQHnGcsHGi3O053tZu8k-5q3HnucwAMVy8MlcHfzfz0rgULWR2ZKtWNwn8xCPQ-3aQNgiskqNC4X5fvkaUk3KMVbULmTKS-g","expires_in":300,"refresh_expires_in":1800,"refresh_token":"eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTg2MjEyNjYsImlhdCI6MTcxODYxOTQ2NiwianRpIjoiNWU1OGIwZDMtOTU0Mi00NzBiLWJkY2ItZGQ5NWQxYjM1MzQxIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0IiwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiNmRiMmRiODctZGUzMS00ZTMwLTlmMjUtY2VmZTVkYThiMTU0IiwidHlwIjoiUmVmcmVzaCIsImF6cCI6InRlc3RpZCIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsInNlc3Npb25fc3RhdGUiOiIyMTQwOWZjYS0yMmVlLTRiNWItYWNiOS0xYWY4NTk5M2QyYWYiLCJzY29wZSI6Im9wZW5pZCBlbWFpbCBwcm9maWxlIGt2ayBncm91cHMgYnNuIiwic2lkIjoiMjE0MDlmY2EtMjJlZS00YjViLWFjYjktMWFmODU5OTNkMmFmIn0.c-wrpZzKZM_q1AV3djPbmNkiq7KouYlR8AK6FWNOt40","token_type":"Bearer","id_token":"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTg2MTk3NjYsImlhdCI6MTcxODYxOTQ2NiwiYXV0aF90aW1lIjoxNzE4NjE5NDY2LCJqdGkiOiIyNmY5OGM2Yi0wOWFkLTRkYzctYWRlNy03ZGVlNzdiY2UyOTIiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJ0ZXN0aWQiLCJzdWIiOiI2ZGIyZGI4Ny1kZTMxLTRlMzAtOWYyNS1jZWZlNWRhOGIxNTQiLCJ0eXAiOiJJRCIsImF6cCI6InRlc3RpZCIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsInNlc3Npb25fc3RhdGUiOiIyMTQwOWZjYS0yMmVlLTRiNWItYWNiOS0xYWY4NTk5M2QyYWYiLCJhdF9oYXNoIjoiSjZIdXNSRHAwcWY5R1pmcUVnenV1ZyIsImFjciI6IjEiLCJzaWQiOiIyMTQwOWZjYS0yMmVlLTRiNWItYWNiOS0xYWY4NTk5M2QyYWYiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiZ3JvdXBzIjpbIlJlZ2lzdHJlZXJkZXJzIiwiZGVmYXVsdC1yb2xlcy10ZXN0Iiwib2ZmbGluZV9hY2Nlc3MiLCJ1bWFfYXV0aG9yaXphdGlvbiJdLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJhZG1pbiIsImVtYWlsIjoiYWRtaW5AZXhhbXBsZS5jb20ifQ.nXX0tUqTUVeUPnDK5QRpMPwYK5u8j-eOdsOKuhdHMyG_FhKyPlYl_Ghi6obexUt_z66AY7soHuNgd8dNAxsEvJg2OSsLqQOCQHDUPXufP1K4ZOlap1YMd4ttLEMXd3v_oOdqSmQrIYQPWMhjRymwha2ZXX0TI1xK0H2TtgivV92Uyoq_7r6Xl3qmKNIGgMWjXnQp7jPklVfOoQfAELaW9b0wywzecr_Zmce1Y7E3j_Xq5zjwUEWoqU5JoiQ0RW06AsVCY3f1YkjXMltbioe7BZwJOBzT7Psva0No3NwsuFc_9BvVy_px2abnfessynQnCv93F_bsh25U0IzBpDy_xg","not-before-policy":0,"session_state":"21409fca-22ee-4b5b-acb9-1af85993d2af","scope":"openid
+ email profile kvk groups bsn"}'
+ headers:
+ Cache-Control:
+ - no-store
+ Content-Type:
+ - application/json
+ Pragma:
+ - no-cache
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '3698'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.32.2
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/certs
+ response:
+ body:
+ string: '{"keys":[{"kid":"4UNQAcvUcv-DFUOx_4O1gt13OdJSotqEKPZurs2vQW8","kty":"RSA","alg":"RS256","use":"sig","n":"2DOZ0qHie73SuFVR7civrl6r82YUiAghfzaMowjCg0o06AF--2lIS7vNV_PbsVVznPAAMqVrNG-8CcevEzvVZMQD9nH4DI7xlOxK0lrYu8rmMeSfOvXVbBVsWBZe0jnGNukZqjwmRE5__ttJdxPfIBT5-2L6mguQbDfhSUEEdIW7y7UfOXvqLqEcBtoIEB-ORKDTUIQwGZM5mSCy-cY3cHvvZfZVgaUUy5NvujPRXTMje4n_hG0KfEV-40G9qC2_Xvx4EooJzBZ6FSThiWhCpwhIvzcQqB6M9lHW7nU6wADhYPNCa2OKWvphwZ_zbrF4B9dmS6Zli5rBvbox9Hh45w","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMLTANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANgzmdKh4nu90rhVUe3Ir65eq/NmFIgIIX82jKMIwoNKNOgBfvtpSEu7zVfz27FVc5zwADKlazRvvAnHrxM71WTEA/Zx+AyO8ZTsStJa2LvK5jHknzr11WwVbFgWXtI5xjbpGao8JkROf/7bSXcT3yAU+fti+poLkGw34UlBBHSFu8u1Hzl76i6hHAbaCBAfjkSg01CEMBmTOZkgsvnGN3B772X2VYGlFMuTb7oz0V0zI3uJ/4RtCnxFfuNBvagtv178eBKKCcwWehUk4YloQqcISL83EKgejPZR1u51OsAA4WDzQmtjilr6YcGf826xeAfXZkumZYuawb26MfR4eOcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAsnQG/Yi2g1XTCJn74hWv9MjxVAaZb4gBAc2AWm5VgAjhFEM9h6x6m1mQkq7JM4rIdAj8jw55Ok9CBVBIqq4G4cME3eUvVytkj2lC9zcRoAivjjZF2HPg7zNPa2TTR50asmHPRokppV6gewO/C+o5as+4P2zqDXBh61aRd/9kdQfkg14LBbH5/dYccAuvUqlTYC4IEPCvVmBNC1xsMjf0vohvoSjm9vL2bfqG/RJH0ScdCjOd5d2zju4/e2oVdluWm+vzKBQplc7tVMuKpn6LcLmVHiGNAl+EBIZH+WVLlTx0D1+kbHZsfLYG53lQg2LsvurRbWyF/a5fVM/oLTn5ag=="],"x5t":"H5xfs1pRtvX0HyVTskx7eTXx88U","x5t#S256":"XurVtKAIEyc4w9HCGOhnjoRHnYu4d9HCn_5YHmkScJg"},{"kid":"TV3Tl5jIY1nrJLSb53UKEubLR5gYiq9slq1SsDDg1HU","kty":"RSA","alg":"RSA-OAEP","use":"enc","n":"pNvU3ecpVHbJT4bCOEpw6cnV1yi65tB3I0bRF2ilLVOY944QRAGnjBBECPIzNbgqavghYp1j75F2nq6_ny1CYfoaxTV2iDpRUw8_f7sliYbl8FrLLat0S25ItlZrg5TEJHObvOqlG2_nXoeH36MRWwNhms2uCqfhn5VgtenIzpQIBolnM7zzGp21NvdJ1C_ZAUzkXC-l3oQ-BXTtpEVM4h2KpYh4gfZJWCbYij5d1e1YApKD6V61_Cs3Oa2OY7CAUyq5kgAWJZFDB6CpzIr226u3bV7F9RbrQu3Ybc_Lv33EwykscLznKWZY2Mbs3Iz_rFNv3sVX_vHpH4DHWlKu7Q","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMlzANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKTb1N3nKVR2yU+GwjhKcOnJ1dcouubQdyNG0RdopS1TmPeOEEQBp4wQRAjyMzW4Kmr4IWKdY++Rdp6uv58tQmH6GsU1dog6UVMPP3+7JYmG5fBayy2rdEtuSLZWa4OUxCRzm7zqpRtv516Hh9+jEVsDYZrNrgqn4Z+VYLXpyM6UCAaJZzO88xqdtTb3SdQv2QFM5Fwvpd6EPgV07aRFTOIdiqWIeIH2SVgm2Io+XdXtWAKSg+letfwrNzmtjmOwgFMquZIAFiWRQwegqcyK9turt21exfUW60Lt2G3Py799xMMpLHC85ylmWNjG7NyM/6xTb97FV/7x6R+Ax1pSru0CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAQGJHeTYSMvp0yndbIn7DLohO9lom5nRrx/bLyb7TiRfogyJEF6rQZ66CAkQFk5eMF878fsHTuMVjtmXVBnhojhVmK91HwjsNQu/8xR6QMXNKJQMvHR245vwUGxlWRw/36ObM1D7QjCd/q+FonpBEY4m5Y6Uz1U0HR2Cbh0E2afVlPLeV+F0LKrlyVMdIaWBGWftCGIKDAHaG/PD66zbAKtxerv2fBIDq100WHPhd57BZxX+2aGJp1IaRDgkxV0E/CjEy3+Knd8xbAgUSW0Tl6OTC75exIvlbzeluEBe0wlapAb7WvBKYsipSW8G8Ey7tjoolDT4AU82EaKUPstiMnA=="],"x5t":"AlfHDI0FOPQpt3RBAILt0dtW1yw","x5t#S256":"a7bhm8-JsnfY7bL_m8Yl72hgmp5516VZlFcVloKzk08"}]}'
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/json;charset=UTF-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '2909'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Authorization:
+ - Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTg2MTk3NjYsImlhdCI6MTcxODYxOTQ2NiwiYXV0aF90aW1lIjoxNzE4NjE5NDY2LCJqdGkiOiJjODIyMjNlZC03Yzc4LTQzMGMtOWUxZC02ZGMwY2I5N2FkNzMiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiNmRiMmRiODctZGUzMS00ZTMwLTlmMjUtY2VmZTVkYThiMTU0IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoidGVzdGlkIiwibm9uY2UiOiJub3QtYS1yYW5kb20tc3RyaW5nIiwic2Vzc2lvbl9zdGF0ZSI6IjIxNDA5ZmNhLTIyZWUtNGI1Yi1hY2I5LTFhZjg1OTkzZDJhZiIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOlsiaHR0cDovLzEyNy4wLjAuMTo4MDAwIl0sInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJkZWZhdWx0LXJvbGVzLXRlc3QiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgZW1haWwgcHJvZmlsZSBrdmsgZ3JvdXBzIGJzbiIsInNpZCI6IjIxNDA5ZmNhLTIyZWUtNGI1Yi1hY2I5LTFhZjg1OTkzZDJhZiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJncm91cHMiOlsiUmVnaXN0cmVlcmRlcnMiLCJkZWZhdWx0LXJvbGVzLXRlc3QiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl0sInByZWZlcnJlZF91c2VybmFtZSI6ImFkbWluIiwiZW1haWwiOiJhZG1pbkBleGFtcGxlLmNvbSJ9.X4GEqnD5FZWP_VCa4rwIOe2RZ1a3ddItOEjka_fnkx2F2qB6epkpiiM2eGH49pbhvctnvWT5GLj19XZw4NQUI-wygrMwIf7zNB5MLAh8TOew0kzujoltQKo6WgjwIUY2DrH4TyyrmBMuMqZ5NHSFwBlwnchOJSKQCo-zt0RmpMTqVFm74vCp_J-TQ8Ba_mgGVdP3oTUvTbk-D0716IJepji6vgK8Sla3WmvHVMgWDzLal9kmsx6CwqPQHnGcsHGi3O053tZu8k-5q3HnucwAMVy8MlcHfzfz0rgULWR2ZKtWNwn8xCPQ-3aQNgiskqNC4X5fvkaUk3KMVbULmTKS-g
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.32.2
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/userinfo
+ response:
+ body:
+ string: eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJzdWIiOiI2ZGIyZGI4Ny1kZTMxLTRlMzAtOWYyNS1jZWZlNWRhOGIxNTQiLCJhdWQiOiJ0ZXN0aWQiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0IiwiZ3JvdXBzIjpbIlJlZ2lzdHJlZXJkZXJzIiwiZGVmYXVsdC1yb2xlcy10ZXN0Iiwib2ZmbGluZV9hY2Nlc3MiLCJ1bWFfYXV0aG9yaXphdGlvbiJdLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJhZG1pbiIsImVtYWlsIjoiYWRtaW5AZXhhbXBsZS5jb20ifQ.vx4dCJ-Y-PEzjy8p7CNPB3yy0TyV_QugOHRbiV6UY3qHtZUnZqSsJD991QUostcYECuyTHefqfRtdCbvSJcPWI4ucosY65vshUMBtQeahsFOgNwWp2BvCkALJmEya4H_gh63vVlVZ2ZOSpWpah6eV2PNhiiYWD-Y9qEuLMzwngNvp5hna30BiRKAEsStB7izjE5pGECqkQm7pxCeZWHU81Lbh5fSo_2XvcGZ1Z-tf6DN95Oz4ers9YrG6dKSuh-HciY1zhv7mcee_tlJaeKjITue6r06163oKdjsYKRpiR4bLQ9256KafoxmU6O0IIlpkQhmtXrmaFSg0XyBYU8qcQ
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/jwt
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '813'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.32.2
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/certs
+ response:
+ body:
+ string: '{"keys":[{"kid":"4UNQAcvUcv-DFUOx_4O1gt13OdJSotqEKPZurs2vQW8","kty":"RSA","alg":"RS256","use":"sig","n":"2DOZ0qHie73SuFVR7civrl6r82YUiAghfzaMowjCg0o06AF--2lIS7vNV_PbsVVznPAAMqVrNG-8CcevEzvVZMQD9nH4DI7xlOxK0lrYu8rmMeSfOvXVbBVsWBZe0jnGNukZqjwmRE5__ttJdxPfIBT5-2L6mguQbDfhSUEEdIW7y7UfOXvqLqEcBtoIEB-ORKDTUIQwGZM5mSCy-cY3cHvvZfZVgaUUy5NvujPRXTMje4n_hG0KfEV-40G9qC2_Xvx4EooJzBZ6FSThiWhCpwhIvzcQqB6M9lHW7nU6wADhYPNCa2OKWvphwZ_zbrF4B9dmS6Zli5rBvbox9Hh45w","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMLTANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANgzmdKh4nu90rhVUe3Ir65eq/NmFIgIIX82jKMIwoNKNOgBfvtpSEu7zVfz27FVc5zwADKlazRvvAnHrxM71WTEA/Zx+AyO8ZTsStJa2LvK5jHknzr11WwVbFgWXtI5xjbpGao8JkROf/7bSXcT3yAU+fti+poLkGw34UlBBHSFu8u1Hzl76i6hHAbaCBAfjkSg01CEMBmTOZkgsvnGN3B772X2VYGlFMuTb7oz0V0zI3uJ/4RtCnxFfuNBvagtv178eBKKCcwWehUk4YloQqcISL83EKgejPZR1u51OsAA4WDzQmtjilr6YcGf826xeAfXZkumZYuawb26MfR4eOcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAsnQG/Yi2g1XTCJn74hWv9MjxVAaZb4gBAc2AWm5VgAjhFEM9h6x6m1mQkq7JM4rIdAj8jw55Ok9CBVBIqq4G4cME3eUvVytkj2lC9zcRoAivjjZF2HPg7zNPa2TTR50asmHPRokppV6gewO/C+o5as+4P2zqDXBh61aRd/9kdQfkg14LBbH5/dYccAuvUqlTYC4IEPCvVmBNC1xsMjf0vohvoSjm9vL2bfqG/RJH0ScdCjOd5d2zju4/e2oVdluWm+vzKBQplc7tVMuKpn6LcLmVHiGNAl+EBIZH+WVLlTx0D1+kbHZsfLYG53lQg2LsvurRbWyF/a5fVM/oLTn5ag=="],"x5t":"H5xfs1pRtvX0HyVTskx7eTXx88U","x5t#S256":"XurVtKAIEyc4w9HCGOhnjoRHnYu4d9HCn_5YHmkScJg"},{"kid":"TV3Tl5jIY1nrJLSb53UKEubLR5gYiq9slq1SsDDg1HU","kty":"RSA","alg":"RSA-OAEP","use":"enc","n":"pNvU3ecpVHbJT4bCOEpw6cnV1yi65tB3I0bRF2ilLVOY944QRAGnjBBECPIzNbgqavghYp1j75F2nq6_ny1CYfoaxTV2iDpRUw8_f7sliYbl8FrLLat0S25ItlZrg5TEJHObvOqlG2_nXoeH36MRWwNhms2uCqfhn5VgtenIzpQIBolnM7zzGp21NvdJ1C_ZAUzkXC-l3oQ-BXTtpEVM4h2KpYh4gfZJWCbYij5d1e1YApKD6V61_Cs3Oa2OY7CAUyq5kgAWJZFDB6CpzIr226u3bV7F9RbrQu3Ybc_Lv33EwykscLznKWZY2Mbs3Iz_rFNv3sVX_vHpH4DHWlKu7Q","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMlzANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKTb1N3nKVR2yU+GwjhKcOnJ1dcouubQdyNG0RdopS1TmPeOEEQBp4wQRAjyMzW4Kmr4IWKdY++Rdp6uv58tQmH6GsU1dog6UVMPP3+7JYmG5fBayy2rdEtuSLZWa4OUxCRzm7zqpRtv516Hh9+jEVsDYZrNrgqn4Z+VYLXpyM6UCAaJZzO88xqdtTb3SdQv2QFM5Fwvpd6EPgV07aRFTOIdiqWIeIH2SVgm2Io+XdXtWAKSg+letfwrNzmtjmOwgFMquZIAFiWRQwegqcyK9turt21exfUW60Lt2G3Py799xMMpLHC85ylmWNjG7NyM/6xTb97FV/7x6R+Ax1pSru0CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAQGJHeTYSMvp0yndbIn7DLohO9lom5nRrx/bLyb7TiRfogyJEF6rQZ66CAkQFk5eMF878fsHTuMVjtmXVBnhojhVmK91HwjsNQu/8xR6QMXNKJQMvHR245vwUGxlWRw/36ObM1D7QjCd/q+FonpBEY4m5Y6Uz1U0HR2Cbh0E2afVlPLeV+F0LKrlyVMdIaWBGWftCGIKDAHaG/PD66zbAKtxerv2fBIDq100WHPhd57BZxX+2aGJp1IaRDgkxV0E/CjEy3+Knd8xbAgUSW0Tl6OTC75exIvlbzeluEBe0wlapAb7WvBKYsipSW8G8Ey7tjoolDT4AU82EaKUPstiMnA=="],"x5t":"AlfHDI0FOPQpt3RBAILt0dtW1yw","x5t#S256":"a7bhm8-JsnfY7bL_m8Yl72hgmp5516VZlFcVloKzk08"}]}'
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/json;charset=UTF-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '2909'
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/src/openforms/authentication/contrib/org_oidc/tests/data/vcr_cassettes/OrgOIDCCallbackTests/OrgOIDCCallbackTests.test_logout_clears_session.yaml b/src/openforms/authentication/contrib/org_oidc/tests/data/vcr_cassettes/OrgOIDCCallbackTests/OrgOIDCCallbackTests.test_logout_clears_session.yaml
new file mode 100644
index 0000000000..f56c42ccdb
--- /dev/null
+++ b/src/openforms/authentication/contrib/org_oidc/tests/data/vcr_cassettes/OrgOIDCCallbackTests/OrgOIDCCallbackTests.test_logout_clears_session.yaml
@@ -0,0 +1,371 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.32.2
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n\n\n\n\n\n\n"
+ headers:
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '1573'
+ status:
+ code: 400
+ message: Bad Request
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.32.2
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth?response_type=code&scope=openid+email+profile&client_id=testid&redirect_uri=http%3A%2F%2Ftestserver%2Forg-oidc%2Fcallback%2F&state=not-a-random-string&nonce=not-a-random-string
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n \n\n\n\n\n
+ \ \n
\n
+ \ \n
\n
+ \
\n\n\n
\n \n\n\n\n\n\n
+ \
\n
\n\n
\n
\n\n\n"
+ headers:
+ Cache-Control:
+ - no-store, must-revalidate, max-age=0
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Set-Cookie:
+ - AUTH_SESSION_ID=94e938cf-5713-4a8a-8949-6199dd3c7060; Version=1; Path=/realms/test/;
+ SameSite=None; Secure; HttpOnly
+ - AUTH_SESSION_ID_LEGACY=94e938cf-5713-4a8a-8949-6199dd3c7060; Version=1; Path=/realms/test/;
+ HttpOnly
+ - KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJjaWQiOiJ0ZXN0aWQiLCJwdHkiOiJvcGVuaWQtY29ubmVjdCIsInJ1cmkiOiJodHRwOi8vdGVzdHNlcnZlci9vcmctb2lkYy9jYWxsYmFjay8iLCJhY3QiOiJBVVRIRU5USUNBVEUiLCJub3RlcyI6eyJzY29wZSI6Im9wZW5pZCBlbWFpbCBwcm9maWxlIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0IiwicmVzcG9uc2VfdHlwZSI6ImNvZGUiLCJyZWRpcmVjdF91cmkiOiJodHRwOi8vdGVzdHNlcnZlci9vcmctb2lkYy9jYWxsYmFjay8iLCJzdGF0ZSI6Im5vdC1hLXJhbmRvbS1zdHJpbmciLCJub25jZSI6Im5vdC1hLXJhbmRvbS1zdHJpbmcifX0.PVsoxNQ0-_nJN1HEGMJ6H1byID8wg96CZXFzWiaCgQk;
+ Version=1; Path=/realms/test/; HttpOnly
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '4466'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: username=admin&password=admin&credentialId=&login=Sign+In
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '57'
+ Content-Type:
+ - application/x-www-form-urlencoded
+ Cookie:
+ - AUTH_SESSION_ID_LEGACY=94e938cf-5713-4a8a-8949-6199dd3c7060; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJjaWQiOiJ0ZXN0aWQiLCJwdHkiOiJvcGVuaWQtY29ubmVjdCIsInJ1cmkiOiJodHRwOi8vdGVzdHNlcnZlci9vcmctb2lkYy9jYWxsYmFjay8iLCJhY3QiOiJBVVRIRU5USUNBVEUiLCJub3RlcyI6eyJzY29wZSI6Im9wZW5pZCBlbWFpbCBwcm9maWxlIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0IiwicmVzcG9uc2VfdHlwZSI6ImNvZGUiLCJyZWRpcmVjdF91cmkiOiJodHRwOi8vdGVzdHNlcnZlci9vcmctb2lkYy9jYWxsYmFjay8iLCJzdGF0ZSI6Im5vdC1hLXJhbmRvbS1zdHJpbmciLCJub25jZSI6Im5vdC1hLXJhbmRvbS1zdHJpbmcifX0.PVsoxNQ0-_nJN1HEGMJ6H1byID8wg96CZXFzWiaCgQk
+ User-Agent:
+ - python-requests/2.32.2
+ method: POST
+ uri: http://localhost:8080/realms/test/login-actions/authenticate?session_code=FoJaNyMsk4dhREemdWfeyDNDJWEseKlnopSUUeAjJyw&execution=d8b8778e-a545-45d4-8f72-fd69facf4b72&client_id=testid&tab_id=FBfqZdNCHlE
+ response:
+ body:
+ string: ''
+ headers:
+ Cache-Control:
+ - no-store, must-revalidate, max-age=0
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Location:
+ - http://testserver/org-oidc/callback/?state=not-a-random-string&session_state=94e938cf-5713-4a8a-8949-6199dd3c7060&iss=http%3A%2F%2Flocalhost%3A8080%2Frealms%2Ftest&code=b5b35b66-98a6-4d20-8f86-5f05b3032ddd.94e938cf-5713-4a8a-8949-6199dd3c7060.adf4ad83-4550-4619-9231-73bd8d700f45
+ Referrer-Policy:
+ - no-referrer
+ Set-Cookie:
+ - KEYCLOAK_LOCALE=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test/; HttpOnly
+ - KC_RESTART=; Version=1; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0;
+ Path=/realms/test/; HttpOnly
+ - KC_AUTH_STATE=; Version=1; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0;
+ Path=/realms/test/
+ - KEYCLOAK_IDENTITY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTg2NTU0NjcsImlhdCI6MTcxODYxOTQ2NywianRpIjoiMzYwZmM3NWItNTk0My00MzA2LTg3MDYtYzViZDRhZGU4MGY3IiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiNmRiMmRiODctZGUzMS00ZTMwLTlmMjUtY2VmZTVkYThiMTU0IiwidHlwIjoiU2VyaWFsaXplZC1JRCIsInNlc3Npb25fc3RhdGUiOiI5NGU5MzhjZi01NzEzLTRhOGEtODk0OS02MTk5ZGQzYzcwNjAiLCJzaWQiOiI5NGU5MzhjZi01NzEzLTRhOGEtODk0OS02MTk5ZGQzYzcwNjAiLCJzdGF0ZV9jaGVja2VyIjoic2Q2RWpseTFONGsycUZRM1Zsem9XN3FSUUZuSkJWSWlrZjVCX3EzbHliUSJ9.gE9M6x3HgJw1iJ18teNC5wU81sKwQz2Dva75Kp1z-xw;
+ Version=1; Path=/realms/test/; SameSite=None; Secure; HttpOnly
+ - KEYCLOAK_IDENTITY_LEGACY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTg2NTU0NjcsImlhdCI6MTcxODYxOTQ2NywianRpIjoiMzYwZmM3NWItNTk0My00MzA2LTg3MDYtYzViZDRhZGU4MGY3IiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiNmRiMmRiODctZGUzMS00ZTMwLTlmMjUtY2VmZTVkYThiMTU0IiwidHlwIjoiU2VyaWFsaXplZC1JRCIsInNlc3Npb25fc3RhdGUiOiI5NGU5MzhjZi01NzEzLTRhOGEtODk0OS02MTk5ZGQzYzcwNjAiLCJzaWQiOiI5NGU5MzhjZi01NzEzLTRhOGEtODk0OS02MTk5ZGQzYzcwNjAiLCJzdGF0ZV9jaGVja2VyIjoic2Q2RWpseTFONGsycUZRM1Zsem9XN3FSUUZuSkJWSWlrZjVCX3EzbHliUSJ9.gE9M6x3HgJw1iJ18teNC5wU81sKwQz2Dva75Kp1z-xw;
+ Version=1; Path=/realms/test/; HttpOnly
+ - KEYCLOAK_SESSION=test/6db2db87-de31-4e30-9f25-cefe5da8b154/94e938cf-5713-4a8a-8949-6199dd3c7060;
+ Version=1; Expires=Mon, 17-Jun-2024 20:17:47 GMT; Max-Age=36000; Path=/realms/test/;
+ SameSite=None; Secure
+ - KEYCLOAK_SESSION_LEGACY=test/6db2db87-de31-4e30-9f25-cefe5da8b154/94e938cf-5713-4a8a-8949-6199dd3c7060;
+ Version=1; Expires=Mon, 17-Jun-2024 20:17:47 GMT; Max-Age=36000; Path=/realms/test/
+ - KEYCLOAK_REMEMBER_ME=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test/; HttpOnly
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '0'
+ status:
+ code: 302
+ message: Found
+- request:
+ body: client_id=testid&client_secret=7DB3KUAAizYCcmZufpHRVOcD0TOkNO3I&grant_type=authorization_code&code=b5b35b66-98a6-4d20-8f86-5f05b3032ddd.94e938cf-5713-4a8a-8949-6199dd3c7060.adf4ad83-4550-4619-9231-73bd8d700f45&redirect_uri=http%3A%2F%2Ftestserver%2Forg-oidc%2Fcallback%2F
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '271'
+ Content-Type:
+ - application/x-www-form-urlencoded
+ User-Agent:
+ - python-requests/2.32.2
+ method: POST
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/token
+ response:
+ body:
+ string: '{"access_token":"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTg2MTk3NjcsImlhdCI6MTcxODYxOTQ2NywiYXV0aF90aW1lIjoxNzE4NjE5NDY3LCJqdGkiOiIzNTZjNTU3Yy1hMTE4LTQwMjItYjJiMy04NTU3MzEzYzQ5M2IiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiNmRiMmRiODctZGUzMS00ZTMwLTlmMjUtY2VmZTVkYThiMTU0IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoidGVzdGlkIiwibm9uY2UiOiJub3QtYS1yYW5kb20tc3RyaW5nIiwic2Vzc2lvbl9zdGF0ZSI6Ijk0ZTkzOGNmLTU3MTMtNGE4YS04OTQ5LTYxOTlkZDNjNzA2MCIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOlsiaHR0cDovLzEyNy4wLjAuMTo4MDAwIl0sInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJkZWZhdWx0LXJvbGVzLXRlc3QiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgZW1haWwgcHJvZmlsZSBrdmsgZ3JvdXBzIGJzbiIsInNpZCI6Ijk0ZTkzOGNmLTU3MTMtNGE4YS04OTQ5LTYxOTlkZDNjNzA2MCIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJncm91cHMiOlsiUmVnaXN0cmVlcmRlcnMiLCJkZWZhdWx0LXJvbGVzLXRlc3QiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl0sInByZWZlcnJlZF91c2VybmFtZSI6ImFkbWluIiwiZW1haWwiOiJhZG1pbkBleGFtcGxlLmNvbSJ9.q4ofWD-sgmuBm3fJJ2KYL0Py6IMkzxyAlK2EofrU3AZsp7aPc749KpLg1E1QRMeV6HIQClXQw87DT5RfF6b6u310716GTJQS5_xo3xsSCnOSjDCmbSExSDYcnaigh8l18G1WJM2AvypD0rbwwZNcJuZHkRIH85B317j5lOA9cx0jncYR--IKQ_XkFtY_mLoa_e-JXA3ZI_G06ry_AaYk4uZNY8bOI9K_6oOT4toZzqjZf5uIWSN1n8snMBqtxGPum9vCYafhV05gcCHRHiVaD3v-FVkmIUsvuJaF7n1ltU-moQEI315tV2QSk6PvQIiQNFDKQM9oYMrxkYon4r_YCQ","expires_in":300,"refresh_expires_in":1800,"refresh_token":"eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTg2MjEyNjcsImlhdCI6MTcxODYxOTQ2NywianRpIjoiN2ZlNmU4N2ItMmIzMC00NTZjLWJiNGEtMTZiNzZlZjI5ZDdhIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0IiwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiNmRiMmRiODctZGUzMS00ZTMwLTlmMjUtY2VmZTVkYThiMTU0IiwidHlwIjoiUmVmcmVzaCIsImF6cCI6InRlc3RpZCIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsInNlc3Npb25fc3RhdGUiOiI5NGU5MzhjZi01NzEzLTRhOGEtODk0OS02MTk5ZGQzYzcwNjAiLCJzY29wZSI6Im9wZW5pZCBlbWFpbCBwcm9maWxlIGt2ayBncm91cHMgYnNuIiwic2lkIjoiOTRlOTM4Y2YtNTcxMy00YThhLTg5NDktNjE5OWRkM2M3MDYwIn0.FN8xZ6scIMxv5mnLtvj1CFWwYZsBaWov15LhMDWzCTI","token_type":"Bearer","id_token":"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTg2MTk3NjcsImlhdCI6MTcxODYxOTQ2NywiYXV0aF90aW1lIjoxNzE4NjE5NDY3LCJqdGkiOiJjYTZhYjYyMS1lYmQxLTQ0MzAtYjVhNS1jYmQzNGFmY2ExMmQiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJ0ZXN0aWQiLCJzdWIiOiI2ZGIyZGI4Ny1kZTMxLTRlMzAtOWYyNS1jZWZlNWRhOGIxNTQiLCJ0eXAiOiJJRCIsImF6cCI6InRlc3RpZCIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsInNlc3Npb25fc3RhdGUiOiI5NGU5MzhjZi01NzEzLTRhOGEtODk0OS02MTk5ZGQzYzcwNjAiLCJhdF9oYXNoIjoiUlhfT0Z3eXd6UlJEOTZaODRzak0wUSIsImFjciI6IjEiLCJzaWQiOiI5NGU5MzhjZi01NzEzLTRhOGEtODk0OS02MTk5ZGQzYzcwNjAiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiZ3JvdXBzIjpbIlJlZ2lzdHJlZXJkZXJzIiwiZGVmYXVsdC1yb2xlcy10ZXN0Iiwib2ZmbGluZV9hY2Nlc3MiLCJ1bWFfYXV0aG9yaXphdGlvbiJdLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJhZG1pbiIsImVtYWlsIjoiYWRtaW5AZXhhbXBsZS5jb20ifQ.XO1TGW2w4iHybMdSej1wDlmcvqr6UoJAXrAJWsDMODCSVVL2q4WNGra4gMEad1nxJ3HKy3HJwNCNaYmK58ZnMl-Z6qqodtwt7tZ3OXcDFuxPGxL2b3va3UH06GYBWNtadEFBEbeYaxJDnJ1ClL1gNi88jsHlvCAOWvL8ct8BvmP8s2xWIeDyxtiiFKpmEPkU8IvBJSLtjBcvhs3owgleaHFzFikP92sIwnnvlcnS4scG56RAf0fthia7GqP-rnSOZV-J09i2TrCuEoMBErC5a5DpHOH3Y4EOZA5mV8REvtBPWKqMtSE-TU6YlPrszyTIokMx37yh1mNbaICiHr8G3A","not-before-policy":0,"session_state":"94e938cf-5713-4a8a-8949-6199dd3c7060","scope":"openid
+ email profile kvk groups bsn"}'
+ headers:
+ Cache-Control:
+ - no-store
+ Content-Type:
+ - application/json
+ Pragma:
+ - no-cache
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '3698'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.32.2
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/certs
+ response:
+ body:
+ string: '{"keys":[{"kid":"4UNQAcvUcv-DFUOx_4O1gt13OdJSotqEKPZurs2vQW8","kty":"RSA","alg":"RS256","use":"sig","n":"2DOZ0qHie73SuFVR7civrl6r82YUiAghfzaMowjCg0o06AF--2lIS7vNV_PbsVVznPAAMqVrNG-8CcevEzvVZMQD9nH4DI7xlOxK0lrYu8rmMeSfOvXVbBVsWBZe0jnGNukZqjwmRE5__ttJdxPfIBT5-2L6mguQbDfhSUEEdIW7y7UfOXvqLqEcBtoIEB-ORKDTUIQwGZM5mSCy-cY3cHvvZfZVgaUUy5NvujPRXTMje4n_hG0KfEV-40G9qC2_Xvx4EooJzBZ6FSThiWhCpwhIvzcQqB6M9lHW7nU6wADhYPNCa2OKWvphwZ_zbrF4B9dmS6Zli5rBvbox9Hh45w","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMLTANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANgzmdKh4nu90rhVUe3Ir65eq/NmFIgIIX82jKMIwoNKNOgBfvtpSEu7zVfz27FVc5zwADKlazRvvAnHrxM71WTEA/Zx+AyO8ZTsStJa2LvK5jHknzr11WwVbFgWXtI5xjbpGao8JkROf/7bSXcT3yAU+fti+poLkGw34UlBBHSFu8u1Hzl76i6hHAbaCBAfjkSg01CEMBmTOZkgsvnGN3B772X2VYGlFMuTb7oz0V0zI3uJ/4RtCnxFfuNBvagtv178eBKKCcwWehUk4YloQqcISL83EKgejPZR1u51OsAA4WDzQmtjilr6YcGf826xeAfXZkumZYuawb26MfR4eOcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAsnQG/Yi2g1XTCJn74hWv9MjxVAaZb4gBAc2AWm5VgAjhFEM9h6x6m1mQkq7JM4rIdAj8jw55Ok9CBVBIqq4G4cME3eUvVytkj2lC9zcRoAivjjZF2HPg7zNPa2TTR50asmHPRokppV6gewO/C+o5as+4P2zqDXBh61aRd/9kdQfkg14LBbH5/dYccAuvUqlTYC4IEPCvVmBNC1xsMjf0vohvoSjm9vL2bfqG/RJH0ScdCjOd5d2zju4/e2oVdluWm+vzKBQplc7tVMuKpn6LcLmVHiGNAl+EBIZH+WVLlTx0D1+kbHZsfLYG53lQg2LsvurRbWyF/a5fVM/oLTn5ag=="],"x5t":"H5xfs1pRtvX0HyVTskx7eTXx88U","x5t#S256":"XurVtKAIEyc4w9HCGOhnjoRHnYu4d9HCn_5YHmkScJg"},{"kid":"TV3Tl5jIY1nrJLSb53UKEubLR5gYiq9slq1SsDDg1HU","kty":"RSA","alg":"RSA-OAEP","use":"enc","n":"pNvU3ecpVHbJT4bCOEpw6cnV1yi65tB3I0bRF2ilLVOY944QRAGnjBBECPIzNbgqavghYp1j75F2nq6_ny1CYfoaxTV2iDpRUw8_f7sliYbl8FrLLat0S25ItlZrg5TEJHObvOqlG2_nXoeH36MRWwNhms2uCqfhn5VgtenIzpQIBolnM7zzGp21NvdJ1C_ZAUzkXC-l3oQ-BXTtpEVM4h2KpYh4gfZJWCbYij5d1e1YApKD6V61_Cs3Oa2OY7CAUyq5kgAWJZFDB6CpzIr226u3bV7F9RbrQu3Ybc_Lv33EwykscLznKWZY2Mbs3Iz_rFNv3sVX_vHpH4DHWlKu7Q","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMlzANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKTb1N3nKVR2yU+GwjhKcOnJ1dcouubQdyNG0RdopS1TmPeOEEQBp4wQRAjyMzW4Kmr4IWKdY++Rdp6uv58tQmH6GsU1dog6UVMPP3+7JYmG5fBayy2rdEtuSLZWa4OUxCRzm7zqpRtv516Hh9+jEVsDYZrNrgqn4Z+VYLXpyM6UCAaJZzO88xqdtTb3SdQv2QFM5Fwvpd6EPgV07aRFTOIdiqWIeIH2SVgm2Io+XdXtWAKSg+letfwrNzmtjmOwgFMquZIAFiWRQwegqcyK9turt21exfUW60Lt2G3Py799xMMpLHC85ylmWNjG7NyM/6xTb97FV/7x6R+Ax1pSru0CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAQGJHeTYSMvp0yndbIn7DLohO9lom5nRrx/bLyb7TiRfogyJEF6rQZ66CAkQFk5eMF878fsHTuMVjtmXVBnhojhVmK91HwjsNQu/8xR6QMXNKJQMvHR245vwUGxlWRw/36ObM1D7QjCd/q+FonpBEY4m5Y6Uz1U0HR2Cbh0E2afVlPLeV+F0LKrlyVMdIaWBGWftCGIKDAHaG/PD66zbAKtxerv2fBIDq100WHPhd57BZxX+2aGJp1IaRDgkxV0E/CjEy3+Knd8xbAgUSW0Tl6OTC75exIvlbzeluEBe0wlapAb7WvBKYsipSW8G8Ey7tjoolDT4AU82EaKUPstiMnA=="],"x5t":"AlfHDI0FOPQpt3RBAILt0dtW1yw","x5t#S256":"a7bhm8-JsnfY7bL_m8Yl72hgmp5516VZlFcVloKzk08"}]}'
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/json;charset=UTF-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '2909'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Authorization:
+ - Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTg2MTk3NjcsImlhdCI6MTcxODYxOTQ2NywiYXV0aF90aW1lIjoxNzE4NjE5NDY3LCJqdGkiOiIzNTZjNTU3Yy1hMTE4LTQwMjItYjJiMy04NTU3MzEzYzQ5M2IiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiNmRiMmRiODctZGUzMS00ZTMwLTlmMjUtY2VmZTVkYThiMTU0IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoidGVzdGlkIiwibm9uY2UiOiJub3QtYS1yYW5kb20tc3RyaW5nIiwic2Vzc2lvbl9zdGF0ZSI6Ijk0ZTkzOGNmLTU3MTMtNGE4YS04OTQ5LTYxOTlkZDNjNzA2MCIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOlsiaHR0cDovLzEyNy4wLjAuMTo4MDAwIl0sInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJkZWZhdWx0LXJvbGVzLXRlc3QiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgZW1haWwgcHJvZmlsZSBrdmsgZ3JvdXBzIGJzbiIsInNpZCI6Ijk0ZTkzOGNmLTU3MTMtNGE4YS04OTQ5LTYxOTlkZDNjNzA2MCIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJncm91cHMiOlsiUmVnaXN0cmVlcmRlcnMiLCJkZWZhdWx0LXJvbGVzLXRlc3QiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl0sInByZWZlcnJlZF91c2VybmFtZSI6ImFkbWluIiwiZW1haWwiOiJhZG1pbkBleGFtcGxlLmNvbSJ9.q4ofWD-sgmuBm3fJJ2KYL0Py6IMkzxyAlK2EofrU3AZsp7aPc749KpLg1E1QRMeV6HIQClXQw87DT5RfF6b6u310716GTJQS5_xo3xsSCnOSjDCmbSExSDYcnaigh8l18G1WJM2AvypD0rbwwZNcJuZHkRIH85B317j5lOA9cx0jncYR--IKQ_XkFtY_mLoa_e-JXA3ZI_G06ry_AaYk4uZNY8bOI9K_6oOT4toZzqjZf5uIWSN1n8snMBqtxGPum9vCYafhV05gcCHRHiVaD3v-FVkmIUsvuJaF7n1ltU-moQEI315tV2QSk6PvQIiQNFDKQM9oYMrxkYon4r_YCQ
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.32.2
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/userinfo
+ response:
+ body:
+ string: eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJzdWIiOiI2ZGIyZGI4Ny1kZTMxLTRlMzAtOWYyNS1jZWZlNWRhOGIxNTQiLCJhdWQiOiJ0ZXN0aWQiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0IiwiZ3JvdXBzIjpbIlJlZ2lzdHJlZXJkZXJzIiwiZGVmYXVsdC1yb2xlcy10ZXN0Iiwib2ZmbGluZV9hY2Nlc3MiLCJ1bWFfYXV0aG9yaXphdGlvbiJdLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJhZG1pbiIsImVtYWlsIjoiYWRtaW5AZXhhbXBsZS5jb20ifQ.vx4dCJ-Y-PEzjy8p7CNPB3yy0TyV_QugOHRbiV6UY3qHtZUnZqSsJD991QUostcYECuyTHefqfRtdCbvSJcPWI4ucosY65vshUMBtQeahsFOgNwWp2BvCkALJmEya4H_gh63vVlVZ2ZOSpWpah6eV2PNhiiYWD-Y9qEuLMzwngNvp5hna30BiRKAEsStB7izjE5pGECqkQm7pxCeZWHU81Lbh5fSo_2XvcGZ1Z-tf6DN95Oz4ers9YrG6dKSuh-HciY1zhv7mcee_tlJaeKjITue6r06163oKdjsYKRpiR4bLQ9256KafoxmU6O0IIlpkQhmtXrmaFSg0XyBYU8qcQ
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/jwt
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '813'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.32.2
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/certs
+ response:
+ body:
+ string: '{"keys":[{"kid":"4UNQAcvUcv-DFUOx_4O1gt13OdJSotqEKPZurs2vQW8","kty":"RSA","alg":"RS256","use":"sig","n":"2DOZ0qHie73SuFVR7civrl6r82YUiAghfzaMowjCg0o06AF--2lIS7vNV_PbsVVznPAAMqVrNG-8CcevEzvVZMQD9nH4DI7xlOxK0lrYu8rmMeSfOvXVbBVsWBZe0jnGNukZqjwmRE5__ttJdxPfIBT5-2L6mguQbDfhSUEEdIW7y7UfOXvqLqEcBtoIEB-ORKDTUIQwGZM5mSCy-cY3cHvvZfZVgaUUy5NvujPRXTMje4n_hG0KfEV-40G9qC2_Xvx4EooJzBZ6FSThiWhCpwhIvzcQqB6M9lHW7nU6wADhYPNCa2OKWvphwZ_zbrF4B9dmS6Zli5rBvbox9Hh45w","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMLTANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANgzmdKh4nu90rhVUe3Ir65eq/NmFIgIIX82jKMIwoNKNOgBfvtpSEu7zVfz27FVc5zwADKlazRvvAnHrxM71WTEA/Zx+AyO8ZTsStJa2LvK5jHknzr11WwVbFgWXtI5xjbpGao8JkROf/7bSXcT3yAU+fti+poLkGw34UlBBHSFu8u1Hzl76i6hHAbaCBAfjkSg01CEMBmTOZkgsvnGN3B772X2VYGlFMuTb7oz0V0zI3uJ/4RtCnxFfuNBvagtv178eBKKCcwWehUk4YloQqcISL83EKgejPZR1u51OsAA4WDzQmtjilr6YcGf826xeAfXZkumZYuawb26MfR4eOcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAsnQG/Yi2g1XTCJn74hWv9MjxVAaZb4gBAc2AWm5VgAjhFEM9h6x6m1mQkq7JM4rIdAj8jw55Ok9CBVBIqq4G4cME3eUvVytkj2lC9zcRoAivjjZF2HPg7zNPa2TTR50asmHPRokppV6gewO/C+o5as+4P2zqDXBh61aRd/9kdQfkg14LBbH5/dYccAuvUqlTYC4IEPCvVmBNC1xsMjf0vohvoSjm9vL2bfqG/RJH0ScdCjOd5d2zju4/e2oVdluWm+vzKBQplc7tVMuKpn6LcLmVHiGNAl+EBIZH+WVLlTx0D1+kbHZsfLYG53lQg2LsvurRbWyF/a5fVM/oLTn5ag=="],"x5t":"H5xfs1pRtvX0HyVTskx7eTXx88U","x5t#S256":"XurVtKAIEyc4w9HCGOhnjoRHnYu4d9HCn_5YHmkScJg"},{"kid":"TV3Tl5jIY1nrJLSb53UKEubLR5gYiq9slq1SsDDg1HU","kty":"RSA","alg":"RSA-OAEP","use":"enc","n":"pNvU3ecpVHbJT4bCOEpw6cnV1yi65tB3I0bRF2ilLVOY944QRAGnjBBECPIzNbgqavghYp1j75F2nq6_ny1CYfoaxTV2iDpRUw8_f7sliYbl8FrLLat0S25ItlZrg5TEJHObvOqlG2_nXoeH36MRWwNhms2uCqfhn5VgtenIzpQIBolnM7zzGp21NvdJ1C_ZAUzkXC-l3oQ-BXTtpEVM4h2KpYh4gfZJWCbYij5d1e1YApKD6V61_Cs3Oa2OY7CAUyq5kgAWJZFDB6CpzIr226u3bV7F9RbrQu3Ybc_Lv33EwykscLznKWZY2Mbs3Iz_rFNv3sVX_vHpH4DHWlKu7Q","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMlzANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKTb1N3nKVR2yU+GwjhKcOnJ1dcouubQdyNG0RdopS1TmPeOEEQBp4wQRAjyMzW4Kmr4IWKdY++Rdp6uv58tQmH6GsU1dog6UVMPP3+7JYmG5fBayy2rdEtuSLZWa4OUxCRzm7zqpRtv516Hh9+jEVsDYZrNrgqn4Z+VYLXpyM6UCAaJZzO88xqdtTb3SdQv2QFM5Fwvpd6EPgV07aRFTOIdiqWIeIH2SVgm2Io+XdXtWAKSg+letfwrNzmtjmOwgFMquZIAFiWRQwegqcyK9turt21exfUW60Lt2G3Py799xMMpLHC85ylmWNjG7NyM/6xTb97FV/7x6R+Ax1pSru0CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAQGJHeTYSMvp0yndbIn7DLohO9lom5nRrx/bLyb7TiRfogyJEF6rQZ66CAkQFk5eMF878fsHTuMVjtmXVBnhojhVmK91HwjsNQu/8xR6QMXNKJQMvHR245vwUGxlWRw/36ObM1D7QjCd/q+FonpBEY4m5Y6Uz1U0HR2Cbh0E2afVlPLeV+F0LKrlyVMdIaWBGWftCGIKDAHaG/PD66zbAKtxerv2fBIDq100WHPhd57BZxX+2aGJp1IaRDgkxV0E/CjEy3+Knd8xbAgUSW0Tl6OTC75exIvlbzeluEBe0wlapAb7WvBKYsipSW8G8Ey7tjoolDT4AU82EaKUPstiMnA=="],"x5t":"AlfHDI0FOPQpt3RBAILt0dtW1yw","x5t#S256":"a7bhm8-JsnfY7bL_m8Yl72hgmp5516VZlFcVloKzk08"}]}'
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/json;charset=UTF-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '2909'
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/src/openforms/authentication/contrib/org_oidc/tests/data/vcr_cassettes/OrgOIDCCallbackTests/OrgOIDCCallbackTests.test_redirects_after_successful_auth.yaml b/src/openforms/authentication/contrib/org_oidc/tests/data/vcr_cassettes/OrgOIDCCallbackTests/OrgOIDCCallbackTests.test_redirects_after_successful_auth.yaml
new file mode 100644
index 0000000000..8abd1bf137
--- /dev/null
+++ b/src/openforms/authentication/contrib/org_oidc/tests/data/vcr_cassettes/OrgOIDCCallbackTests/OrgOIDCCallbackTests.test_redirects_after_successful_auth.yaml
@@ -0,0 +1,371 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.32.2
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n\n\n\n\n\n\n"
+ headers:
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '1573'
+ status:
+ code: 400
+ message: Bad Request
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.32.2
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth?response_type=code&scope=openid+email+profile&client_id=testid&redirect_uri=http%3A%2F%2Ftestserver%2Forg-oidc%2Fcallback%2F&state=not-a-random-string&nonce=not-a-random-string
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n \n\n\n\n\n
+ \ \n
\n
+ \ \n
\n
+ \
\n\n\n
\n \n\n\n\n\n\n
+ \
\n
\n\n
\n
\n\n\n"
+ headers:
+ Cache-Control:
+ - no-store, must-revalidate, max-age=0
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Set-Cookie:
+ - AUTH_SESSION_ID=1b6bc28c-116c-48ff-a1d6-4bb7bb5fcf4b; Version=1; Path=/realms/test/;
+ SameSite=None; Secure; HttpOnly
+ - AUTH_SESSION_ID_LEGACY=1b6bc28c-116c-48ff-a1d6-4bb7bb5fcf4b; Version=1; Path=/realms/test/;
+ HttpOnly
+ - KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJjaWQiOiJ0ZXN0aWQiLCJwdHkiOiJvcGVuaWQtY29ubmVjdCIsInJ1cmkiOiJodHRwOi8vdGVzdHNlcnZlci9vcmctb2lkYy9jYWxsYmFjay8iLCJhY3QiOiJBVVRIRU5USUNBVEUiLCJub3RlcyI6eyJzY29wZSI6Im9wZW5pZCBlbWFpbCBwcm9maWxlIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0IiwicmVzcG9uc2VfdHlwZSI6ImNvZGUiLCJyZWRpcmVjdF91cmkiOiJodHRwOi8vdGVzdHNlcnZlci9vcmctb2lkYy9jYWxsYmFjay8iLCJzdGF0ZSI6Im5vdC1hLXJhbmRvbS1zdHJpbmciLCJub25jZSI6Im5vdC1hLXJhbmRvbS1zdHJpbmcifX0.PVsoxNQ0-_nJN1HEGMJ6H1byID8wg96CZXFzWiaCgQk;
+ Version=1; Path=/realms/test/; HttpOnly
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '4466'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: username=admin&password=admin&credentialId=&login=Sign+In
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '57'
+ Content-Type:
+ - application/x-www-form-urlencoded
+ Cookie:
+ - AUTH_SESSION_ID_LEGACY=1b6bc28c-116c-48ff-a1d6-4bb7bb5fcf4b; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJjaWQiOiJ0ZXN0aWQiLCJwdHkiOiJvcGVuaWQtY29ubmVjdCIsInJ1cmkiOiJodHRwOi8vdGVzdHNlcnZlci9vcmctb2lkYy9jYWxsYmFjay8iLCJhY3QiOiJBVVRIRU5USUNBVEUiLCJub3RlcyI6eyJzY29wZSI6Im9wZW5pZCBlbWFpbCBwcm9maWxlIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0IiwicmVzcG9uc2VfdHlwZSI6ImNvZGUiLCJyZWRpcmVjdF91cmkiOiJodHRwOi8vdGVzdHNlcnZlci9vcmctb2lkYy9jYWxsYmFjay8iLCJzdGF0ZSI6Im5vdC1hLXJhbmRvbS1zdHJpbmciLCJub25jZSI6Im5vdC1hLXJhbmRvbS1zdHJpbmcifX0.PVsoxNQ0-_nJN1HEGMJ6H1byID8wg96CZXFzWiaCgQk
+ User-Agent:
+ - python-requests/2.32.2
+ method: POST
+ uri: http://localhost:8080/realms/test/login-actions/authenticate?session_code=jhqkJzjDgj-jlabYBghyCO9l9yobat4bGu_mOk8nFGw&execution=d8b8778e-a545-45d4-8f72-fd69facf4b72&client_id=testid&tab_id=xTw7RWpE_iw
+ response:
+ body:
+ string: ''
+ headers:
+ Cache-Control:
+ - no-store, must-revalidate, max-age=0
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Location:
+ - http://testserver/org-oidc/callback/?state=not-a-random-string&session_state=1b6bc28c-116c-48ff-a1d6-4bb7bb5fcf4b&iss=http%3A%2F%2Flocalhost%3A8080%2Frealms%2Ftest&code=f045d507-e425-45fa-b1f4-d0376792320b.1b6bc28c-116c-48ff-a1d6-4bb7bb5fcf4b.adf4ad83-4550-4619-9231-73bd8d700f45
+ Referrer-Policy:
+ - no-referrer
+ Set-Cookie:
+ - KEYCLOAK_LOCALE=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test/; HttpOnly
+ - KC_RESTART=; Version=1; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0;
+ Path=/realms/test/; HttpOnly
+ - KC_AUTH_STATE=; Version=1; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0;
+ Path=/realms/test/
+ - KEYCLOAK_IDENTITY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTg2NTU0NjYsImlhdCI6MTcxODYxOTQ2NiwianRpIjoiODBjNDM4ZWUtZGFkYS00OTFmLWFiYTktMjdhZTc5MGYxMmQ1IiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiNmRiMmRiODctZGUzMS00ZTMwLTlmMjUtY2VmZTVkYThiMTU0IiwidHlwIjoiU2VyaWFsaXplZC1JRCIsInNlc3Npb25fc3RhdGUiOiIxYjZiYzI4Yy0xMTZjLTQ4ZmYtYTFkNi00YmI3YmI1ZmNmNGIiLCJzaWQiOiIxYjZiYzI4Yy0xMTZjLTQ4ZmYtYTFkNi00YmI3YmI1ZmNmNGIiLCJzdGF0ZV9jaGVja2VyIjoiamRGWVJGTHd2UnYxa2t5Mk9lM2JzZkNCSWJwaVhNLU5NdFBRdVRGbmFjMCJ9.9I-mUw8bQrod1Ai1a9kmeKElZuQGc2cfvbrH00DEbo8;
+ Version=1; Path=/realms/test/; SameSite=None; Secure; HttpOnly
+ - KEYCLOAK_IDENTITY_LEGACY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTg2NTU0NjYsImlhdCI6MTcxODYxOTQ2NiwianRpIjoiODBjNDM4ZWUtZGFkYS00OTFmLWFiYTktMjdhZTc5MGYxMmQ1IiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiNmRiMmRiODctZGUzMS00ZTMwLTlmMjUtY2VmZTVkYThiMTU0IiwidHlwIjoiU2VyaWFsaXplZC1JRCIsInNlc3Npb25fc3RhdGUiOiIxYjZiYzI4Yy0xMTZjLTQ4ZmYtYTFkNi00YmI3YmI1ZmNmNGIiLCJzaWQiOiIxYjZiYzI4Yy0xMTZjLTQ4ZmYtYTFkNi00YmI3YmI1ZmNmNGIiLCJzdGF0ZV9jaGVja2VyIjoiamRGWVJGTHd2UnYxa2t5Mk9lM2JzZkNCSWJwaVhNLU5NdFBRdVRGbmFjMCJ9.9I-mUw8bQrod1Ai1a9kmeKElZuQGc2cfvbrH00DEbo8;
+ Version=1; Path=/realms/test/; HttpOnly
+ - KEYCLOAK_SESSION=test/6db2db87-de31-4e30-9f25-cefe5da8b154/1b6bc28c-116c-48ff-a1d6-4bb7bb5fcf4b;
+ Version=1; Expires=Mon, 17-Jun-2024 20:17:46 GMT; Max-Age=36000; Path=/realms/test/;
+ SameSite=None; Secure
+ - KEYCLOAK_SESSION_LEGACY=test/6db2db87-de31-4e30-9f25-cefe5da8b154/1b6bc28c-116c-48ff-a1d6-4bb7bb5fcf4b;
+ Version=1; Expires=Mon, 17-Jun-2024 20:17:46 GMT; Max-Age=36000; Path=/realms/test/
+ - KEYCLOAK_REMEMBER_ME=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test/; HttpOnly
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '0'
+ status:
+ code: 302
+ message: Found
+- request:
+ body: client_id=testid&client_secret=7DB3KUAAizYCcmZufpHRVOcD0TOkNO3I&grant_type=authorization_code&code=f045d507-e425-45fa-b1f4-d0376792320b.1b6bc28c-116c-48ff-a1d6-4bb7bb5fcf4b.adf4ad83-4550-4619-9231-73bd8d700f45&redirect_uri=http%3A%2F%2Ftestserver%2Forg-oidc%2Fcallback%2F
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '271'
+ Content-Type:
+ - application/x-www-form-urlencoded
+ User-Agent:
+ - python-requests/2.32.2
+ method: POST
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/token
+ response:
+ body:
+ string: '{"access_token":"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTg2MTk3NjYsImlhdCI6MTcxODYxOTQ2NiwiYXV0aF90aW1lIjoxNzE4NjE5NDY2LCJqdGkiOiJlNWZlMGY0Ny1iODU4LTQ1MTktOGRiYi1lYzcwOTM5MmU2ZGIiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiNmRiMmRiODctZGUzMS00ZTMwLTlmMjUtY2VmZTVkYThiMTU0IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoidGVzdGlkIiwibm9uY2UiOiJub3QtYS1yYW5kb20tc3RyaW5nIiwic2Vzc2lvbl9zdGF0ZSI6IjFiNmJjMjhjLTExNmMtNDhmZi1hMWQ2LTRiYjdiYjVmY2Y0YiIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOlsiaHR0cDovLzEyNy4wLjAuMTo4MDAwIl0sInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJkZWZhdWx0LXJvbGVzLXRlc3QiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgZW1haWwgcHJvZmlsZSBrdmsgZ3JvdXBzIGJzbiIsInNpZCI6IjFiNmJjMjhjLTExNmMtNDhmZi1hMWQ2LTRiYjdiYjVmY2Y0YiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJncm91cHMiOlsiUmVnaXN0cmVlcmRlcnMiLCJkZWZhdWx0LXJvbGVzLXRlc3QiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl0sInByZWZlcnJlZF91c2VybmFtZSI6ImFkbWluIiwiZW1haWwiOiJhZG1pbkBleGFtcGxlLmNvbSJ9.fIneplc6raa75jQjieY37KZKajgJVqyQpcRpMTba3QNA-yrvL8NtALhRwqTCFtZsmsP9hvqRrzCpiwy-PrvkcSw6i526TMAevD840YxnHpd5wv6DfcWEncHl18n3adZuxubAqSG9CTnS_G3QFW_DCyMxkDDM10J_hEuFqdUOOV6DGJPPCwnUrOyRwTLY0mA2qbAkeflEftXLZJ2NcKpX-owEsJtVyzyPeGvbiRQEx5Gt5FF9ODUog27FLkxJ8N3mt9YVbyTqrrjR9YY4zZrKsyLz88LackCs_reCxp5Ihb344G7qkDF3BDO19MoCFFdA0AS8bNVr8GPPEp7V4e8XeQ","expires_in":300,"refresh_expires_in":1800,"refresh_token":"eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTg2MjEyNjYsImlhdCI6MTcxODYxOTQ2NiwianRpIjoiMzVjMDY0ZTgtZGNjZC00MjgwLThiOTMtMTNkM2UwYWZmOTE3IiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0IiwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiNmRiMmRiODctZGUzMS00ZTMwLTlmMjUtY2VmZTVkYThiMTU0IiwidHlwIjoiUmVmcmVzaCIsImF6cCI6InRlc3RpZCIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsInNlc3Npb25fc3RhdGUiOiIxYjZiYzI4Yy0xMTZjLTQ4ZmYtYTFkNi00YmI3YmI1ZmNmNGIiLCJzY29wZSI6Im9wZW5pZCBlbWFpbCBwcm9maWxlIGt2ayBncm91cHMgYnNuIiwic2lkIjoiMWI2YmMyOGMtMTE2Yy00OGZmLWExZDYtNGJiN2JiNWZjZjRiIn0.KdiWK1x-lAZpLdO2fOKkt27pyNvw8anUBw9gy_4S_Nk","token_type":"Bearer","id_token":"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTg2MTk3NjYsImlhdCI6MTcxODYxOTQ2NiwiYXV0aF90aW1lIjoxNzE4NjE5NDY2LCJqdGkiOiJjMmZkYmM1NS02MjM5LTQ4YWEtOGMyNC1kNjdhOGZiZTIwYjkiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJ0ZXN0aWQiLCJzdWIiOiI2ZGIyZGI4Ny1kZTMxLTRlMzAtOWYyNS1jZWZlNWRhOGIxNTQiLCJ0eXAiOiJJRCIsImF6cCI6InRlc3RpZCIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsInNlc3Npb25fc3RhdGUiOiIxYjZiYzI4Yy0xMTZjLTQ4ZmYtYTFkNi00YmI3YmI1ZmNmNGIiLCJhdF9oYXNoIjoiUllaUHNpRC1uRk8xMmRaZ08xanhfQSIsImFjciI6IjEiLCJzaWQiOiIxYjZiYzI4Yy0xMTZjLTQ4ZmYtYTFkNi00YmI3YmI1ZmNmNGIiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiZ3JvdXBzIjpbIlJlZ2lzdHJlZXJkZXJzIiwiZGVmYXVsdC1yb2xlcy10ZXN0Iiwib2ZmbGluZV9hY2Nlc3MiLCJ1bWFfYXV0aG9yaXphdGlvbiJdLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJhZG1pbiIsImVtYWlsIjoiYWRtaW5AZXhhbXBsZS5jb20ifQ.GvMenUspM--Mybpz5wiFQNhDYJE9wgYpYxb56VylBPL-N0DhOhaT84uu0JgXduTeKi6G3WRJV6HycOm_eNPHOhE5TWMsxG5zkGwDiUApFUdaxpQf_IP30ZVHXGOsi7DyVCknnZy2_Y71-k8PrfNGOMoh4AkkcgMogI8Caeuq3dqUGmPo2d1aU1jF2NQISP33Zr5qIVJQYSrQPK4waynnXXShSNn-DRdA5jkRIygZcOuyWiIfSBJYSBbrVQGSSC7a5qrHBtDPD7xe8f1pZK9hxaK-WiyUmQYn2n4TTkAy5OkI0vOF9oc7SLH5kxFeFLUTHCqShilgTenH1uIatjjNBA","not-before-policy":0,"session_state":"1b6bc28c-116c-48ff-a1d6-4bb7bb5fcf4b","scope":"openid
+ email profile kvk groups bsn"}'
+ headers:
+ Cache-Control:
+ - no-store
+ Content-Type:
+ - application/json
+ Pragma:
+ - no-cache
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '3698'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.32.2
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/certs
+ response:
+ body:
+ string: '{"keys":[{"kid":"4UNQAcvUcv-DFUOx_4O1gt13OdJSotqEKPZurs2vQW8","kty":"RSA","alg":"RS256","use":"sig","n":"2DOZ0qHie73SuFVR7civrl6r82YUiAghfzaMowjCg0o06AF--2lIS7vNV_PbsVVznPAAMqVrNG-8CcevEzvVZMQD9nH4DI7xlOxK0lrYu8rmMeSfOvXVbBVsWBZe0jnGNukZqjwmRE5__ttJdxPfIBT5-2L6mguQbDfhSUEEdIW7y7UfOXvqLqEcBtoIEB-ORKDTUIQwGZM5mSCy-cY3cHvvZfZVgaUUy5NvujPRXTMje4n_hG0KfEV-40G9qC2_Xvx4EooJzBZ6FSThiWhCpwhIvzcQqB6M9lHW7nU6wADhYPNCa2OKWvphwZ_zbrF4B9dmS6Zli5rBvbox9Hh45w","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMLTANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANgzmdKh4nu90rhVUe3Ir65eq/NmFIgIIX82jKMIwoNKNOgBfvtpSEu7zVfz27FVc5zwADKlazRvvAnHrxM71WTEA/Zx+AyO8ZTsStJa2LvK5jHknzr11WwVbFgWXtI5xjbpGao8JkROf/7bSXcT3yAU+fti+poLkGw34UlBBHSFu8u1Hzl76i6hHAbaCBAfjkSg01CEMBmTOZkgsvnGN3B772X2VYGlFMuTb7oz0V0zI3uJ/4RtCnxFfuNBvagtv178eBKKCcwWehUk4YloQqcISL83EKgejPZR1u51OsAA4WDzQmtjilr6YcGf826xeAfXZkumZYuawb26MfR4eOcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAsnQG/Yi2g1XTCJn74hWv9MjxVAaZb4gBAc2AWm5VgAjhFEM9h6x6m1mQkq7JM4rIdAj8jw55Ok9CBVBIqq4G4cME3eUvVytkj2lC9zcRoAivjjZF2HPg7zNPa2TTR50asmHPRokppV6gewO/C+o5as+4P2zqDXBh61aRd/9kdQfkg14LBbH5/dYccAuvUqlTYC4IEPCvVmBNC1xsMjf0vohvoSjm9vL2bfqG/RJH0ScdCjOd5d2zju4/e2oVdluWm+vzKBQplc7tVMuKpn6LcLmVHiGNAl+EBIZH+WVLlTx0D1+kbHZsfLYG53lQg2LsvurRbWyF/a5fVM/oLTn5ag=="],"x5t":"H5xfs1pRtvX0HyVTskx7eTXx88U","x5t#S256":"XurVtKAIEyc4w9HCGOhnjoRHnYu4d9HCn_5YHmkScJg"},{"kid":"TV3Tl5jIY1nrJLSb53UKEubLR5gYiq9slq1SsDDg1HU","kty":"RSA","alg":"RSA-OAEP","use":"enc","n":"pNvU3ecpVHbJT4bCOEpw6cnV1yi65tB3I0bRF2ilLVOY944QRAGnjBBECPIzNbgqavghYp1j75F2nq6_ny1CYfoaxTV2iDpRUw8_f7sliYbl8FrLLat0S25ItlZrg5TEJHObvOqlG2_nXoeH36MRWwNhms2uCqfhn5VgtenIzpQIBolnM7zzGp21NvdJ1C_ZAUzkXC-l3oQ-BXTtpEVM4h2KpYh4gfZJWCbYij5d1e1YApKD6V61_Cs3Oa2OY7CAUyq5kgAWJZFDB6CpzIr226u3bV7F9RbrQu3Ybc_Lv33EwykscLznKWZY2Mbs3Iz_rFNv3sVX_vHpH4DHWlKu7Q","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMlzANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKTb1N3nKVR2yU+GwjhKcOnJ1dcouubQdyNG0RdopS1TmPeOEEQBp4wQRAjyMzW4Kmr4IWKdY++Rdp6uv58tQmH6GsU1dog6UVMPP3+7JYmG5fBayy2rdEtuSLZWa4OUxCRzm7zqpRtv516Hh9+jEVsDYZrNrgqn4Z+VYLXpyM6UCAaJZzO88xqdtTb3SdQv2QFM5Fwvpd6EPgV07aRFTOIdiqWIeIH2SVgm2Io+XdXtWAKSg+letfwrNzmtjmOwgFMquZIAFiWRQwegqcyK9turt21exfUW60Lt2G3Py799xMMpLHC85ylmWNjG7NyM/6xTb97FV/7x6R+Ax1pSru0CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAQGJHeTYSMvp0yndbIn7DLohO9lom5nRrx/bLyb7TiRfogyJEF6rQZ66CAkQFk5eMF878fsHTuMVjtmXVBnhojhVmK91HwjsNQu/8xR6QMXNKJQMvHR245vwUGxlWRw/36ObM1D7QjCd/q+FonpBEY4m5Y6Uz1U0HR2Cbh0E2afVlPLeV+F0LKrlyVMdIaWBGWftCGIKDAHaG/PD66zbAKtxerv2fBIDq100WHPhd57BZxX+2aGJp1IaRDgkxV0E/CjEy3+Knd8xbAgUSW0Tl6OTC75exIvlbzeluEBe0wlapAb7WvBKYsipSW8G8Ey7tjoolDT4AU82EaKUPstiMnA=="],"x5t":"AlfHDI0FOPQpt3RBAILt0dtW1yw","x5t#S256":"a7bhm8-JsnfY7bL_m8Yl72hgmp5516VZlFcVloKzk08"}]}'
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/json;charset=UTF-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '2909'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Authorization:
+ - Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTg2MTk3NjYsImlhdCI6MTcxODYxOTQ2NiwiYXV0aF90aW1lIjoxNzE4NjE5NDY2LCJqdGkiOiJlNWZlMGY0Ny1iODU4LTQ1MTktOGRiYi1lYzcwOTM5MmU2ZGIiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiNmRiMmRiODctZGUzMS00ZTMwLTlmMjUtY2VmZTVkYThiMTU0IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoidGVzdGlkIiwibm9uY2UiOiJub3QtYS1yYW5kb20tc3RyaW5nIiwic2Vzc2lvbl9zdGF0ZSI6IjFiNmJjMjhjLTExNmMtNDhmZi1hMWQ2LTRiYjdiYjVmY2Y0YiIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOlsiaHR0cDovLzEyNy4wLjAuMTo4MDAwIl0sInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJkZWZhdWx0LXJvbGVzLXRlc3QiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgZW1haWwgcHJvZmlsZSBrdmsgZ3JvdXBzIGJzbiIsInNpZCI6IjFiNmJjMjhjLTExNmMtNDhmZi1hMWQ2LTRiYjdiYjVmY2Y0YiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJncm91cHMiOlsiUmVnaXN0cmVlcmRlcnMiLCJkZWZhdWx0LXJvbGVzLXRlc3QiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl0sInByZWZlcnJlZF91c2VybmFtZSI6ImFkbWluIiwiZW1haWwiOiJhZG1pbkBleGFtcGxlLmNvbSJ9.fIneplc6raa75jQjieY37KZKajgJVqyQpcRpMTba3QNA-yrvL8NtALhRwqTCFtZsmsP9hvqRrzCpiwy-PrvkcSw6i526TMAevD840YxnHpd5wv6DfcWEncHl18n3adZuxubAqSG9CTnS_G3QFW_DCyMxkDDM10J_hEuFqdUOOV6DGJPPCwnUrOyRwTLY0mA2qbAkeflEftXLZJ2NcKpX-owEsJtVyzyPeGvbiRQEx5Gt5FF9ODUog27FLkxJ8N3mt9YVbyTqrrjR9YY4zZrKsyLz88LackCs_reCxp5Ihb344G7qkDF3BDO19MoCFFdA0AS8bNVr8GPPEp7V4e8XeQ
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.32.2
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/userinfo
+ response:
+ body:
+ string: eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJzdWIiOiI2ZGIyZGI4Ny1kZTMxLTRlMzAtOWYyNS1jZWZlNWRhOGIxNTQiLCJhdWQiOiJ0ZXN0aWQiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0IiwiZ3JvdXBzIjpbIlJlZ2lzdHJlZXJkZXJzIiwiZGVmYXVsdC1yb2xlcy10ZXN0Iiwib2ZmbGluZV9hY2Nlc3MiLCJ1bWFfYXV0aG9yaXphdGlvbiJdLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJhZG1pbiIsImVtYWlsIjoiYWRtaW5AZXhhbXBsZS5jb20ifQ.vx4dCJ-Y-PEzjy8p7CNPB3yy0TyV_QugOHRbiV6UY3qHtZUnZqSsJD991QUostcYECuyTHefqfRtdCbvSJcPWI4ucosY65vshUMBtQeahsFOgNwWp2BvCkALJmEya4H_gh63vVlVZ2ZOSpWpah6eV2PNhiiYWD-Y9qEuLMzwngNvp5hna30BiRKAEsStB7izjE5pGECqkQm7pxCeZWHU81Lbh5fSo_2XvcGZ1Z-tf6DN95Oz4ers9YrG6dKSuh-HciY1zhv7mcee_tlJaeKjITue6r06163oKdjsYKRpiR4bLQ9256KafoxmU6O0IIlpkQhmtXrmaFSg0XyBYU8qcQ
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/jwt
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '813'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.32.2
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/certs
+ response:
+ body:
+ string: '{"keys":[{"kid":"4UNQAcvUcv-DFUOx_4O1gt13OdJSotqEKPZurs2vQW8","kty":"RSA","alg":"RS256","use":"sig","n":"2DOZ0qHie73SuFVR7civrl6r82YUiAghfzaMowjCg0o06AF--2lIS7vNV_PbsVVznPAAMqVrNG-8CcevEzvVZMQD9nH4DI7xlOxK0lrYu8rmMeSfOvXVbBVsWBZe0jnGNukZqjwmRE5__ttJdxPfIBT5-2L6mguQbDfhSUEEdIW7y7UfOXvqLqEcBtoIEB-ORKDTUIQwGZM5mSCy-cY3cHvvZfZVgaUUy5NvujPRXTMje4n_hG0KfEV-40G9qC2_Xvx4EooJzBZ6FSThiWhCpwhIvzcQqB6M9lHW7nU6wADhYPNCa2OKWvphwZ_zbrF4B9dmS6Zli5rBvbox9Hh45w","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMLTANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANgzmdKh4nu90rhVUe3Ir65eq/NmFIgIIX82jKMIwoNKNOgBfvtpSEu7zVfz27FVc5zwADKlazRvvAnHrxM71WTEA/Zx+AyO8ZTsStJa2LvK5jHknzr11WwVbFgWXtI5xjbpGao8JkROf/7bSXcT3yAU+fti+poLkGw34UlBBHSFu8u1Hzl76i6hHAbaCBAfjkSg01CEMBmTOZkgsvnGN3B772X2VYGlFMuTb7oz0V0zI3uJ/4RtCnxFfuNBvagtv178eBKKCcwWehUk4YloQqcISL83EKgejPZR1u51OsAA4WDzQmtjilr6YcGf826xeAfXZkumZYuawb26MfR4eOcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAsnQG/Yi2g1XTCJn74hWv9MjxVAaZb4gBAc2AWm5VgAjhFEM9h6x6m1mQkq7JM4rIdAj8jw55Ok9CBVBIqq4G4cME3eUvVytkj2lC9zcRoAivjjZF2HPg7zNPa2TTR50asmHPRokppV6gewO/C+o5as+4P2zqDXBh61aRd/9kdQfkg14LBbH5/dYccAuvUqlTYC4IEPCvVmBNC1xsMjf0vohvoSjm9vL2bfqG/RJH0ScdCjOd5d2zju4/e2oVdluWm+vzKBQplc7tVMuKpn6LcLmVHiGNAl+EBIZH+WVLlTx0D1+kbHZsfLYG53lQg2LsvurRbWyF/a5fVM/oLTn5ag=="],"x5t":"H5xfs1pRtvX0HyVTskx7eTXx88U","x5t#S256":"XurVtKAIEyc4w9HCGOhnjoRHnYu4d9HCn_5YHmkScJg"},{"kid":"TV3Tl5jIY1nrJLSb53UKEubLR5gYiq9slq1SsDDg1HU","kty":"RSA","alg":"RSA-OAEP","use":"enc","n":"pNvU3ecpVHbJT4bCOEpw6cnV1yi65tB3I0bRF2ilLVOY944QRAGnjBBECPIzNbgqavghYp1j75F2nq6_ny1CYfoaxTV2iDpRUw8_f7sliYbl8FrLLat0S25ItlZrg5TEJHObvOqlG2_nXoeH36MRWwNhms2uCqfhn5VgtenIzpQIBolnM7zzGp21NvdJ1C_ZAUzkXC-l3oQ-BXTtpEVM4h2KpYh4gfZJWCbYij5d1e1YApKD6V61_Cs3Oa2OY7CAUyq5kgAWJZFDB6CpzIr226u3bV7F9RbrQu3Ybc_Lv33EwykscLznKWZY2Mbs3Iz_rFNv3sVX_vHpH4DHWlKu7Q","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMlzANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKTb1N3nKVR2yU+GwjhKcOnJ1dcouubQdyNG0RdopS1TmPeOEEQBp4wQRAjyMzW4Kmr4IWKdY++Rdp6uv58tQmH6GsU1dog6UVMPP3+7JYmG5fBayy2rdEtuSLZWa4OUxCRzm7zqpRtv516Hh9+jEVsDYZrNrgqn4Z+VYLXpyM6UCAaJZzO88xqdtTb3SdQv2QFM5Fwvpd6EPgV07aRFTOIdiqWIeIH2SVgm2Io+XdXtWAKSg+letfwrNzmtjmOwgFMquZIAFiWRQwegqcyK9turt21exfUW60Lt2G3Py799xMMpLHC85ylmWNjG7NyM/6xTb97FV/7x6R+Ax1pSru0CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAQGJHeTYSMvp0yndbIn7DLohO9lom5nRrx/bLyb7TiRfogyJEF6rQZ66CAkQFk5eMF878fsHTuMVjtmXVBnhojhVmK91HwjsNQu/8xR6QMXNKJQMvHR245vwUGxlWRw/36ObM1D7QjCd/q+FonpBEY4m5Y6Uz1U0HR2Cbh0E2afVlPLeV+F0LKrlyVMdIaWBGWftCGIKDAHaG/PD66zbAKtxerv2fBIDq100WHPhd57BZxX+2aGJp1IaRDgkxV0E/CjEy3+Knd8xbAgUSW0Tl6OTC75exIvlbzeluEBe0wlapAb7WvBKYsipSW8G8Ey7tjoolDT4AU82EaKUPstiMnA=="],"x5t":"AlfHDI0FOPQpt3RBAILt0dtW1yw","x5t#S256":"a7bhm8-JsnfY7bL_m8Yl72hgmp5516VZlFcVloKzk08"}]}'
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/json;charset=UTF-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '2909'
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/src/openforms/authentication/contrib/org_oidc/tests/data/vcr_cassettes/OrgOIDCInitTests/OrgOIDCInitTests.test_idp_availability_check.yaml b/src/openforms/authentication/contrib/org_oidc/tests/data/vcr_cassettes/OrgOIDCInitTests/OrgOIDCInitTests.test_idp_availability_check.yaml
new file mode 100644
index 0000000000..d512781a71
--- /dev/null
+++ b/src/openforms/authentication/contrib/org_oidc/tests/data/vcr_cassettes/OrgOIDCInitTests/OrgOIDCInitTests.test_idp_availability_check.yaml
@@ -0,0 +1,26 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.32.2
+ method: GET
+ uri: http://localhost:8080/i-dont-exist
+ response:
+ body:
+ string: '{"error":"Unable to find matching target resource method"}'
+ headers:
+ Content-Type:
+ - application/json
+ content-length:
+ - '58'
+ status:
+ code: 404
+ message: Not Found
+version: 1
diff --git a/src/openforms/authentication/contrib/org_oidc/tests/data/vcr_cassettes/OrgOIDCInitTests/OrgOIDCInitTests.test_start_flow_logs_out_existing_user.yaml b/src/openforms/authentication/contrib/org_oidc/tests/data/vcr_cassettes/OrgOIDCInitTests/OrgOIDCInitTests.test_start_flow_logs_out_existing_user.yaml
new file mode 100644
index 0000000000..d14e754130
--- /dev/null
+++ b/src/openforms/authentication/contrib/org_oidc/tests/data/vcr_cassettes/OrgOIDCInitTests/OrgOIDCInitTests.test_start_flow_logs_out_existing_user.yaml
@@ -0,0 +1,59 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.32.2
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n\n\n\n\n\n\n"
+ headers:
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '1573'
+ status:
+ code: 400
+ message: Bad Request
+version: 1
diff --git a/src/openforms/authentication/contrib/org_oidc/tests/data/vcr_cassettes/OrgOIDCInitTests/OrgOIDCInitTests.test_start_flow_redirects_to_oidc_provider.yaml b/src/openforms/authentication/contrib/org_oidc/tests/data/vcr_cassettes/OrgOIDCInitTests/OrgOIDCInitTests.test_start_flow_redirects_to_oidc_provider.yaml
new file mode 100644
index 0000000000..d14e754130
--- /dev/null
+++ b/src/openforms/authentication/contrib/org_oidc/tests/data/vcr_cassettes/OrgOIDCInitTests/OrgOIDCInitTests.test_start_flow_redirects_to_oidc_provider.yaml
@@ -0,0 +1,59 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.32.2
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n\n\n\n\n\n\n"
+ headers:
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '1573'
+ status:
+ code: 400
+ message: Bad Request
+version: 1
diff --git a/src/openforms/authentication/contrib/org_oidc/tests/test_auth_flow_callbacks.py b/src/openforms/authentication/contrib/org_oidc/tests/test_auth_flow_callbacks.py
new file mode 100644
index 0000000000..aa63fef47f
--- /dev/null
+++ b/src/openforms/authentication/contrib/org_oidc/tests/test_auth_flow_callbacks.py
@@ -0,0 +1,105 @@
+"""
+Test the authentication flow for a form.
+
+These tests use VCR. When re-recording, making sure to:
+
+.. code-block:: bash
+
+ cd docker
+ docker compose -f docker-compose.keycloak.yml up
+
+to bring up a Keycloak instance.
+"""
+
+from django.contrib.auth.models import Group
+from django.test import override_settings
+
+from furl import furl
+
+from openforms.accounts.models import User
+from openforms.authentication.constants import FORM_AUTH_SESSION_KEY, AuthAttribute
+from openforms.authentication.tests.utils import URLsHelper
+from openforms.authentication.views import BACKEND_OUTAGE_RESPONSE_PARAMETER
+from openforms.forms.tests.factories import FormFactory
+from openforms.utils.tests.keycloak import keycloak_login
+from openforms.utils.urls import reverse_plus
+
+from .base import IntegrationTestsBase, mock_org_oidc_config
+
+
+@override_settings(BASE_URL="http://testserver")
+class OrgOIDCCallbackTests(IntegrationTestsBase):
+ """
+ Test the return/callback side after authenticating with the identity provider.
+ """
+
+ @classmethod
+ def setUpTestData(cls):
+ super().setUpTestData()
+
+ # grab user group (from default_groups fixture)
+ assert Group.objects.filter(
+ name__iexact="Registreerders"
+ ).exists(), "Group with required permissions is missing"
+
+ @mock_org_oidc_config()
+ def test_redirects_after_successful_auth(self):
+ form = FormFactory.create(authentication_backends=["org-oidc"])
+ url_helper = URLsHelper(form=form)
+ start_url = url_helper.get_auth_start(plugin_id="org-oidc")
+ start_response = self.app.get(start_url)
+
+ # simulate login to Keycloak
+ redirect_uri = keycloak_login(
+ start_response["Location"], username="admin", password="admin"
+ )
+
+ # complete the login flow on our end
+ callback_response = self.app.get(redirect_uri, auto_follow=True)
+
+ self.assertEqual(callback_response.status_code, 200)
+ self.assertTrue(callback_response.context["user"].is_authenticated)
+
+ with self.subTest("redirect state"):
+ subject_url = reverse_plus(
+ "authentication:registrator-subject",
+ kwargs={"slug": form.slug},
+ query={"next": url_helper.frontend_start},
+ )
+ self.assertEqual(callback_response.request.url, subject_url)
+
+ with self.subTest("created user"):
+ self.assertEqual(User.objects.count(), 1)
+ user = User.objects.get()
+ self.assertEqual(user.username, "admin")
+ self.assertEqual(user.email, "admin@example.com")
+ self.assertEqual(user.employee_id, "admin")
+
+ # check our session data
+ self.assertIn(FORM_AUTH_SESSION_KEY, self.app.session)
+ s = self.app.session[FORM_AUTH_SESSION_KEY]
+ self.assertEqual(s["plugin"], "org-oidc")
+ self.assertEqual(s["attribute"], AuthAttribute.employee_id)
+ self.assertEqual(s["value"], "admin")
+
+ @mock_org_oidc_config(username_claim=["absent-claim"])
+ def test_failing_claim_verification(self):
+ form = FormFactory.create(authentication_backends=["org-oidc"])
+ url_helper = URLsHelper(form=form)
+ start_url = url_helper.get_auth_start(plugin_id="org-oidc")
+ start_response = self.app.get(start_url)
+ # simulate login to Keycloak
+ redirect_uri = keycloak_login(
+ start_response["Location"], username="admin", password="admin"
+ )
+
+ # complete the login flow on our end
+ callback_response = self.app.get(redirect_uri, auto_follow=True)
+
+ # XXX: shouldn't this be "digid" so that the correct error message is rendered?
+ # Query: ?_digid-message=error
+ expected_url = furl(url_helper.frontend_start).add(
+ {BACKEND_OUTAGE_RESPONSE_PARAMETER: "org-oidc"}
+ )
+ self.assertEqual(callback_response.request.url, str(expected_url))
+ self.assertNotIn(FORM_AUTH_SESSION_KEY, self.app.session)
diff --git a/src/openforms/authentication/contrib/org_oidc/tests/test_auth_flow_init.py b/src/openforms/authentication/contrib/org_oidc/tests/test_auth_flow_init.py
new file mode 100644
index 0000000000..1c6883b187
--- /dev/null
+++ b/src/openforms/authentication/contrib/org_oidc/tests/test_auth_flow_init.py
@@ -0,0 +1,86 @@
+"""
+Test the authentication flow for a form.
+
+These tests use VCR. When re-recording, making sure to:
+
+.. code-block:: bash
+
+ cd docker
+ docker compose -f docker-compose.keycloak.yml up
+
+to bring up a Keycloak instance.
+"""
+
+from django.contrib.auth import get_user
+from django.urls import reverse, reverse_lazy
+
+from furl import furl
+
+from openforms.accounts.tests.factories import StaffUserFactory
+from openforms.authentication.tests.utils import URLsHelper
+from openforms.authentication.views import BACKEND_OUTAGE_RESPONSE_PARAMETER
+from openforms.forms.tests.factories import FormFactory
+
+from .base import IntegrationTestsBase, mock_org_oidc_config
+
+
+class OrgOIDCInitTests(IntegrationTestsBase):
+ """
+ Test the outbound part of OIDC-based organisation user authentication.
+ """
+
+ CALLBACK_URL = f"http://testserver{reverse_lazy('org-oidc-callback')}"
+
+ @mock_org_oidc_config()
+ def test_start_flow_redirects_to_oidc_provider(self):
+ form = FormFactory.create(authentication_backends=["org-oidc"])
+ start_url = URLsHelper(form=form).get_auth_start(plugin_id="org-oidc")
+
+ response = self.app.get(start_url)
+
+ self.assertEqual(response.status_code, 302)
+ redirect_target = furl(response["Location"])
+ query_params = redirect_target.query.params
+ self.assertEqual(redirect_target.host, "localhost")
+ self.assertEqual(redirect_target.port, 8080)
+ self.assertEqual(
+ redirect_target.path,
+ "/realms/test/protocol/openid-connect/auth",
+ )
+ self.assertEqual(query_params["scope"], "openid email profile")
+ self.assertEqual(query_params["client_id"], "testid")
+ self.assertEqual(query_params["redirect_uri"], self.CALLBACK_URL)
+
+ @mock_org_oidc_config(
+ oidc_op_authorization_endpoint="http://localhost:8080/i-dont-exist"
+ )
+ def test_idp_availability_check(self):
+ form = FormFactory.create(authentication_backends=["org-oidc"])
+ url_helper = URLsHelper(form=form)
+ start_url = url_helper.get_auth_start(plugin_id="org-oidc")
+
+ response = self.app.get(start_url)
+
+ self.assertEqual(response.status_code, 302)
+ redirect_url = furl(response["Location"])
+ self.assertEqual(redirect_url.host, "testserver")
+ self.assertEqual(redirect_url.path, url_helper.form_path)
+ query_params = redirect_url.query.params
+ self.assertEqual(query_params[BACKEND_OUTAGE_RESPONSE_PARAMETER], "org-oidc")
+
+ @mock_org_oidc_config()
+ def test_start_flow_logs_out_existing_user(self):
+ user = StaffUserFactory.create()
+ self.app.get(reverse("admin:index"), user=user)
+ form = FormFactory.create(authentication_backends=["org-oidc"])
+ start_url = URLsHelper(form=form).get_auth_start(plugin_id="org-oidc")
+ with self.subTest("verify auth state before test"):
+ user = get_user(self.app) # type: ignore
+ self.assertTrue(user.is_authenticated)
+ self.assertFalse(user.is_anonymous)
+
+ self.app.get(start_url)
+
+ user = get_user(self.app) # type: ignore
+ self.assertFalse(user.is_authenticated)
+ self.assertTrue(user.is_anonymous)
diff --git a/src/openforms/authentication/contrib/org_oidc/tests/test_auth_flow_logout.py b/src/openforms/authentication/contrib/org_oidc/tests/test_auth_flow_logout.py
new file mode 100644
index 0000000000..b23ba58011
--- /dev/null
+++ b/src/openforms/authentication/contrib/org_oidc/tests/test_auth_flow_logout.py
@@ -0,0 +1,78 @@
+"""
+Test the authentication flow for a form.
+
+These tests use VCR. When re-recording, making sure to:
+
+.. code-block:: bash
+
+ cd docker
+ docker compose -f docker-compose.keycloak.yml up
+
+to bring up a Keycloak instance.
+"""
+
+import uuid
+
+from django.contrib import auth
+from django.contrib.auth.models import AnonymousUser
+from django.test import override_settings
+
+from rest_framework.test import APIRequestFactory
+
+from openforms.authentication.registry import register
+from openforms.authentication.tests.utils import URLsHelper
+from openforms.forms.tests.factories import FormFactory
+from openforms.utils.tests.keycloak import keycloak_login
+
+from ..plugin import PLUGIN_IDENTIFIER
+from .base import IntegrationTestsBase, mock_org_oidc_config
+
+
+@override_settings(BASE_URL="http://testserver")
+class OrgOIDCCallbackTests(IntegrationTestsBase):
+ """
+ Test the return/callback side after authenticating with the identity provider.
+ """
+
+ def _do_keycloak_login(self, start_url: str) -> None:
+ start_response = self.app.get(start_url)
+ redirect_uri = keycloak_login(
+ start_response["Location"], username="admin", password="admin"
+ )
+ callback_response = self.app.get(redirect_uri, auto_follow=True)
+
+ assert callback_response.status_code == 200
+
+ def _do_plugin_logout(self, user) -> None:
+ request = APIRequestFactory().delete(
+ f"/api/v2/authentication/{uuid.uuid4()}/session"
+ )
+ request.user = user
+ request.session = self.app.session # type: ignore
+ plugin = register[PLUGIN_IDENTIFIER]
+ plugin.logout(request)
+ if not isinstance(request.session, dict):
+ request.session.save()
+
+ @mock_org_oidc_config()
+ def test_logout_clears_session(self):
+ form = FormFactory.create(authentication_backends=[PLUGIN_IDENTIFIER])
+ url_helper = URLsHelper(form=form)
+ start_url = url_helper.get_auth_start(plugin_id=PLUGIN_IDENTIFIER)
+ self._do_keycloak_login(start_url)
+ user = auth.get_user(self.app) # type: ignore
+ self.assertTrue(user.is_authenticated)
+
+ self._do_plugin_logout(user)
+
+ session = self.app.session
+ self.assertEqual(list(session.keys()), [])
+ self.assertFalse(auth.get_user(self.app).is_authenticated) # type: ignore
+
+ @mock_org_oidc_config()
+ def test_logout_without_any_session(self):
+ self._do_plugin_logout(user=AnonymousUser())
+
+ session = self.app.session
+ self.assertEqual(list(session.keys()), [])
+ self.assertFalse(auth.get_user(self.app).is_authenticated) # type: ignore
diff --git a/src/openforms/authentication/contrib/org_oidc/tests/test_auth_logout.py b/src/openforms/authentication/contrib/org_oidc/tests/test_auth_logout.py
deleted file mode 100644
index 00825df969..0000000000
--- a/src/openforms/authentication/contrib/org_oidc/tests/test_auth_logout.py
+++ /dev/null
@@ -1,59 +0,0 @@
-from unittest.mock import patch
-
-from django.contrib import auth
-from django.test import RequestFactory, TestCase
-
-from mozilla_django_oidc_db.models import OpenIDConnectConfig
-
-from openforms.accounts.tests.factories import StaffUserFactory
-
-from ..backends import OIDCAuthenticationBackend
-from ..plugin import OIDCAuthentication
-
-
-class PluginLogoutTest(TestCase):
- @patch(
- "mozilla_django_oidc_db.models.OpenIDConnectConfig.get_solo",
- return_value=OpenIDConnectConfig(),
- )
- def test_logout_empty_session(self, mock_get_solo):
- backend = OIDCAuthenticationBackend()
- user = StaffUserFactory()
- self.client.force_login(user, backend=backend.get_import_path())
-
- plugin = OIDCAuthentication("org-oidc")
-
- request = RequestFactory().post("/dummy")
- request.session = self.client.session
- request.user = user
-
- plugin.logout(request)
-
- self.assertEqual(list(request.session.keys()), [])
- self.assertFalse(auth.get_user(self.client).is_authenticated)
-
- @patch(
- "mozilla_django_oidc_db.models.OpenIDConnectConfig.get_solo",
- return_value=OpenIDConnectConfig(),
- )
- def test_logout_session(self, mock_get_solo):
- backend = OIDCAuthenticationBackend()
- user = StaffUserFactory()
- self.client.force_login(user, backend=backend.get_import_path())
-
- plugin = OIDCAuthentication("org-oidc")
-
- session = self.client.session
- session["oidc_id_token"] = "xyz"
- session["oidc_login_next"] = "xyz"
- session["oidc_states"] = "xyz"
- session.save()
-
- request = RequestFactory().post("/dummy")
- request.session = session
- request.user = user
-
- plugin.logout(request)
-
- self.assertEqual(list(request.session.keys()), [])
- self.assertFalse(auth.get_user(self.client).is_authenticated)
diff --git a/src/openforms/authentication/contrib/org_oidc/tests/test_auth_plugin.py b/src/openforms/authentication/contrib/org_oidc/tests/test_auth_plugin.py
deleted file mode 100644
index 6170a9faa3..0000000000
--- a/src/openforms/authentication/contrib/org_oidc/tests/test_auth_plugin.py
+++ /dev/null
@@ -1,58 +0,0 @@
-from unittest.mock import patch
-
-from django.urls import reverse
-
-from rest_framework import status
-from rest_framework.test import APITestCase
-
-from openforms.accounts.tests.factories import UserFactory
-from openforms.config.models import GlobalConfiguration
-
-
-class OrgOIDCAuthPluginEndpointTests(APITestCase):
- @classmethod
- def setUpTestData(cls):
- super().setUpTestData()
-
- cls.user = UserFactory.create(is_staff=True)
-
- def setUp(self):
- super().setUp()
-
- self.client.force_authenticate(user=self.user)
-
- @patch("openforms.plugins.plugin.GlobalConfiguration.get_solo")
- def test_plugin_list_org_oidc_enabled(self, mock_get_solo):
- mock_get_solo.return_value = GlobalConfiguration(
- plugin_configuration={
- "authentication": {
- "org-oidc": {"enabled": True},
- },
- }
- )
-
- endpoint = reverse("api:authentication-plugin-list")
-
- response = self.client.get(endpoint)
- self.assertEqual(response.status_code, status.HTTP_200_OK)
-
- plugin_names = [p["id"] for p in response.data]
- self.assertIn("org-oidc", plugin_names)
-
- @patch("openforms.plugins.plugin.GlobalConfiguration.get_solo")
- def test_plugin_list_org_oidc_not_enabled(self, mock_get_solo):
- mock_get_solo.return_value = GlobalConfiguration(
- plugin_configuration={
- "authentication": {
- "org-oidc": {"enabled": False},
- },
- }
- )
-
- endpoint = reverse("api:authentication-plugin-list")
-
- response = self.client.get(endpoint)
- self.assertEqual(response.status_code, status.HTTP_200_OK)
-
- plugin_names = [p["id"] for p in response.data]
- self.assertNotIn("org-oidc", plugin_names)
diff --git a/src/openforms/authentication/contrib/org_oidc/tests/test_auth_procedure.py b/src/openforms/authentication/contrib/org_oidc/tests/test_auth_procedure.py
deleted file mode 100644
index b410571080..0000000000
--- a/src/openforms/authentication/contrib/org_oidc/tests/test_auth_procedure.py
+++ /dev/null
@@ -1,408 +0,0 @@
-from unittest.mock import patch
-
-from django.contrib import auth
-from django.contrib.auth import get_user
-from django.contrib.auth.models import Group
-from django.test import TestCase, override_settings
-from django.urls import reverse
-
-import requests_mock
-from furl import furl
-from mozilla_django_oidc_db.models import OpenIDConnectConfig
-from rest_framework import status
-
-from openforms.accounts.models import User
-from openforms.accounts.tests.factories import UserFactory
-from openforms.forms.tests.factories import FormFactory
-from openforms.utils.urls import reverse_plus
-
-from ....constants import FORM_AUTH_SESSION_KEY, AuthAttribute
-from ....views import BACKEND_OUTAGE_RESPONSE_PARAMETER
-
-default_config = dict(
- enabled=True,
- oidc_rp_client_id="testclient",
- oidc_rp_client_secret="secret",
- oidc_rp_sign_algo="RS256",
- oidc_rp_scopes_list=["openid", "email", "profile"],
- oidc_op_jwks_endpoint="http://provider.com/auth/realms/master/protocol/openid-connect/certs",
- oidc_op_authorization_endpoint="http://provider.com/auth/realms/master/protocol/openid-connect/auth",
- oidc_op_token_endpoint="http://provider.com/auth/realms/master/protocol/openid-connect/token",
- oidc_op_user_endpoint="http://provider.com/auth/realms/master/protocol/openid-connect/userinfo",
- username_claim="sub",
- make_users_staff=True,
-)
-
-
-@override_settings(CORS_ALLOW_ALL_ORIGINS=True, IS_HTTPS=True)
-class OrgOIDCTests(TestCase):
- @classmethod
- def setUpTestData(cls):
- super().setUpTestData()
- cls.form = FormFactory.create(
- generate_minimal_setup=True, authentication_backends=["org-oidc"]
- )
-
- @patch(
- "mozilla_django_oidc_db.models.OpenIDConnectConfig.get_solo",
- return_value=OpenIDConnectConfig(**default_config),
- )
- def test_redirect_to_org_oidc(self, *m):
- login_url = reverse(
- "authentication:start",
- kwargs={"slug": self.form.slug, "plugin_id": "org-oidc"},
- )
-
- form_path = reverse("core:form-detail", kwargs={"slug": self.form.slug})
- form_url = str(furl(f"http://testserver{form_path}").set({"_start": "1"}))
- start_url = furl(login_url).set({"next": form_url})
- response = self.client.get(start_url)
-
- self.assertEqual(status.HTTP_302_FOUND, response.status_code)
-
- parsed = furl(response.url)
- query_params = parsed.query.params
-
- self.assertEqual(parsed.host, "testserver")
- self.assertEqual(parsed.path, reverse("org-oidc:oidc_authentication_init"))
-
- parsed = furl(query_params["next"])
- query_params = parsed.query.params
-
- self.assertEqual(
- parsed.path,
- reverse(
- "authentication:return",
- kwargs={"slug": self.form.slug, "plugin_id": "org-oidc"},
- ),
- )
- self.assertEqual(query_params["next"], form_url)
-
- with requests_mock.Mocker() as m:
- m.get(
- "http://provider.com/auth/realms/master/protocol/openid-connect/auth",
- status_code=200,
- )
- response = self.client.get(response.url)
-
- self.assertEqual(status.HTTP_302_FOUND, response.status_code)
-
- parsed = furl(response.url)
- query_params = parsed.query.params
-
- self.assertEqual(parsed.host, "provider.com")
- self.assertEqual(
- parsed.path, "/auth/realms/master/protocol/openid-connect/auth"
- )
- self.assertEqual(query_params["scope"], "openid email profile")
- self.assertEqual(query_params["client_id"], "testclient")
- self.assertEqual(
- query_params["redirect_uri"],
- f"http://testserver{reverse('org-oidc:oidc_authentication_callback')}",
- )
-
- parsed = furl(self.client.session["oidc_login_next"])
- query_params = parsed.query.params
-
- self.assertEqual(
- parsed.path,
- reverse(
- "authentication:return",
- kwargs={"slug": self.form.slug, "plugin_id": "org-oidc"},
- ),
- )
- self.assertEqual(query_params["next"], form_url)
-
- @patch(
- "mozilla_django_oidc_db.models.OpenIDConnectConfig.get_solo",
- return_value=OpenIDConnectConfig(**default_config),
- )
- def test_redirect_to_org_oidc_internal_server_error(self, *m):
- login_url = reverse(
- "authentication:start",
- kwargs={"slug": self.form.slug, "plugin_id": "org-oidc"},
- )
-
- form_path = reverse("core:form-detail", kwargs={"slug": self.form.slug})
- form_url = str(furl(f"http://testserver{form_path}").set({"_start": "1"}))
- start_url = furl(login_url).set({"next": form_url})
- response = self.client.get(start_url)
-
- self.assertEqual(status.HTTP_302_FOUND, response.status_code)
-
- with requests_mock.Mocker() as m:
- m.get(
- "http://provider.com/auth/realms/master/protocol/openid-connect/auth",
- status_code=500,
- )
- response = self.client.get(response.url)
-
- parsed = furl(response.url)
- query_params = parsed.query.params
-
- self.assertEqual(parsed.host, "testserver")
- self.assertEqual(parsed.path, form_path)
- self.assertEqual(query_params["of-auth-problem"], "org-oidc")
-
- @patch(
- "mozilla_django_oidc_db.models.OpenIDConnectConfig.get_solo",
- return_value=OpenIDConnectConfig(**default_config),
- )
- def test_redirect_to_org_oidc_callback_error(self, *m):
- form_path = reverse("core:form-detail", kwargs={"slug": self.form.slug})
- form_url = f"http://testserver{form_path}"
- redirect_form_url = furl(form_url).set({"_start": "1"})
- redirect_url = furl(
- reverse(
- "authentication:return",
- kwargs={"slug": self.form.slug, "plugin_id": "org-oidc"},
- )
- ).set({"next": redirect_form_url})
-
- session = self.client.session
- session["of_redirect_next"] = redirect_url.url
- session.save()
-
- with patch(
- "openforms.authentication.contrib.org_oidc.backends.OIDCAuthenticationBackend.verify_claims",
- return_value=False,
- ):
- response = self.client.get(reverse("org-oidc:callback"))
-
- self.assertEqual(response.status_code, status.HTTP_302_FOUND)
-
- parsed = furl(response.url)
- query_params = parsed.query.params
-
- self.assertEqual(parsed.path, form_path)
- self.assertEqual(query_params["_start"], "1")
- self.assertEqual(query_params[BACKEND_OUTAGE_RESPONSE_PARAMETER], "org-oidc")
-
- @override_settings(CORS_ALLOW_ALL_ORIGINS=False, CORS_ALLOWED_ORIGINS=[])
- @patch(
- "mozilla_django_oidc_db.models.OpenIDConnectConfig.get_solo",
- return_value=OpenIDConnectConfig(**default_config),
- )
- def test_redirect_to_disallowed_domain(self, *m):
- form_url = "http://example.com"
- start_url = reverse_plus(
- "org-oidc:oidc_authentication_init",
- query={"next": form_url},
- )
- response = self.client.get(start_url)
-
- self.assertEqual(status.HTTP_400_BAD_REQUEST, response.status_code)
-
- @override_settings(
- CORS_ALLOW_ALL_ORIGINS=False,
- CORS_ALLOWED_ORIGINS=["http://example.com", "http://testserver"],
- )
- @patch(
- "mozilla_django_oidc_db.models.OpenIDConnectConfig.get_solo",
- return_value=OpenIDConnectConfig(**default_config),
- )
- def test_redirect_to_allowed_domain(self, *m):
- login_url = reverse(
- "authentication:start",
- kwargs={"slug": self.form.slug, "plugin_id": "org-oidc"},
- )
-
- form_url = "http://example.com"
- start_url = furl(login_url).set({"next": form_url})
- response = self.client.get(start_url)
-
- self.assertEqual(status.HTTP_302_FOUND, response.status_code)
-
- parsed = furl(response.url)
- query_params = parsed.query.params
-
- self.assertEqual(parsed.host, "testserver")
- self.assertEqual(parsed.path, reverse("org-oidc:oidc_authentication_init"))
-
- parsed = furl(query_params["next"])
- query_params = parsed.query.params
-
- self.assertEqual(
- parsed.path,
- reverse(
- "authentication:return",
- kwargs={"slug": self.form.slug, "plugin_id": "org-oidc"},
- ),
- )
- self.assertEqual(query_params["next"], form_url)
-
- with requests_mock.Mocker() as m:
- m.get(
- "http://provider.com/auth/realms/master/protocol/openid-connect/auth",
- status_code=200,
- )
- response = self.client.get(response.url)
-
- self.assertEqual(status.HTTP_302_FOUND, response.status_code)
-
- parsed = furl(response.url)
- query_params = parsed.query.params
-
- self.assertEqual(parsed.host, "provider.com")
- self.assertEqual(
- parsed.path, "/auth/realms/master/protocol/openid-connect/auth"
- )
- self.assertEqual(query_params["scope"], "openid email profile")
- self.assertEqual(query_params["client_id"], "testclient")
- self.assertEqual(
- query_params["redirect_uri"],
- f"http://testserver{reverse('org-oidc:oidc_authentication_callback')}",
- )
-
- @override_settings(
- CORS_ALLOW_ALL_ORIGINS=False, CORS_ALLOWED_ORIGINS=["http://example.com"]
- )
- @patch(
- "mozilla_django_oidc_db.models.OpenIDConnectConfig.get_solo",
- return_value=OpenIDConnectConfig(**default_config),
- )
- def test_start_view_logs_out_current_user_if_any(self, *m):
- other_user = UserFactory()
- self.client.force_login(other_user)
-
- start_url = reverse_plus(
- "authentication:start",
- kwargs={"slug": self.form.slug, "plugin_id": "org-oidc"},
- query={"next": "http://example.com"},
- )
- response = self.client.get(start_url)
- self.assertEqual(response.status_code, 302)
-
- user = get_user(self.client)
- self.assertFalse(user.is_authenticated)
- self.assertTrue(user.is_anonymous)
-
- @patch(
- "openforms.authentication.contrib.org_oidc.backends.OIDCAuthenticationBackend.get_userinfo"
- )
- @patch(
- "openforms.authentication.contrib.org_oidc.backends.OIDCAuthenticationBackend.store_tokens"
- )
- @patch(
- "openforms.authentication.contrib.org_oidc.backends.OIDCAuthenticationBackend.verify_token"
- )
- @patch(
- "openforms.authentication.contrib.org_oidc.backends.OIDCAuthenticationBackend.get_token"
- )
- @patch("mozilla_django_oidc_db.models.OpenIDConnectConfig.get_solo")
- @override_settings(BASE_URL="http://testserver")
- def test_callback_url_creates_logged_in_django_user(
- self,
- mock_get_solo,
- mock_get_token,
- mock_verify_token,
- mock_store_tokens,
- mock_get_userinfo,
- ):
- self.assertFalse(User.objects.exists())
-
- mock_get_solo.return_value = OpenIDConnectConfig(
- **{
- **default_config,
- **{
- "id": 1,
- "username_claim": "arbitrary_employee_id_claim",
- "claim_mapping": {
- "email": "email",
- "last_name": "family_name",
- "first_name": "given_name",
- "employee_id": "arbitrary_employee_id_claim",
- },
- "groups_claim": "arbitrary_groups",
- },
- }
- )
- mock_get_token.return_value = {
- "id_token": "mock-id-token",
- "access_token": "mock-access-token",
- }
- user_claims = {
- "sub": "arbitrary_employee_id_claim",
- "email": "admin@example.com",
- "given_name": "John",
- "family_name": "Doe",
- "arbitrary_employee_id_claim": "my_id_value",
- "arbitrary_groups": ["Registreerders"],
- }
- mock_verify_token.return_value = user_claims
- mock_get_userinfo.return_value = user_claims
- mock_store_tokens.return_value = {"whatever": 1}
-
- # grab user group (from default_groups fixture)
- group = Group.objects.get(name__iexact="Registreerders")
-
- # setup our form and urls
- form_url = reverse_plus("core:form-detail", kwargs={"slug": self.form.slug})
-
- handle_return_url = reverse_plus(
- "authentication:return",
- kwargs={"slug": self.form.slug, "plugin_id": "org-oidc"},
- query={"next": form_url},
- )
-
- # go through mock OIDC
- callback_url = reverse_plus("org-oidc:oidc_authentication_callback")
-
- session = self.client.session
- session["oidc_states"] = {"mock": {"nonce": "nonce"}}
- session["oidc_login_next"] = handle_return_url
- session.save()
-
- # check oidc callback view
- callback_response = self.client.get(
- callback_url, {"code": "mock", "state": "mock"}
- )
-
- self.assertRedirects(
- callback_response, handle_return_url, fetch_redirect_response=False
- )
- self.assertEqual(status.HTTP_302_FOUND, callback_response.status_code)
-
- mock_get_token.assert_called_once()
- mock_verify_token.assert_called_once()
- mock_store_tokens.assert_called_once()
- mock_get_userinfo.assert_called_once()
-
- # we got our user
- user = User.objects.get()
- self.assertTrue(user.is_staff)
- self.assertTrue(user.username, "some_username")
- self.assertTrue(user.email, "admin@example.com")
- self.assertTrue(user.first_name, "John")
- self.assertTrue(user.last_name, "Doe")
- self.assertTrue(user.employee_id, "my_id_value")
- # note: assertQuerysetEqual doesn't check primary keys, so can't detect duplicate objects
- self.assertEqual(user.groups.get().pk, group.pk)
-
- # check plugins handle_return() response
- return_response = self.client.get(handle_return_url)
-
- subject_url = reverse_plus(
- "authentication:registrator-subject",
- kwargs={"slug": self.form.slug},
- query={"next": form_url},
- )
-
- self.assertRedirects(
- return_response, subject_url, fetch_redirect_response=False
- )
- self.assertEqual(status.HTTP_302_FOUND, return_response.status_code)
-
- # check our session data
- self.assertIn(FORM_AUTH_SESSION_KEY, self.client.session)
- s = self.client.session[FORM_AUTH_SESSION_KEY]
- self.assertEqual(s["plugin"], "org-oidc")
- self.assertEqual(s["attribute"], AuthAttribute.employee_id)
- self.assertEqual(s["value"], "my_id_value")
-
- # django user logged in
- self.assertTrue(auth.get_user(self.client).is_authenticated)
-
- # check the registrator subject response
- subject_response = self.client.get(subject_url)
- self.assertEqual(status.HTTP_200_OK, subject_response.status_code)
diff --git a/src/openforms/authentication/contrib/org_oidc/tests/test_configuration.py b/src/openforms/authentication/contrib/org_oidc/tests/test_configuration.py
new file mode 100644
index 0000000000..f20ab036a9
--- /dev/null
+++ b/src/openforms/authentication/contrib/org_oidc/tests/test_configuration.py
@@ -0,0 +1,36 @@
+from django.test import TestCase, override_settings
+from django.urls import reverse
+
+from mozilla_django_oidc_db.views import OIDCInit
+
+from ..models import OrgOpenIDConnectConfig
+
+
+class CallbackURLConfigurationTests(TestCase):
+ """
+ Test the legacy and new behaviour for the OIDC Redirect URIs for each config.
+ """
+
+ def setUp(self):
+ super().setUp()
+
+ self.addCleanup(OrgOpenIDConnectConfig.clear_cache)
+
+ def test_default_settings_backwards_compatible(self):
+ # use an init view to decouple the implementation details from the
+ # desired behaviour.
+ view = OIDCInit(config_class=OrgOpenIDConnectConfig)
+
+ url = reverse(view.get_settings("OIDC_AUTHENTICATION_CALLBACK_URL"))
+
+ self.assertEqual(url, "/org-oidc/callback/")
+
+ @override_settings(USE_LEGACY_ORG_OIDC_ENDPOINTS=False)
+ def test_new_behaviour(self):
+ # use an init view to decouple the implementation details from the
+ # desired behaviour.
+ view = OIDCInit(config_class=OrgOpenIDConnectConfig)
+
+ url = reverse(view.get_settings("OIDC_AUTHENTICATION_CALLBACK_URL"))
+
+ self.assertEqual(url, "/auth/oidc/callback/")
diff --git a/src/openforms/authentication/contrib/org_oidc/urls.py b/src/openforms/authentication/contrib/org_oidc/urls.py
index 667f97344b..0dd4dcdcb4 100644
--- a/src/openforms/authentication/contrib/org_oidc/urls.py
+++ b/src/openforms/authentication/contrib/org_oidc/urls.py
@@ -1,21 +1,9 @@
from django.urls import path
-from mozilla_django_oidc.urls import urlpatterns
-
-from .views import OIDCAuthenticationCallbackView, OIDCAuthenticationRequestView
-
-app_name = "org-oidc"
-
+from mozilla_django_oidc_db.views import OIDCCallbackView
+# XXX: sort out callback endpoints
+# deprecated
urlpatterns = [
- path(
- "callback/",
- OIDCAuthenticationCallbackView.as_view(),
- name="callback",
- ),
- path(
- "authenticate/",
- OIDCAuthenticationRequestView.as_view(),
- name="init",
- ),
-] + urlpatterns
+ path("callback/", OIDCCallbackView.as_view(), name="org-oidc-callback"),
+]
diff --git a/src/openforms/authentication/contrib/org_oidc/views.py b/src/openforms/authentication/contrib/org_oidc/views.py
index 6cfd432950..a8963ec761 100644
--- a/src/openforms/authentication/contrib/org_oidc/views.py
+++ b/src/openforms/authentication/contrib/org_oidc/views.py
@@ -1,65 +1,56 @@
-import logging
+from django.http import HttpRequest
+from django.urls import reverse
-from django.contrib import auth
-from django.core.exceptions import DisallowedRedirect
-from django.http import HttpResponseRedirect
-
-import requests
from furl import furl
-from mozilla_django_oidc.views import (
- OIDCAuthenticationRequestView as _OIDCAuthenticationRequestView,
- get_next_url,
-)
-
-from openforms.authentication.contrib.digid_eherkenning_oidc.views import (
- OIDCAuthenticationCallbackView as _OIDCAuthenticationCallbackView,
+from mozilla_django_oidc_db.views import (
+ _OIDC_ERROR_SESSION_KEY,
+ _RETURN_URL_SESSION_KEY,
+ AdminCallbackView,
)
from ...views import BACKEND_OUTAGE_RESPONSE_PARAMETER
-from .backends import OIDCAuthenticationBackend
-from .mixins import SoloConfigMixin
+from .plugin import PLUGIN_IDENTIFIER
-logger = logging.getLogger(__name__)
+class CallbackView(AdminCallbackView):
+ """
+ Apply the integrity error catching behaviour from AdminCallbackView.
-class OIDCAuthenticationRequestView(SoloConfigMixin, _OIDCAuthenticationRequestView):
- def get(self, request):
- redirect_field_name = self.get_settings("OIDC_REDIRECT_FIELD_NAME", "next")
- next_url = get_next_url(request, redirect_field_name)
- if not next_url:
- raise DisallowedRedirect
+ Potential integrity constraint errors are caught, and login failures redirect the
+ user back to the public frontend (SDK).
+ """
- try:
- # Verify that the identity provider endpoint can be reached
- response = requests.get(self.OIDC_OP_AUTH_ENDPOINT)
- if response.status_code > 400:
- response.raise_for_status()
- except Exception as e:
- logger.exception(
- "authentication exception during 'start_login()' of plugin '%(plugin_id)s'",
- {"plugin_id": self.plugin_identifier},
- exc_info=e,
- )
- # append failure parameter and return to form
- f = furl(next_url)
- failure_url = f.args["next"]
-
- f = furl(failure_url)
- f.args[BACKEND_OUTAGE_RESPONSE_PARAMETER] = self.plugin_identifier
- return HttpResponseRedirect(f.url)
+ _redirect_next: str
+ def get(self, request: HttpRequest):
+ # grab where the redirect next from the session and store it as a temporary
+ # attribute. in the event that the failure url needs to be overridden, we
+ # then have the value available even *after* mozilla_django_oidc has flushed
+ # the session.
+ self._redirect_next = request.session.get(_RETURN_URL_SESSION_KEY, "")
return super().get(request)
+ @property
+ def failure_url(self) -> str:
+ """
+ On failure, redirect to the form with an appropriate error message.
+ """
+ # handle integrity and validation errors by redirecting the user to the admin
+ # failure view.
+ if _OIDC_ERROR_SESSION_KEY in self.request.session:
+ return reverse("admin-oidc-error")
+
+ # this is expected to be the auth plugin return url, set by the OIDCInit view
+ plugin_return_url = furl(
+ self._redirect_next or self.get_settings("LOGIN_REDIRECT_URL", "/")
+ )
+ # this URL is expected to have a ?next query param pointing back to the frontend
+ # where the form is rendered/embedded
+ _next = plugin_return_url.args["next"]
+ assert isinstance(_next, str)
+ form_url = furl(_next)
+ form_url.args[BACKEND_OUTAGE_RESPONSE_PARAMETER] = PLUGIN_IDENTIFIER
+ return form_url.url
-class OIDCAuthenticationCallbackView(SoloConfigMixin, _OIDCAuthenticationCallbackView):
- # TODO figure out how we want to reuse the patched OIDCAuthenticationCallbackView from digid_eherkenning (and digid_eherkenning_generics)
- # or possibly move it to mozilla_oidc_db
- auth_backend_class = OIDCAuthenticationBackend
- def login_success(self):
- # override again because our base class removed the .login()
- auth.login(
- self.request, self.user, backend=OIDCAuthenticationBackend.get_import_path()
- )
- assert self.user.is_authenticated
- return super().login_success()
+callback_view = CallbackView.as_view()
diff --git a/src/openforms/authentication/tests/utils.py b/src/openforms/authentication/tests/utils.py
index bc3ac56c60..7d880ed3b3 100644
--- a/src/openforms/authentication/tests/utils.py
+++ b/src/openforms/authentication/tests/utils.py
@@ -5,22 +5,34 @@
from openforms.forms.models import Form
-def get_start_form_url(form: Form, host: str = "") -> str:
- form_path = reverse("core:form-detail", kwargs={"slug": form.slug})
- if not host:
- host = "http://testserver"
- form_url = furl(f"{host}{form_path}").set({"_start": "1"})
- return str(form_url)
-
-
-def get_start_url(form: Form, plugin_id: str, host: str = "") -> str:
+class URLsHelper:
"""
- Build the authentication start URL as constructed by the SDK.
+ Small helper to get the right frontend URLs for authentication flows.
"""
- login_url = reverse(
- "authentication:start",
- kwargs={"slug": form.slug, "plugin_id": plugin_id},
- )
- form_url = get_start_form_url(form, host=host)
- start_url = furl(login_url).set({"next": form_url})
- return str(start_url)
+
+ def __init__(self, form: Form, host: str = "http://testserver"):
+ self.form = form
+ self.host = host
+
+ @property
+ def form_path(self) -> str:
+ return reverse("core:form-detail", kwargs={"slug": self.form.slug})
+
+ @property
+ def frontend_start(self) -> str:
+ """
+ Compute the frontend URL that will trigger a submissions start.
+ """
+ form_url = furl(f"{self.host}{self.form_path}").set({"_start": "1"})
+ return str(form_url)
+
+ def get_auth_start(self, plugin_id: str) -> str:
+ """
+ Compute the authentication start URL for the specified plugin ID.
+ """
+ login_url = reverse(
+ "authentication:start",
+ kwargs={"slug": self.form.slug, "plugin_id": plugin_id},
+ )
+ start_url = furl(login_url).set({"next": self.frontend_start})
+ return str(start_url)
diff --git a/src/openforms/authentication/views.py b/src/openforms/authentication/views.py
index 8d9a42ed66..afe3d46ec4 100644
--- a/src/openforms/authentication/views.py
+++ b/src/openforms/authentication/views.py
@@ -1,4 +1,5 @@
import logging
+import warnings
from django.contrib.auth.mixins import PermissionRequiredMixin, UserPassesTestMixin
from django.core.exceptions import PermissionDenied
@@ -127,6 +128,7 @@ def _validate_co_sign_submission(self, plugin: BasePlugin) -> Submission | None:
"Presence of this parameter marks a flow as a co-sign flow."
),
required=False,
+ deprecated=True,
),
OpenApiParameter(
name="Location",
@@ -341,6 +343,10 @@ def _handle_return(self, request: Request, slug: str, plugin_id: str):
def _handle_co_sign(self, form: Form, plugin: BasePlugin) -> None:
co_sign_submission = self._validate_co_sign_submission(plugin)
if co_sign_submission is not None:
+ warnings.warn(
+ "Legacy co-sign is deprecated and will be removed in Open Forms 3.0",
+ DeprecationWarning,
+ )
logger.debug("Co-sign authentication detected, invoking plugin handler.")
co_sign_data = {
**plugin.handle_co_sign(self.request, form),
diff --git a/src/openforms/conf/base.py b/src/openforms/conf/base.py
index 798f311079..11f3a09b2e 100644
--- a/src/openforms/conf/base.py
+++ b/src/openforms/conf/base.py
@@ -104,14 +104,6 @@
"IGNORE_EXCEPTIONS": True,
},
},
- "oidc": {
- "BACKEND": "django_redis.cache.RedisCache",
- "LOCATION": f"redis://{config('CACHE_OIDC', 'localhost:6379/0')}",
- "OPTIONS": {
- "CLIENT_CLASS": "django_redis.client.DefaultClient",
- "IGNORE_EXCEPTIONS": True,
- },
- },
# TODO: rename to 'redis-locks' and get rid of portalocker in favour of plain
# redis locks?
"portalocker": {
@@ -187,7 +179,7 @@
"stuf.stuf_zds",
"mozilla_django_oidc",
"mozilla_django_oidc_db",
- "digid_eherkenning_oidc_generics",
+ "digid_eherkenning.oidc",
"django_filters",
"csp",
"cspreports",
@@ -503,11 +495,14 @@
# Allow logging in with both username+password and email+password
AUTHENTICATION_BACKENDS = [
+ # Put the fake backend first, as it (on success) only puts information in the session
+ # and it's quite easy to shortcut.
+ "openforms.authentication.contrib.digid_eherkenning_oidc.backends.DigiDEHerkenningOIDCBackend",
+ # Real backends
"axes.backends.AxesBackend",
"openforms.accounts.backends.UserModelEmailBackend",
"django.contrib.auth.backends.ModelBackend",
"mozilla_django_oidc_db.backends.OIDCAuthenticationBackend",
- "openforms.authentication.contrib.org_oidc.backends.OIDCAuthenticationBackend",
]
SESSION_COOKIE_NAME = "openforms_sessionid"
@@ -622,6 +617,20 @@
ESCAPE_REGISTRATION_OUTPUT = config("ESCAPE_REGISTRATION_OUTPUT", default=False)
DISABLE_SENDING_HIDDEN_FIELDS = config("DISABLE_SENDING_HIDDEN_FIELDS", default=False)
+LOG_OUTGOING_REQUESTS_MAX_AGE = config(
+ "LOG_OUTGOING_REQUESTS_MAX_AGE", default=7
+) # number of days
+
+# TODO: convert to feature flags so that newly deployed instances get the new behaviour
+# while staying backwards compatible for existing instances
+USE_LEGACY_DIGID_EH_OIDC_ENDPOINTS = config(
+ "USE_LEGACY_DIGID_EH_OIDC_ENDPOINTS",
+ default=True,
+)
+USE_LEGACY_ORG_OIDC_ENDPOINTS = config(
+ "USE_LEGACY_ORG_OIDC_ENDPOINTS",
+ default=True,
+)
##############################
# #
@@ -692,7 +701,6 @@
# auth, avoiding having some set up MFA again in the project.
MAYKIN_2FA_ALLOW_MFA_BYPASS_BACKENDS = [
"mozilla_django_oidc_db.backends.OIDCAuthenticationBackend",
- "openforms.authentication.contrib.org_oidc.backends.OIDCAuthenticationBackend",
]
#
@@ -1004,12 +1012,18 @@
COOKIE_CONSENT_NAME = "cookie_consent"
#
-# Mozilla Django OIDC DB settings
+# Mozilla Django OIDC (DB) settings
#
OIDC_AUTHENTICATE_CLASS = "mozilla_django_oidc_db.views.OIDCAuthenticationRequestView"
+# DeprecationWarning
+# XXX: remove in Open Forms 3.0
+_USE_LEGACY_OIDC_ENDPOINTS = config("USE_LEGACY_OIDC_ENDPOINTS", default=True)
+OIDC_AUTHENTICATION_CALLBACK_URL = (
+ "legacy_oidc:oidc_authentication_callback"
+ if _USE_LEGACY_OIDC_ENDPOINTS
+ else "oidc_authentication_callback"
+)
OIDC_CALLBACK_CLASS = "mozilla_django_oidc_db.views.OIDCCallbackView"
-MOZILLA_DJANGO_OIDC_DB_CACHE = "oidc"
-MOZILLA_DJANGO_OIDC_DB_CACHE_TIMEOUT = 5 * 60
# ID token is required to enable OIDC logout
OIDC_STORE_ID_TOKEN = True
@@ -1140,11 +1154,6 @@
LOG_OUTGOING_REQUESTS_EMIT_BODY = True
LOG_OUTGOING_REQUESTS_MAX_CONTENT_LENGTH = 524_288 # 0.5MB
-# Custom settings
-LOG_OUTGOING_REQUESTS_MAX_AGE = config(
- "LOG_OUTGOING_REQUESTS_MAX_AGE", default=7
-) # number of days
-
#
# DJANGO-FLAGS - manage feature flags.
#
diff --git a/src/openforms/conf/docker.py b/src/openforms/conf/docker.py
index 43250324e6..5808e1d205 100644
--- a/src/openforms/conf/docker.py
+++ b/src/openforms/conf/docker.py
@@ -9,7 +9,6 @@
os.environ.setdefault("LOG_STDOUT", "yes")
os.environ.setdefault("CACHE_DEFAULT", "redis:6379/0")
os.environ.setdefault("CACHE_AXES", "redis:6379/0")
-os.environ.setdefault("CACHE_OIDC", "redis:6379/0")
os.environ.setdefault("CACHE_PORTALOCKER", "redis:6379/0")
# # Strongly suggested to not use this, but explicitly list the allowed hosts. It is
diff --git a/src/openforms/conf/production.py b/src/openforms/conf/production.py
index 8451ea97ad..fbaec9340a 100644
--- a/src/openforms/conf/production.py
+++ b/src/openforms/conf/production.py
@@ -10,7 +10,6 @@
# NOTE: watch out for multiple projects using the same cache!
os.environ.setdefault("CACHE_DEFAULT", "127.0.0.1:6379/2")
os.environ.setdefault("CACHE_AXES", "127.0.0.1:6379/4")
-os.environ.setdefault("CACHE_OIDC", "127.0.0.1:6379/6")
os.environ.setdefault("CACHE_PORTALOCKER", "127.0.0.1:6379/8")
from .base import * # noqa isort:skip
diff --git a/src/openforms/conf/staging.py b/src/openforms/conf/staging.py
index c42f2d3696..4d2e480bee 100644
--- a/src/openforms/conf/staging.py
+++ b/src/openforms/conf/staging.py
@@ -9,7 +9,6 @@
# NOTE: watch out for multiple projects using the same cache!
os.environ.setdefault("CACHE_DEFAULT", "127.0.0.1:6379/1")
os.environ.setdefault("CACHE_AXES", "127.0.0.1:6379/3")
-os.environ.setdefault("CACHE_OIDC", "127.0.0.1:6379/5")
os.environ.setdefault("CACHE_PORTALOCKER", "127.0.0.1:6379/7")
from .production import * # noqa isort:skip
diff --git a/src/openforms/fixtures/default_admin_index.json b/src/openforms/fixtures/default_admin_index.json
index e8f4bcead9..cca83d7d0a 100644
--- a/src/openforms/fixtures/default_admin_index.json
+++ b/src/openforms/fixtures/default_admin_index.json
@@ -179,20 +179,20 @@
"eherkenningconfiguration"
],
[
- "digid_eherkenning_oidc_generics",
- "openidconnectdigidmachtigenconfig"
+ "digid_eherkenning_oidc",
+ "ofdigidconfig"
],
[
- "digid_eherkenning_oidc_generics",
- "openidconnecteherkenningbewindvoeringconfig"
+ "digid_eherkenning_oidc",
+ "ofdigidmachtigenconfig"
],
[
- "digid_eherkenning_oidc_generics",
- "openidconnecteherkenningconfig"
+ "digid_eherkenning_oidc",
+ "ofeherkenningbewindvoeringconfig"
],
[
- "digid_eherkenning_oidc_generics",
- "openidconnectpublicconfig"
+ "digid_eherkenning_oidc",
+ "ofeherkenningconfig"
],
[
"django_camunda",
diff --git a/src/openforms/tests/data/vcr_cassettes/OIDCRegistratorSubjectHaalCentraalPrefillIntegrationTest/OIDCRegistratorSubjectHaalCentraalPrefillIntegrationTest.test_flow.yaml b/src/openforms/tests/data/vcr_cassettes/OIDCRegistratorSubjectHaalCentraalPrefillIntegrationTest/OIDCRegistratorSubjectHaalCentraalPrefillIntegrationTest.test_flow.yaml
new file mode 100644
index 0000000000..0a539d2789
--- /dev/null
+++ b/src/openforms/tests/data/vcr_cassettes/OIDCRegistratorSubjectHaalCentraalPrefillIntegrationTest/OIDCRegistratorSubjectHaalCentraalPrefillIntegrationTest.test_flow.yaml
@@ -0,0 +1,371 @@
+interactions:
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.32.2
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n\n\n\n\n\n\n"
+ headers:
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '1573'
+ status:
+ code: 400
+ message: Bad Request
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.32.2
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/auth?response_type=code&scope=openid+email+profile&client_id=testid&redirect_uri=http%3A%2F%2Fexample.com%2Forg-oidc%2Fcallback%2F&state=not-a-random-string&nonce=not-a-random-string
+ response:
+ body:
+ string: "\n\n\n\n \n
+ \ \n \n\n \n Sign
+ in to test\n \n \n \n \n \n \n \n\n\n\n\n
+ \ \n
\n
+ \ \n
\n
+ \
\n\n\n
\n \n\n\n\n\n\n
+ \
\n
\n\n
\n
\n\n\n"
+ headers:
+ Cache-Control:
+ - no-store, must-revalidate, max-age=0
+ Content-Language:
+ - en
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Content-Type:
+ - text/html;charset=utf-8
+ Referrer-Policy:
+ - no-referrer
+ Set-Cookie:
+ - AUTH_SESSION_ID=7602d0f0-6118-4e76-891f-adc44ac8dd8c; Version=1; Path=/realms/test/;
+ SameSite=None; Secure; HttpOnly
+ - AUTH_SESSION_ID_LEGACY=7602d0f0-6118-4e76-891f-adc44ac8dd8c; Version=1; Path=/realms/test/;
+ HttpOnly
+ - KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJjaWQiOiJ0ZXN0aWQiLCJwdHkiOiJvcGVuaWQtY29ubmVjdCIsInJ1cmkiOiJodHRwOi8vZXhhbXBsZS5jb20vb3JnLW9pZGMvY2FsbGJhY2svIiwiYWN0IjoiQVVUSEVOVElDQVRFIiwibm90ZXMiOnsic2NvcGUiOiJvcGVuaWQgZW1haWwgcHJvZmlsZSIsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9yZWFsbXMvdGVzdCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwicmVkaXJlY3RfdXJpIjoiaHR0cDovL2V4YW1wbGUuY29tL29yZy1vaWRjL2NhbGxiYWNrLyIsInN0YXRlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyJ9fQ.Gh5tsot6g5xFfd-CPdrSdfVuce-rrmiou1HGFbYFSEY;
+ Version=1; Path=/realms/test/; HttpOnly
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '4466'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: username=admin&password=admin&credentialId=&login=Sign+In
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '57'
+ Content-Type:
+ - application/x-www-form-urlencoded
+ Cookie:
+ - AUTH_SESSION_ID_LEGACY=7602d0f0-6118-4e76-891f-adc44ac8dd8c; KC_RESTART=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJjaWQiOiJ0ZXN0aWQiLCJwdHkiOiJvcGVuaWQtY29ubmVjdCIsInJ1cmkiOiJodHRwOi8vZXhhbXBsZS5jb20vb3JnLW9pZGMvY2FsbGJhY2svIiwiYWN0IjoiQVVUSEVOVElDQVRFIiwibm90ZXMiOnsic2NvcGUiOiJvcGVuaWQgZW1haWwgcHJvZmlsZSIsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9yZWFsbXMvdGVzdCIsInJlc3BvbnNlX3R5cGUiOiJjb2RlIiwicmVkaXJlY3RfdXJpIjoiaHR0cDovL2V4YW1wbGUuY29tL29yZy1vaWRjL2NhbGxiYWNrLyIsInN0YXRlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyJ9fQ.Gh5tsot6g5xFfd-CPdrSdfVuce-rrmiou1HGFbYFSEY
+ User-Agent:
+ - python-requests/2.32.2
+ method: POST
+ uri: http://localhost:8080/realms/test/login-actions/authenticate?session_code=q0bbj9dA-2ANDyXpLlC50NGHbNmnAewmiL2CsG3KFFs&execution=d8b8778e-a545-45d4-8f72-fd69facf4b72&client_id=testid&tab_id=dTO26rxbqmk
+ response:
+ body:
+ string: ''
+ headers:
+ Cache-Control:
+ - no-store, must-revalidate, max-age=0
+ Content-Security-Policy:
+ - frame-src 'self'; frame-ancestors 'self'; object-src 'none';
+ Location:
+ - http://example.com/org-oidc/callback/?state=not-a-random-string&session_state=7602d0f0-6118-4e76-891f-adc44ac8dd8c&iss=http%3A%2F%2Flocalhost%3A8080%2Frealms%2Ftest&code=0c731757-e839-421f-b981-cbde9172382c.7602d0f0-6118-4e76-891f-adc44ac8dd8c.adf4ad83-4550-4619-9231-73bd8d700f45
+ Referrer-Policy:
+ - no-referrer
+ Set-Cookie:
+ - KEYCLOAK_LOCALE=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test/; HttpOnly
+ - KC_RESTART=; Version=1; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0;
+ Path=/realms/test/; HttpOnly
+ - KC_AUTH_STATE=; Version=1; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0;
+ Path=/realms/test/
+ - KEYCLOAK_IDENTITY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTg2NTcyMDEsImlhdCI6MTcxODYyMTIwMSwianRpIjoiYTY5MmFiNjctNzUzYS00OTg4LThkY2MtNDYzMzNjOTk3NGI2IiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiNmRiMmRiODctZGUzMS00ZTMwLTlmMjUtY2VmZTVkYThiMTU0IiwidHlwIjoiU2VyaWFsaXplZC1JRCIsInNlc3Npb25fc3RhdGUiOiI3NjAyZDBmMC02MTE4LTRlNzYtODkxZi1hZGM0NGFjOGRkOGMiLCJzaWQiOiI3NjAyZDBmMC02MTE4LTRlNzYtODkxZi1hZGM0NGFjOGRkOGMiLCJzdGF0ZV9jaGVja2VyIjoiY21xcnBFQU5acEwwRV9qYW52UzZKWVFPdjhXZlgyek5QX0NZSWxrQXd3MCJ9.P3wa8evmGFwjV_xUhzNxSYP3cvBC_bDt3RCsqXW6Acw;
+ Version=1; Path=/realms/test/; SameSite=None; Secure; HttpOnly
+ - KEYCLOAK_IDENTITY_LEGACY=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTg2NTcyMDEsImlhdCI6MTcxODYyMTIwMSwianRpIjoiYTY5MmFiNjctNzUzYS00OTg4LThkY2MtNDYzMzNjOTk3NGI2IiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiNmRiMmRiODctZGUzMS00ZTMwLTlmMjUtY2VmZTVkYThiMTU0IiwidHlwIjoiU2VyaWFsaXplZC1JRCIsInNlc3Npb25fc3RhdGUiOiI3NjAyZDBmMC02MTE4LTRlNzYtODkxZi1hZGM0NGFjOGRkOGMiLCJzaWQiOiI3NjAyZDBmMC02MTE4LTRlNzYtODkxZi1hZGM0NGFjOGRkOGMiLCJzdGF0ZV9jaGVja2VyIjoiY21xcnBFQU5acEwwRV9qYW52UzZKWVFPdjhXZlgyek5QX0NZSWxrQXd3MCJ9.P3wa8evmGFwjV_xUhzNxSYP3cvBC_bDt3RCsqXW6Acw;
+ Version=1; Path=/realms/test/; HttpOnly
+ - KEYCLOAK_SESSION=test/6db2db87-de31-4e30-9f25-cefe5da8b154/7602d0f0-6118-4e76-891f-adc44ac8dd8c;
+ Version=1; Expires=Mon, 17-Jun-2024 20:46:41 GMT; Max-Age=36000; Path=/realms/test/;
+ SameSite=None; Secure
+ - KEYCLOAK_SESSION_LEGACY=test/6db2db87-de31-4e30-9f25-cefe5da8b154/7602d0f0-6118-4e76-891f-adc44ac8dd8c;
+ Version=1; Expires=Mon, 17-Jun-2024 20:46:41 GMT; Max-Age=36000; Path=/realms/test/
+ - KEYCLOAK_REMEMBER_ME=; Version=1; Comment=Expiring cookie; Expires=Thu, 01-Jan-1970
+ 00:00:10 GMT; Max-Age=0; Path=/realms/test/; HttpOnly
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Robots-Tag:
+ - none
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '0'
+ status:
+ code: 302
+ message: Found
+- request:
+ body: client_id=testid&client_secret=7DB3KUAAizYCcmZufpHRVOcD0TOkNO3I&grant_type=authorization_code&code=0c731757-e839-421f-b981-cbde9172382c.7602d0f0-6118-4e76-891f-adc44ac8dd8c.adf4ad83-4550-4619-9231-73bd8d700f45&redirect_uri=http%3A%2F%2Fexample.com%2Forg-oidc%2Fcallback%2F
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ Content-Length:
+ - '272'
+ Content-Type:
+ - application/x-www-form-urlencoded
+ User-Agent:
+ - python-requests/2.32.2
+ method: POST
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/token
+ response:
+ body:
+ string: '{"access_token":"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTg2MjE1MDIsImlhdCI6MTcxODYyMTIwMiwiYXV0aF90aW1lIjoxNzE4NjIxMjAxLCJqdGkiOiJiMjBkMTVmMS0yNmZjLTRlMmEtODhmYS0wOGZhNTQ3ODBlNWYiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiNmRiMmRiODctZGUzMS00ZTMwLTlmMjUtY2VmZTVkYThiMTU0IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoidGVzdGlkIiwibm9uY2UiOiJub3QtYS1yYW5kb20tc3RyaW5nIiwic2Vzc2lvbl9zdGF0ZSI6Ijc2MDJkMGYwLTYxMTgtNGU3Ni04OTFmLWFkYzQ0YWM4ZGQ4YyIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOlsiaHR0cDovLzEyNy4wLjAuMTo4MDAwIl0sInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJkZWZhdWx0LXJvbGVzLXRlc3QiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgZW1haWwgcHJvZmlsZSBrdmsgZ3JvdXBzIGJzbiIsInNpZCI6Ijc2MDJkMGYwLTYxMTgtNGU3Ni04OTFmLWFkYzQ0YWM4ZGQ4YyIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJncm91cHMiOlsiUmVnaXN0cmVlcmRlcnMiLCJkZWZhdWx0LXJvbGVzLXRlc3QiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl0sInByZWZlcnJlZF91c2VybmFtZSI6ImFkbWluIiwiZW1haWwiOiJhZG1pbkBleGFtcGxlLmNvbSJ9.OHAB_tiseDRl7w3jLzjGSUhfqrs_GLu3cJmjVWConm7sNZv0lyuWkhZb3jXCg6wcV8Y8QS90FLmVbM3qAWU7SLoJIDPZfyr3XOnuNtzMKPI13LUxxXFx655M7DxSi97nIK5C7pky1ChILyzZWvPJW8RBoFvJhLJhKT8MrqyOo-fhCE7JmpbXAtIRlMrqNUNbyAvHY8CfrVZsjdEZnLFRYJ7zOxGQqmd1_2uKeCJrEJyWxSS2hVEetcAEB5a6Fj61_7Wex48YLK-KwCQdTgYpv3JVw3y6HCdmf_XQ1kFl_wB2GVsrZbHW0LWfmoBySQZAthK8UtLOUsw44ymvnKD3nA","expires_in":300,"refresh_expires_in":1799,"refresh_token":"eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJlNzE1ZTA1MS02Y2RiLTQ4Y2MtYjRmNC1mMDcyMmM4MWY5ZDMifQ.eyJleHAiOjE3MTg2MjMwMDEsImlhdCI6MTcxODYyMTIwMiwianRpIjoiNzBjM2JmNTAtYTFhMC00Y2Y3LTg2ZGUtMmZiOGU0NGU2ODVjIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0IiwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0Iiwic3ViIjoiNmRiMmRiODctZGUzMS00ZTMwLTlmMjUtY2VmZTVkYThiMTU0IiwidHlwIjoiUmVmcmVzaCIsImF6cCI6InRlc3RpZCIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsInNlc3Npb25fc3RhdGUiOiI3NjAyZDBmMC02MTE4LTRlNzYtODkxZi1hZGM0NGFjOGRkOGMiLCJzY29wZSI6Im9wZW5pZCBlbWFpbCBwcm9maWxlIGt2ayBncm91cHMgYnNuIiwic2lkIjoiNzYwMmQwZjAtNjExOC00ZTc2LTg5MWYtYWRjNDRhYzhkZDhjIn0.O6Z8SH7YSHbnp2qOvGaCryOrN0vGuI87quE7xWkplvI","token_type":"Bearer","id_token":"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTg2MjE1MDIsImlhdCI6MTcxODYyMTIwMiwiYXV0aF90aW1lIjoxNzE4NjIxMjAxLCJqdGkiOiJhMzQ0NjFkOC00ZWZlLTQ0ZmMtOWIyYS1iZDQ5YWMxMTgyNWQiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJ0ZXN0aWQiLCJzdWIiOiI2ZGIyZGI4Ny1kZTMxLTRlMzAtOWYyNS1jZWZlNWRhOGIxNTQiLCJ0eXAiOiJJRCIsImF6cCI6InRlc3RpZCIsIm5vbmNlIjoibm90LWEtcmFuZG9tLXN0cmluZyIsInNlc3Npb25fc3RhdGUiOiI3NjAyZDBmMC02MTE4LTRlNzYtODkxZi1hZGM0NGFjOGRkOGMiLCJhdF9oYXNoIjoiX19zWTdxVVVRLTB4QnZ1Z1BzZlZNQSIsImFjciI6IjEiLCJzaWQiOiI3NjAyZDBmMC02MTE4LTRlNzYtODkxZi1hZGM0NGFjOGRkOGMiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiZ3JvdXBzIjpbIlJlZ2lzdHJlZXJkZXJzIiwiZGVmYXVsdC1yb2xlcy10ZXN0Iiwib2ZmbGluZV9hY2Nlc3MiLCJ1bWFfYXV0aG9yaXphdGlvbiJdLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJhZG1pbiIsImVtYWlsIjoiYWRtaW5AZXhhbXBsZS5jb20ifQ.feryIJUdewFDR8M89ECdkn-kIGY554CApQ9z5tA_L9IQNsVZq9k4IKd62OFwfT3iPfWwriW7uftRVcYtrKlYdeKb7POF9WeCfrWm2YtkFPkyVSE5LMgFFfR56sQbZ_hPItdButuuqO_gLeFduznRaap4ym0Pew3NNf0Ad82P3ZsoG5JANW8GNQOaGtQklMDT1XuWHU6TYaCgWtq9c8v2BVhoRpUghxR5B_6Ms4S894qz855KvbRAW3_bmBNM5EgLakWN_eyUrSM4AwTmrhUkPBEqyhMBf5xOKhNg-lBkGGhlwi4GpCbOoz1aJ_MjVQR47IAB6ld9FPeDR9d-rIR4SA","not-before-policy":0,"session_state":"7602d0f0-6118-4e76-891f-adc44ac8dd8c","scope":"openid
+ email profile kvk groups bsn"}'
+ headers:
+ Cache-Control:
+ - no-store
+ Content-Type:
+ - application/json
+ Pragma:
+ - no-cache
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '3698'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.32.2
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/certs
+ response:
+ body:
+ string: '{"keys":[{"kid":"4UNQAcvUcv-DFUOx_4O1gt13OdJSotqEKPZurs2vQW8","kty":"RSA","alg":"RS256","use":"sig","n":"2DOZ0qHie73SuFVR7civrl6r82YUiAghfzaMowjCg0o06AF--2lIS7vNV_PbsVVznPAAMqVrNG-8CcevEzvVZMQD9nH4DI7xlOxK0lrYu8rmMeSfOvXVbBVsWBZe0jnGNukZqjwmRE5__ttJdxPfIBT5-2L6mguQbDfhSUEEdIW7y7UfOXvqLqEcBtoIEB-ORKDTUIQwGZM5mSCy-cY3cHvvZfZVgaUUy5NvujPRXTMje4n_hG0KfEV-40G9qC2_Xvx4EooJzBZ6FSThiWhCpwhIvzcQqB6M9lHW7nU6wADhYPNCa2OKWvphwZ_zbrF4B9dmS6Zli5rBvbox9Hh45w","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMLTANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANgzmdKh4nu90rhVUe3Ir65eq/NmFIgIIX82jKMIwoNKNOgBfvtpSEu7zVfz27FVc5zwADKlazRvvAnHrxM71WTEA/Zx+AyO8ZTsStJa2LvK5jHknzr11WwVbFgWXtI5xjbpGao8JkROf/7bSXcT3yAU+fti+poLkGw34UlBBHSFu8u1Hzl76i6hHAbaCBAfjkSg01CEMBmTOZkgsvnGN3B772X2VYGlFMuTb7oz0V0zI3uJ/4RtCnxFfuNBvagtv178eBKKCcwWehUk4YloQqcISL83EKgejPZR1u51OsAA4WDzQmtjilr6YcGf826xeAfXZkumZYuawb26MfR4eOcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAsnQG/Yi2g1XTCJn74hWv9MjxVAaZb4gBAc2AWm5VgAjhFEM9h6x6m1mQkq7JM4rIdAj8jw55Ok9CBVBIqq4G4cME3eUvVytkj2lC9zcRoAivjjZF2HPg7zNPa2TTR50asmHPRokppV6gewO/C+o5as+4P2zqDXBh61aRd/9kdQfkg14LBbH5/dYccAuvUqlTYC4IEPCvVmBNC1xsMjf0vohvoSjm9vL2bfqG/RJH0ScdCjOd5d2zju4/e2oVdluWm+vzKBQplc7tVMuKpn6LcLmVHiGNAl+EBIZH+WVLlTx0D1+kbHZsfLYG53lQg2LsvurRbWyF/a5fVM/oLTn5ag=="],"x5t":"H5xfs1pRtvX0HyVTskx7eTXx88U","x5t#S256":"XurVtKAIEyc4w9HCGOhnjoRHnYu4d9HCn_5YHmkScJg"},{"kid":"TV3Tl5jIY1nrJLSb53UKEubLR5gYiq9slq1SsDDg1HU","kty":"RSA","alg":"RSA-OAEP","use":"enc","n":"pNvU3ecpVHbJT4bCOEpw6cnV1yi65tB3I0bRF2ilLVOY944QRAGnjBBECPIzNbgqavghYp1j75F2nq6_ny1CYfoaxTV2iDpRUw8_f7sliYbl8FrLLat0S25ItlZrg5TEJHObvOqlG2_nXoeH36MRWwNhms2uCqfhn5VgtenIzpQIBolnM7zzGp21NvdJ1C_ZAUzkXC-l3oQ-BXTtpEVM4h2KpYh4gfZJWCbYij5d1e1YApKD6V61_Cs3Oa2OY7CAUyq5kgAWJZFDB6CpzIr226u3bV7F9RbrQu3Ybc_Lv33EwykscLznKWZY2Mbs3Iz_rFNv3sVX_vHpH4DHWlKu7Q","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMlzANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKTb1N3nKVR2yU+GwjhKcOnJ1dcouubQdyNG0RdopS1TmPeOEEQBp4wQRAjyMzW4Kmr4IWKdY++Rdp6uv58tQmH6GsU1dog6UVMPP3+7JYmG5fBayy2rdEtuSLZWa4OUxCRzm7zqpRtv516Hh9+jEVsDYZrNrgqn4Z+VYLXpyM6UCAaJZzO88xqdtTb3SdQv2QFM5Fwvpd6EPgV07aRFTOIdiqWIeIH2SVgm2Io+XdXtWAKSg+letfwrNzmtjmOwgFMquZIAFiWRQwegqcyK9turt21exfUW60Lt2G3Py799xMMpLHC85ylmWNjG7NyM/6xTb97FV/7x6R+Ax1pSru0CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAQGJHeTYSMvp0yndbIn7DLohO9lom5nRrx/bLyb7TiRfogyJEF6rQZ66CAkQFk5eMF878fsHTuMVjtmXVBnhojhVmK91HwjsNQu/8xR6QMXNKJQMvHR245vwUGxlWRw/36ObM1D7QjCd/q+FonpBEY4m5Y6Uz1U0HR2Cbh0E2afVlPLeV+F0LKrlyVMdIaWBGWftCGIKDAHaG/PD66zbAKtxerv2fBIDq100WHPhd57BZxX+2aGJp1IaRDgkxV0E/CjEy3+Knd8xbAgUSW0Tl6OTC75exIvlbzeluEBe0wlapAb7WvBKYsipSW8G8Ey7tjoolDT4AU82EaKUPstiMnA=="],"x5t":"AlfHDI0FOPQpt3RBAILt0dtW1yw","x5t#S256":"a7bhm8-JsnfY7bL_m8Yl72hgmp5516VZlFcVloKzk08"}]}'
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/json;charset=UTF-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '2909'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Authorization:
+ - Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJleHAiOjE3MTg2MjE1MDIsImlhdCI6MTcxODYyMTIwMiwiYXV0aF90aW1lIjoxNzE4NjIxMjAxLCJqdGkiOiJiMjBkMTVmMS0yNmZjLTRlMmEtODhmYS0wOGZhNTQ3ODBlNWYiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVhbG1zL3Rlc3QiLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiNmRiMmRiODctZGUzMS00ZTMwLTlmMjUtY2VmZTVkYThiMTU0IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoidGVzdGlkIiwibm9uY2UiOiJub3QtYS1yYW5kb20tc3RyaW5nIiwic2Vzc2lvbl9zdGF0ZSI6Ijc2MDJkMGYwLTYxMTgtNGU3Ni04OTFmLWFkYzQ0YWM4ZGQ4YyIsImFjciI6IjEiLCJhbGxvd2VkLW9yaWdpbnMiOlsiaHR0cDovLzEyNy4wLjAuMTo4MDAwIl0sInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJkZWZhdWx0LXJvbGVzLXRlc3QiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl19LCJyZXNvdXJjZV9hY2Nlc3MiOnsiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgZW1haWwgcHJvZmlsZSBrdmsgZ3JvdXBzIGJzbiIsInNpZCI6Ijc2MDJkMGYwLTYxMTgtNGU3Ni04OTFmLWFkYzQ0YWM4ZGQ4YyIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJncm91cHMiOlsiUmVnaXN0cmVlcmRlcnMiLCJkZWZhdWx0LXJvbGVzLXRlc3QiLCJvZmZsaW5lX2FjY2VzcyIsInVtYV9hdXRob3JpemF0aW9uIl0sInByZWZlcnJlZF91c2VybmFtZSI6ImFkbWluIiwiZW1haWwiOiJhZG1pbkBleGFtcGxlLmNvbSJ9.OHAB_tiseDRl7w3jLzjGSUhfqrs_GLu3cJmjVWConm7sNZv0lyuWkhZb3jXCg6wcV8Y8QS90FLmVbM3qAWU7SLoJIDPZfyr3XOnuNtzMKPI13LUxxXFx655M7DxSi97nIK5C7pky1ChILyzZWvPJW8RBoFvJhLJhKT8MrqyOo-fhCE7JmpbXAtIRlMrqNUNbyAvHY8CfrVZsjdEZnLFRYJ7zOxGQqmd1_2uKeCJrEJyWxSS2hVEetcAEB5a6Fj61_7Wex48YLK-KwCQdTgYpv3JVw3y6HCdmf_XQ1kFl_wB2GVsrZbHW0LWfmoBySQZAthK8UtLOUsw44ymvnKD3nA
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.32.2
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/userinfo
+ response:
+ body:
+ string: eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI0VU5RQWN2VWN2LURGVU94XzRPMWd0MTNPZEpTb3RxRUtQWnVyczJ2UVc4In0.eyJzdWIiOiI2ZGIyZGI4Ny1kZTMxLTRlMzAtOWYyNS1jZWZlNWRhOGIxNTQiLCJhdWQiOiJ0ZXN0aWQiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3JlYWxtcy90ZXN0IiwiZ3JvdXBzIjpbIlJlZ2lzdHJlZXJkZXJzIiwiZGVmYXVsdC1yb2xlcy10ZXN0Iiwib2ZmbGluZV9hY2Nlc3MiLCJ1bWFfYXV0aG9yaXphdGlvbiJdLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJhZG1pbiIsImVtYWlsIjoiYWRtaW5AZXhhbXBsZS5jb20ifQ.vx4dCJ-Y-PEzjy8p7CNPB3yy0TyV_QugOHRbiV6UY3qHtZUnZqSsJD991QUostcYECuyTHefqfRtdCbvSJcPWI4ucosY65vshUMBtQeahsFOgNwWp2BvCkALJmEya4H_gh63vVlVZ2ZOSpWpah6eV2PNhiiYWD-Y9qEuLMzwngNvp5hna30BiRKAEsStB7izjE5pGECqkQm7pxCeZWHU81Lbh5fSo_2XvcGZ1Z-tf6DN95Oz4ers9YrG6dKSuh-HciY1zhv7mcee_tlJaeKjITue6r06163oKdjsYKRpiR4bLQ9256KafoxmU6O0IIlpkQhmtXrmaFSg0XyBYU8qcQ
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/jwt
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '813'
+ status:
+ code: 200
+ message: OK
+- request:
+ body: null
+ headers:
+ Accept:
+ - '*/*'
+ Accept-Encoding:
+ - gzip, deflate, br
+ Connection:
+ - keep-alive
+ User-Agent:
+ - python-requests/2.32.2
+ method: GET
+ uri: http://localhost:8080/realms/test/protocol/openid-connect/certs
+ response:
+ body:
+ string: '{"keys":[{"kid":"4UNQAcvUcv-DFUOx_4O1gt13OdJSotqEKPZurs2vQW8","kty":"RSA","alg":"RS256","use":"sig","n":"2DOZ0qHie73SuFVR7civrl6r82YUiAghfzaMowjCg0o06AF--2lIS7vNV_PbsVVznPAAMqVrNG-8CcevEzvVZMQD9nH4DI7xlOxK0lrYu8rmMeSfOvXVbBVsWBZe0jnGNukZqjwmRE5__ttJdxPfIBT5-2L6mguQbDfhSUEEdIW7y7UfOXvqLqEcBtoIEB-ORKDTUIQwGZM5mSCy-cY3cHvvZfZVgaUUy5NvujPRXTMje4n_hG0KfEV-40G9qC2_Xvx4EooJzBZ6FSThiWhCpwhIvzcQqB6M9lHW7nU6wADhYPNCa2OKWvphwZ_zbrF4B9dmS6Zli5rBvbox9Hh45w","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMLTANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANgzmdKh4nu90rhVUe3Ir65eq/NmFIgIIX82jKMIwoNKNOgBfvtpSEu7zVfz27FVc5zwADKlazRvvAnHrxM71WTEA/Zx+AyO8ZTsStJa2LvK5jHknzr11WwVbFgWXtI5xjbpGao8JkROf/7bSXcT3yAU+fti+poLkGw34UlBBHSFu8u1Hzl76i6hHAbaCBAfjkSg01CEMBmTOZkgsvnGN3B772X2VYGlFMuTb7oz0V0zI3uJ/4RtCnxFfuNBvagtv178eBKKCcwWehUk4YloQqcISL83EKgejPZR1u51OsAA4WDzQmtjilr6YcGf826xeAfXZkumZYuawb26MfR4eOcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAsnQG/Yi2g1XTCJn74hWv9MjxVAaZb4gBAc2AWm5VgAjhFEM9h6x6m1mQkq7JM4rIdAj8jw55Ok9CBVBIqq4G4cME3eUvVytkj2lC9zcRoAivjjZF2HPg7zNPa2TTR50asmHPRokppV6gewO/C+o5as+4P2zqDXBh61aRd/9kdQfkg14LBbH5/dYccAuvUqlTYC4IEPCvVmBNC1xsMjf0vohvoSjm9vL2bfqG/RJH0ScdCjOd5d2zju4/e2oVdluWm+vzKBQplc7tVMuKpn6LcLmVHiGNAl+EBIZH+WVLlTx0D1+kbHZsfLYG53lQg2LsvurRbWyF/a5fVM/oLTn5ag=="],"x5t":"H5xfs1pRtvX0HyVTskx7eTXx88U","x5t#S256":"XurVtKAIEyc4w9HCGOhnjoRHnYu4d9HCn_5YHmkScJg"},{"kid":"TV3Tl5jIY1nrJLSb53UKEubLR5gYiq9slq1SsDDg1HU","kty":"RSA","alg":"RSA-OAEP","use":"enc","n":"pNvU3ecpVHbJT4bCOEpw6cnV1yi65tB3I0bRF2ilLVOY944QRAGnjBBECPIzNbgqavghYp1j75F2nq6_ny1CYfoaxTV2iDpRUw8_f7sliYbl8FrLLat0S25ItlZrg5TEJHObvOqlG2_nXoeH36MRWwNhms2uCqfhn5VgtenIzpQIBolnM7zzGp21NvdJ1C_ZAUzkXC-l3oQ-BXTtpEVM4h2KpYh4gfZJWCbYij5d1e1YApKD6V61_Cs3Oa2OY7CAUyq5kgAWJZFDB6CpzIr226u3bV7F9RbrQu3Ybc_Lv33EwykscLznKWZY2Mbs3Iz_rFNv3sVX_vHpH4DHWlKu7Q","e":"AQAB","x5c":["MIIClzCCAX8CBgGNeYaMlzANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDAR0ZXN0MB4XDTI0MDIwNTEzNDYxN1oXDTM0MDIwNTEzNDc1N1owDzENMAsGA1UEAwwEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKTb1N3nKVR2yU+GwjhKcOnJ1dcouubQdyNG0RdopS1TmPeOEEQBp4wQRAjyMzW4Kmr4IWKdY++Rdp6uv58tQmH6GsU1dog6UVMPP3+7JYmG5fBayy2rdEtuSLZWa4OUxCRzm7zqpRtv516Hh9+jEVsDYZrNrgqn4Z+VYLXpyM6UCAaJZzO88xqdtTb3SdQv2QFM5Fwvpd6EPgV07aRFTOIdiqWIeIH2SVgm2Io+XdXtWAKSg+letfwrNzmtjmOwgFMquZIAFiWRQwegqcyK9turt21exfUW60Lt2G3Py799xMMpLHC85ylmWNjG7NyM/6xTb97FV/7x6R+Ax1pSru0CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAQGJHeTYSMvp0yndbIn7DLohO9lom5nRrx/bLyb7TiRfogyJEF6rQZ66CAkQFk5eMF878fsHTuMVjtmXVBnhojhVmK91HwjsNQu/8xR6QMXNKJQMvHR245vwUGxlWRw/36ObM1D7QjCd/q+FonpBEY4m5Y6Uz1U0HR2Cbh0E2afVlPLeV+F0LKrlyVMdIaWBGWftCGIKDAHaG/PD66zbAKtxerv2fBIDq100WHPhd57BZxX+2aGJp1IaRDgkxV0E/CjEy3+Knd8xbAgUSW0Tl6OTC75exIvlbzeluEBe0wlapAb7WvBKYsipSW8G8Ey7tjoolDT4AU82EaKUPstiMnA=="],"x5t":"AlfHDI0FOPQpt3RBAILt0dtW1yw","x5t#S256":"a7bhm8-JsnfY7bL_m8Yl72hgmp5516VZlFcVloKzk08"}]}'
+ headers:
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/json;charset=UTF-8
+ Referrer-Policy:
+ - no-referrer
+ Strict-Transport-Security:
+ - max-age=31536000; includeSubDomains
+ X-Content-Type-Options:
+ - nosniff
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-XSS-Protection:
+ - 1; mode=block
+ content-length:
+ - '2909'
+ status:
+ code: 200
+ message: OK
+version: 1
diff --git a/src/openforms/tests/test_registrator_prefill.py b/src/openforms/tests/test_registrator_prefill.py
index 9002e1bb14..daea5d4d87 100644
--- a/src/openforms/tests/test_registrator_prefill.py
+++ b/src/openforms/tests/test_registrator_prefill.py
@@ -1,3 +1,4 @@
+from pathlib import Path
from unittest.mock import patch
from django.contrib.auth.models import Group
@@ -5,8 +6,6 @@
import requests_mock
from django_webtest import WebTest
-from furl import furl
-from mozilla_django_oidc_db.models import OpenIDConnectConfig
from rest_framework import status
from zgw_consumers.test.factories import ServiceFactory
@@ -16,13 +15,21 @@
REGISTRATOR_SUBJECT_SESSION_KEY,
AuthAttribute,
)
+from openforms.authentication.contrib.org_oidc.plugin import PLUGIN_IDENTIFIER
+from openforms.authentication.contrib.org_oidc.tests.base import mock_org_oidc_config
+from openforms.authentication.tests.utils import URLsHelper
from openforms.contrib.haal_centraal.models import HaalCentraalConfig
from openforms.contrib.haal_centraal.tests.utils import load_json_mock
-from openforms.forms.tests.factories import FormStepFactory
+from openforms.forms.tests.factories import FormFactory
from openforms.prefill.contrib.haalcentraal_brp.constants import AttributesV1
from openforms.submissions.models import Submission
+from openforms.utils.tests.concurrent import mock_parallel_executor
+from openforms.utils.tests.keycloak import keycloak_login
+from openforms.utils.tests.vcr import OFVCRMixin
from openforms.utils.urls import reverse_plus
+TEST_FILES = (Path(__file__).parent / "data").resolve()
+
CONFIGURATION = {
"display": "form",
"components": [
@@ -60,204 +67,128 @@
BASE_URL="http://example.com",
ALLOWED_HOSTS=["example.com", "testserver"],
)
-class OIDCRegistratorSubjectHaalCentraalPrefillIntegrationTest(WebTest):
+class OIDCRegistratorSubjectHaalCentraalPrefillIntegrationTest(OFVCRMixin, WebTest):
"""
Here we test the full flow of an employee using OIDC to login to a form,
enter a clients BSN, start the form and have the prefill machinery add data about the client
"""
+ VCR_TEST_FILES = TEST_FILES
+
csrf_checks = False
+ extra_environ = {"HTTP_HOST": "example.com"}
+ @mock_org_oidc_config(enabled=True, make_users_staff=True)
@patch(
- "openforms.authentication.contrib.org_oidc.backends.OIDCAuthenticationBackend.get_userinfo"
+ "openforms.contrib.haal_centraal.models.HaalCentraalConfig.get_solo",
+ return_value=HaalCentraalConfig(
+ brp_personen_service=ServiceFactory.build(api_root="https://personen/api/")
+ ),
)
- @patch(
- "openforms.authentication.contrib.org_oidc.backends.OIDCAuthenticationBackend.store_tokens"
- )
- @patch(
- "openforms.authentication.contrib.org_oidc.backends.OIDCAuthenticationBackend.verify_token"
- )
- @patch(
- "openforms.authentication.contrib.org_oidc.backends.OIDCAuthenticationBackend.get_token"
- )
- @patch("mozilla_django_oidc_db.models.OpenIDConnectConfig.get_solo")
- @patch("openforms.contrib.haal_centraal.models.HaalCentraalConfig.get_solo")
- @patch("openforms.logging.logevent._create_log")
- def test_flow(
- self,
- mock_create_log,
- mock_haalcentraal_solo,
- mock_get_solo,
- mock_get_token,
- mock_verify_token,
- mock_store_tokens,
- mock_get_userinfo,
- ):
- self.assertFalse(User.objects.exists())
-
- hc_brp_service = ServiceFactory.build(api_root="https://personen/api/")
- mock_haalcentraal_solo.return_value = HaalCentraalConfig(
- brp_personen_service=hc_brp_service
+ @mock_parallel_executor()
+ def test_flow(self, mock_haalcentraal_solo):
+ assert not User.objects.exists()
+ # group returned by Keycloak and set up with correct permissions
+ assert Group.objects.filter(name__iexact="Registreerders").exists()
+
+ form = FormFactory.create(
+ generate_minimal_setup=True,
+ formstep__form_definition__configuration=CONFIGURATION,
+ formstep__form_definition__login_required=True,
+ authentication_backends=[PLUGIN_IDENTIFIER],
+ name="My form",
+ slug="my-form",
)
-
- mock_get_solo.return_value = OpenIDConnectConfig(
- **{
- **default_config,
- **{
- "id": 1,
- "username_claim": "arbitrary_employee_id_claim",
- "claim_mapping": {
- "email": "email",
- "last_name": "family_name",
- "first_name": "given_name",
- "employee_id": "arbitrary_employee_id_claim",
- },
- "groups_claim": "arbitrary_groups",
- },
- }
+ url_helper = URLsHelper(form=form, host="http://example.com")
+ start_url = url_helper.get_auth_start(plugin_id=PLUGIN_IDENTIFIER)
+ start_response = self.app.get(start_url)
+
+ # simulate login to Keycloak
+ redirect_uri = keycloak_login(
+ start_response["Location"],
+ username="admin",
+ password="admin",
+ host="http://example.com",
)
- mock_get_token.return_value = {
- "id_token": "mock-id-token",
- "access_token": "mock-access-token",
- }
- user_claims = {
- "sub": "arbitrary_employee_id_claim",
- "email": "admin@testserver",
- "given_name": "John",
- "family_name": "Doe",
- "arbitrary_employee_id_claim": "my_id_value",
- "arbitrary_groups": ["Registreerders"],
- }
- mock_verify_token.return_value = user_claims
- mock_get_userinfo.return_value = user_claims
- mock_store_tokens.return_value = {"whatever": 1}
- # grab user group (from default_groups fixture)
- group = Group.objects.get(name__iexact="Registreerders")
+ # complete the login flow on our end
+ registrator_subject_page = self.app.get(redirect_uri, auto_follow=True)
- # setup our form and urls
- form_step = FormStepFactory.create(
- form_definition__configuration=CONFIGURATION,
- form_definition__login_required=True,
- form__authentication_backends=["org-oidc"],
- form__name="My Form",
- form__slug="my-form",
- )
- form = form_step.form
- form_url = reverse_plus("core:form-detail", kwargs={"slug": form.slug})
-
- # start of flow begins by browsing the authentication:start view
- auth_start_url = reverse_plus(
- "authentication:start",
- kwargs={"slug": form.slug, "plugin_id": "org-oidc"},
- )
-
- auth_start_response = self.app.get(
- auth_start_url, {"next": form_url}, status=302
- )
- # redirect to the OIDC request view
- auth_start_response.follow(status=302)
-
- # at this point the user would redirect to the OIDC provider and return to our callback
- handle_return_url = reverse_plus(
- "authentication:return",
- kwargs={"slug": form.slug, "plugin_id": "org-oidc"},
- query={"next": form_url},
- )
+ with self.subTest("user created"):
+ user = User.objects.get()
+ self.assertEqual(user.username, "admin")
+ self.assertTrue(user.is_staff)
- oidc_callback_url = reverse_plus("org-oidc:oidc_authentication_callback")
-
- session = self.app.session
- session["oidc_states"] = {"mock": {"nonce": "nonce"}}
- session["oidc_login_next"] = handle_return_url
- session.save()
-
- # access the oidc callback view
- oidc_callback_response = self.app.get(
- oidc_callback_url, {"code": "mock", "state": "mock"}
- )
-
- # oidc machinery worked
- mock_get_token.assert_called_once()
- mock_verify_token.assert_called_once()
- mock_store_tokens.assert_called_once()
- mock_get_userinfo.assert_called_once()
-
- # a user was created
- user = User.objects.get()
- self.assertTrue(user.employee_id, "my_id_value")
- # note: assertQuerysetEqual doesn't check primary keys, so can't detect duplicate objects
- self.assertEqual(user.groups.get().pk, group.pk)
-
- # redirects from oidc callback, via the plugin return view, to the registrator_subject form
- return_response = oidc_callback_response.follow(status=302)
- registrator_subject_form_response = return_response.follow(status=200)
+ with self.subTest("registrator subject page"):
+ self.assertTemplateUsed(
+ registrator_subject_page,
+ "of_authentication/registrator_subject_info.html",
+ )
+ registrator_subject_form = registrator_subject_page.forms["registrator-subject"]
# fill in the BSN in the form registrator-subject
- registrator_subject_form = registrator_subject_form_response.forms[
- "registrator-subject"
- ]
registrator_subject_form["mode"].select("citizen")
registrator_subject_form["bsn"] = "999990676"
form_response = registrator_subject_form.submit(status=302).follow(status=200)
-
- # back at the form
- # TODO webtest doesn't redirect/forward the hostname as expected, so just check path
- self.assertEqual(furl(form_response.request.url).path, furl(form_url).path)
-
- # check our session data
- self.assertIn(FORM_AUTH_SESSION_KEY, self.app.session)
- s = self.app.session[FORM_AUTH_SESSION_KEY]
- self.assertEqual(s["plugin"], "org-oidc")
- self.assertEqual(s["attribute"], AuthAttribute.employee_id)
- self.assertEqual(s["value"], "my_id_value")
-
- self.assertIn(REGISTRATOR_SUBJECT_SESSION_KEY, self.app.session)
- s = self.app.session[REGISTRATOR_SUBJECT_SESSION_KEY]
- self.assertEqual(s["attribute"], AuthAttribute.bsn)
- self.assertEqual(s["value"], "999990676")
-
- # fake a submit
- form_api_url = reverse_plus(
- "api:form-detail", kwargs={"uuid_or_slug": form.uuid}
- )
-
- body = {
- "form": form_api_url,
- "formUrl": form_url,
- }
-
- with requests_mock.Mocker(real_http=False) as m:
- m.get(
- "https://personen/api/ingeschrevenpersonen/999990676",
- status_code=200,
- json=load_json_mock("ingeschrevenpersonen.v1.json"),
+ # XXX webtest makes the host http://testserver, which is different from our
+ # BASE_URL setting.
+ self.assertEqual(form_response.request.url, url_helper.frontend_start)
+
+ with self.subTest("session state before submission start"):
+ # check our session data
+ self.assertIn(FORM_AUTH_SESSION_KEY, self.app.session)
+ s = self.app.session[FORM_AUTH_SESSION_KEY]
+ self.assertEqual(s["plugin"], "org-oidc")
+ self.assertEqual(s["attribute"], AuthAttribute.employee_id)
+ self.assertEqual(s["value"], "admin")
+
+ self.assertIn(REGISTRATOR_SUBJECT_SESSION_KEY, self.app.session)
+ s = self.app.session[REGISTRATOR_SUBJECT_SESSION_KEY]
+ self.assertEqual(s["attribute"], AuthAttribute.bsn)
+ self.assertEqual(s["value"], "999990676")
+
+ with self.subTest("start submission with prefill"):
+ # fake a submit
+ form_api_url = reverse_plus(
+ "api:form-detail", kwargs={"uuid_or_slug": form.uuid}
)
- response = self.app.post_json(
- reverse_plus("api:submission-list"),
- body,
- status=201,
- )
+ with requests_mock.Mocker(real_http=False) as m:
+ m.get(
+ "https://personen/api/ingeschrevenpersonen/999990676",
+ status_code=200,
+ json=load_json_mock("ingeschrevenpersonen.v1.json"),
+ )
+
+ response = self.app.post_json(
+ reverse_plus("api:submission-list"),
+ {
+ "form": form_api_url,
+ "formUrl": url_helper.frontend_start,
+ },
+ status=201,
+ )
- self.assertEqual(response.status_code, status.HTTP_201_CREATED)
- submission = Submission.objects.get()
- state = submission.load_submission_value_variables_state()
+ self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+ submission = Submission.objects.get()
+ state = submission.load_submission_value_variables_state()
- vars = state.get_prefill_variables()
+ variables = state.get_prefill_variables()
- self.assertEqual(len(vars), 1)
- self.assertEqual(vars[0].key, "voornamen")
+ self.assertEqual(len(variables), 1)
+ self.assertEqual(variables[0].key, "voornamen")
- # check we got the name from the haalcentraal JSON mock
- self.assertEqual(vars[0].value, "Cornelia Francisca")
+ # check we got the name from the haalcentraal JSON mock
+ self.assertEqual(variables[0].value, "Cornelia Francisca")
- # test registrator data
- self.assertEqual(submission.auth_info.value, "999990676")
- self.assertEqual(submission.auth_info.plugin, "registrator")
- self.assertEqual(submission.auth_info.attribute, AuthAttribute.bsn)
+ # test registrator data
+ self.assertEqual(submission.auth_info.value, "999990676")
+ self.assertEqual(submission.auth_info.plugin, "registrator")
+ self.assertEqual(submission.auth_info.attribute, AuthAttribute.bsn)
- self.assertEqual(submission.registrator.value, "my_id_value")
- self.assertEqual(submission.registrator.plugin, "org-oidc")
- self.assertEqual(submission.registrator.attribute, AuthAttribute.employee_id)
+ self.assertEqual(submission.registrator.value, "admin")
+ self.assertEqual(submission.registrator.plugin, "org-oidc")
+ self.assertEqual(
+ submission.registrator.attribute, AuthAttribute.employee_id
+ )
diff --git a/src/openforms/urls.py b/src/openforms/urls.py
index 46e31d89cb..7617089845 100644
--- a/src/openforms/urls.py
+++ b/src/openforms/urls.py
@@ -19,6 +19,26 @@
admin.site.index_title = _("Welcome to the Open Forms admin")
admin.site.enable_nav_sidebar = False
+# DeprecationWarning
+# TODO: remove in Open Forms 3.0 - these are moved to /auth/oidc/*
+_legacy_oidc_urls = [
+ path(
+ "",
+ include("openforms.authentication.contrib.digid_eherkenning_oidc.legacy_urls"),
+ ),
+ path(
+ "org-oidc/",
+ include("openforms.authentication.contrib.org_oidc.urls"),
+ ),
+ # still included so that URL reversing for the authentication request view works
+ path("oidc/", include("mozilla_django_oidc.urls")), # moved to /auth/oidc
+ # included with namespace for backwards compatibility reasons
+ path(
+ "oidc/",
+ include(([path("", include("mozilla_django_oidc.urls"))], "legacy_oidc")),
+ ),
+]
+
urlpatterns = [
path("admin/", include("openforms.admin.urls")),
path(
@@ -34,6 +54,8 @@
path("cookies/", include("cookie_consent.urls")),
path("tinymce/", decorator_include(login_required, "tinymce.urls")), # type: ignore
path("api/", include("openforms.api.urls", namespace="api")),
+ *_legacy_oidc_urls,
+ path("auth/oidc/", include("mozilla_django_oidc.urls")),
path("auth/", include("openforms.authentication.urls", namespace="authentication")),
path(
"appointments/",
@@ -44,32 +66,6 @@
"submissions/",
include("openforms.submissions.urls", namespace="submissions"),
),
- path("oidc/", include("mozilla_django_oidc.urls")),
- path("org-oidc/", include("openforms.authentication.contrib.org_oidc.urls")),
- path(
- "digid-oidc/",
- include(
- "openforms.authentication.contrib.digid_eherkenning_oidc.digid_urls",
- ),
- ),
- path(
- "eherkenning-oidc/",
- include(
- "openforms.authentication.contrib.digid_eherkenning_oidc.eherkenning_urls",
- ),
- ),
- path(
- "digid-machtigen-oidc/",
- include(
- "openforms.authentication.contrib.digid_eherkenning_oidc.digid_machtigen_urls",
- ),
- ),
- path(
- "eherkenning-bewindvoering-oidc/",
- include(
- "openforms.authentication.contrib.digid_eherkenning_oidc.eherkenning_bewindvoering_urls",
- ),
- ),
path("payment/", include("openforms.payments.urls", namespace="payments")),
# NOTE: we dont use the User creation feature so don't enable all the mock views
path("digid/", include("openforms.authentication.contrib.digid.urls")),
diff --git a/src/openforms/utils/tests/concurrent.py b/src/openforms/utils/tests/concurrent.py
new file mode 100644
index 0000000000..eff2bb1e8f
--- /dev/null
+++ b/src/openforms/utils/tests/concurrent.py
@@ -0,0 +1,38 @@
+from concurrent.futures import Executor, Future
+from contextlib import contextmanager
+from unittest.mock import patch
+
+
+class _DummyThreadPoolExecutor(Executor):
+ def __init__(self, max_workers=None):
+ self._max_workers = max_workers
+
+ def submit(self, fn, *args, **kwargs):
+ future = Future()
+ try:
+ result = fn(*args, **kwargs)
+ except Exception as exc:
+ future.set_exception(exc)
+ else:
+ future.set_result(result)
+ return future
+
+
+@contextmanager
+def mock_parallel_executor():
+ """
+ Mock the zgw_consumers.concurrent.parallel helper to not use real threads.
+
+ Useful for tests where queries are done in the tasks submitted to the pool - these
+ changes cannot be rolled back since the test DB transaction is not aware of the
+ extra DB transactions in the tests. This in turn leads to broken test isolation.
+ """
+ executor_patcher = patch(
+ "zgw_consumers.concurrent.futures.ThreadPoolExecutor",
+ new=_DummyThreadPoolExecutor,
+ )
+ conn_patcher = patch(
+ "zgw_consumers.concurrent.close_db_connections", return_value=None
+ )
+ with executor_patcher, conn_patcher:
+ yield
diff --git a/src/openforms/utils/tests/keycloak.py b/src/openforms/utils/tests/keycloak.py
new file mode 100644
index 0000000000..257ab10337
--- /dev/null
+++ b/src/openforms/utils/tests/keycloak.py
@@ -0,0 +1,99 @@
+"""
+Keycloak helpers taken from mozilla-django-oidc-db::tests/utils.py & pytest fixtures.
+
+These help dealing with/stubbing out OpenID Provider configuration.
+
+The Keycloak client ID/secret and URLs are set up for the config in
+docker/docker-compose.keycloak.yml. See the README.md in docker/keycloak/ for more
+information.
+"""
+
+from contextlib import contextmanager, nullcontext
+from unittest.mock import patch
+
+from django.apps import apps
+
+from pyquery import PyQuery as pq
+from requests import Session
+
+KEYCLOAK_BASE_URL = "http://localhost:8080/realms/test/protocol/openid-connect"
+
+
+def keycloak_login(
+ login_url: str,
+ username: str = "testuser",
+ password: str = "testuser",
+ host: str = "http://testserver/",
+ session: Session | None = None,
+) -> str:
+ """
+ Test helper to perform a keycloak login.
+
+ :param login_url: A login URL for keycloak with all query string parameters. E.g.
+ `client.get(reverse("login"))["Location"]`.
+ :returns: The redirect URI to consume in the django application, with the ``code``
+ ``state`` query parameters. Consume this with ``response = client.get(url)``.
+ """
+ cm = Session() if session is None else nullcontext(session)
+ with cm as session:
+ login_page = session.get(login_url)
+ assert login_page.status_code == 200
+
+ # process keycloak's login form and submit the username + password to
+ # authenticate
+ document = pq(login_page.text)
+ login_form = document("form#kc-form-login")
+ submit_url = login_form.attr("action")
+ assert isinstance(submit_url, str)
+ login_response = session.post(
+ submit_url,
+ data={
+ "username": username,
+ "password": password,
+ "credentialId": "",
+ "login": "Sign In",
+ },
+ allow_redirects=False,
+ )
+
+ assert login_response.status_code == 302
+ assert (redirect_uri := login_response.headers["Location"]).startswith(host)
+
+ return redirect_uri
+
+
+@contextmanager
+def mock_oidc_db_config(app_label: str, model: str, **overrides):
+ """
+ Bundle all the required mocks.
+
+ This context manager deliberately prevents the mocked things from being injected in
+ the test method signature.
+ """
+ defaults = {
+ "enabled": True,
+ "oidc_rp_client_id": "testid",
+ "oidc_rp_client_secret": "7DB3KUAAizYCcmZufpHRVOcD0TOkNO3I",
+ "oidc_rp_sign_algo": "RS256",
+ "oidc_rp_scopes_list": ["openid"],
+ "oidc_op_jwks_endpoint": f"{KEYCLOAK_BASE_URL}/certs",
+ "oidc_op_authorization_endpoint": f"{KEYCLOAK_BASE_URL}/auth",
+ "oidc_op_token_endpoint": f"{KEYCLOAK_BASE_URL}/token",
+ "oidc_op_user_endpoint": f"{KEYCLOAK_BASE_URL}/userinfo",
+ }
+ field_values = {**defaults, **overrides}
+ model_cls = apps.get_model(app_label, model)
+ with (
+ # bypass django-solo queries + cache hits
+ patch(
+ f"{model_cls.__module__}.{model}.get_solo",
+ return_value=model_cls(**field_values),
+ ),
+ # mock the state & nonce random value generation so we get predictable URLs to
+ # match with VCR
+ patch(
+ "mozilla_django_oidc.views.get_random_string",
+ return_value="not-a-random-string",
+ ),
+ ):
+ yield
diff --git a/src/openforms/utils/tests/test_migrations.py b/src/openforms/utils/tests/test_migrations.py
index bd7afce819..ab7b0a6f12 100644
--- a/src/openforms/utils/tests/test_migrations.py
+++ b/src/openforms/utils/tests/test_migrations.py
@@ -1,11 +1,12 @@
from django.core.management import call_command
from django.db import connection
from django.db.migrations.executor import MigrationExecutor
-from django.test import TransactionTestCase, override_settings
+from django.test import TransactionTestCase, override_settings, tag
unset = object()
+@tag("migrations")
class TestMigrations(TransactionTestCase):
"""
Test the effect of applying a migration