diff --git a/.github/workflows/pr_to_master.yml b/.github/workflows/pr_to_master.yml
new file mode 100644
index 0000000..d349109
--- /dev/null
+++ b/.github/workflows/pr_to_master.yml
@@ -0,0 +1,297 @@
+# Execute only if it's a PR which comes from dev
+name: PR to master
+on:
+ pull_request:
+ branches:
+ - master # I allow only PR from dev -> master
+
+jobs:
+ #-----------------------------------------------------------------------
+ #--- Validate the PR's branch
+ #-----------------------------------------------------------------------
+ validate-branch:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Enforce PRs to master must come from dev
+ run: |
+ if [[ "${{ github.head_ref }}" != "dev" ]]; then
+ echo "❌ PRs to master must come from dev!"
+ exit 1
+ else
+ echo "✅ PR from dev to master authorized."
+ fi
+
+ #-----------------------------------------------------------------------
+ #--- Detect the changes
+ #-----------------------------------------------------------------------
+ changes:
+ runs-on: ubuntu-latest
+ needs: validate-branch
+ if: success()
+ outputs:
+ user: ${{ steps.filter.outputs.user }}
+ book: ${{ steps.filter.outputs.book }}
+ review: ${{ steps.filter.outputs.review }}
+ api_gateway: ${{ steps.filter.outputs.api_gateway }}
+ registry_service: ${{ steps.filter.outputs.registry_service }}
+ frontend: ${{ steps.filter.outputs.frontend }}
+
+ steps:
+ - name: Checkout the main repository
+ uses: actions/checkout@v4
+ with:
+ submodules: true
+
+ - name: Detect changes
+ id: filter
+ uses: dorny/paths-filter@v3
+ with:
+ filters: |
+ user:
+ - 'services/user-service/**'
+ book:
+ - 'services/book-service/**'
+ review:
+ - 'services/review-service/**'
+ api_gateway:
+ - 'services/api-gateway/**'
+ registry_service:
+ - 'services/registry-service/**'
+ frontend:
+ - 'mflibrary-frontend/**'
+
+ #-----------------------------------------------------------------------
+ #--- Build and push user-service Docker image
+ #-----------------------------------------------------------------------
+ build-user-service:
+ needs: changes
+ if: needs.changes.outputs.user == 'true'
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout the submodule user-service
+ uses: actions/checkout@v4
+ with:
+ submodules: true
+
+ - name: Set up JDK 21
+ uses: actions/setup-java@v4
+ with:
+ java-version: '21'
+ distribution: 'temurin'
+ cache: 'maven'
+
+ - name: Run the user-service tests
+ run: |
+ chmod +x ./submodules/user-service/mvnw
+ ./submodules/user-service/mvnw -f ./submodules/user-service/pom.xml clean test
+
+ - name: Login to GitHub Container Registry
+ uses: docker/login-action@v3
+ with:
+ registry: ghcr.io
+ username: ${{ github.actor }}
+ password: ${{ secrets.GITHUB_TOKEN }}
+
+ - name: Build and push user-service Docker image
+ uses: docker/build-push-action@v6
+ with:
+ context: ./submodules/user-service
+ push: true
+ tags: ghcr.io/${{ github.repository }}/user-service:latest
+
+ #-----------------------------------------------------------------------
+ #--- Build and push book-service Docker image
+ #-----------------------------------------------------------------------
+ build-book-service:
+ needs: changes
+ if: needs.changes.outputs.book == 'true'
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout the submodule book-service
+ uses: actions/checkout@v4
+ with:
+ submodules: true
+
+ - name: Set up JDK 21
+ uses: actions/setup-java@v4
+ with:
+ java-version: '21'
+ distribution: 'temurin'
+ cache: 'maven'
+
+ - name: Run the book-service tests
+ run: |
+ chmod +x ./submodules/book-service/mvnw
+ ./submodules/book-service/mvnw -f ./submodules/book-service/pom.xml clean test
+
+ - name: Login to GitHub Container Registry
+ uses: docker/login-action@v3
+ with:
+ registry: ghcr.io
+ username: ${{ github.actor }}
+ password: ${{ secrets.GITHUB_TOKEN }}
+
+ - name: Build and push book-service Docker image
+ uses: docker/build-push-action@v6
+ with:
+ context: ./submodules/book-service
+ push: true
+ tags: ghcr.io/${{ github.repository }}/book-service:latest
+
+ #-----------------------------------------------------------------------
+ #--- Build and push review-service Docker image
+ #-----------------------------------------------------------------------
+ build-review-service:
+ needs: changes
+ if: needs.changes.outputs.review == 'true'
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout the submodule review-service
+ uses: actions/checkout@v4
+ with:
+ submodules: true
+
+ - name: Set up JDK 21
+ uses: actions/setup-java@v4
+ with:
+ java-version: '21'
+ distribution: 'temurin'
+ cache: 'maven'
+
+ - name: Run the review-service tests
+ run: |
+ chmod +x ./submodules/review-service/mvnw
+ ./submodules/review-service/mvnw -f ./submodules/review-service/pom.xml clean test
+
+ - name: Login to GitHub Container Registry
+ uses: docker/login-action@v3
+ with:
+ registry: ghcr.io
+ username: ${{ github.actor }}
+ password: ${{ secrets.GITHUB_TOKEN }}
+
+ - name: Build and push review-service Docker image
+ uses: docker/build-push-action@v6
+ with:
+ context: ./submodules/review-service
+ push: true
+ tags: ghcr.io/${{ github.repository }}/review-service:latest
+
+ #-----------------------------------------------------------------------
+ #--- Build and push registry-service Docker image
+ #-----------------------------------------------------------------------
+ build-registry-service:
+ needs: changes
+ if: needs.changes.outputs.registry_service == 'true'
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout the submodule registry-service
+ uses: actions/checkout@v4
+ with:
+ submodules: true
+
+ - name: Set up JDK 21
+ uses: actions/setup-java@v4
+ with:
+ java-version: '21'
+ distribution: 'temurin'
+ cache: 'maven'
+
+ - name: Run the registry-service tests
+ run: |
+ chmod +x ./submodules/registry-service/mvnw
+ ./submodules/registry-service/mvnw -f ./submodules/registry-service/pom.xml clean test
+
+ - name: Login to GitHub Container Registry
+ uses: docker/login-action@v3
+ with:
+ registry: ghcr.io
+ username: ${{ github.actor }}
+ password: ${{ secrets.GITHUB_TOKEN }}
+
+ - name: Build and push registry-service Docker image
+ uses: docker/build-push-action@v6
+ with:
+ context: ./submodules/registry-service
+ push: true
+ tags: ghcr.io/${{ github.repository }}/registry-service:latest
+
+ #-----------------------------------------------------------------------
+ #--- Build and push api-gateway Docker image
+ #-----------------------------------------------------------------------
+ build-api-gateway:
+ needs: changes
+ if: needs.changes.outputs.api_gateway == 'true'
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout the submodule api-gateway
+ uses: actions/checkout@v4
+ with:
+ submodules: true
+
+ - name: Set up JDK 21
+ uses: actions/setup-java@v4
+ with:
+ java-version: '21'
+ distribution: 'temurin'
+ cache: 'maven'
+
+ - name: Run the api-gateway tests
+ run: |
+ chmod +x ./submodules/api-gateway/mvnw
+ ./submodules/api-gateway/mvnw -f ./submodules/api-gateway/pom.xml clean test
+
+ - name: Login to GitHub Container Registry
+ uses: docker/login-action@v3
+ with:
+ registry: ghcr.io
+ username: ${{ github.actor }}
+ password: ${{ secrets.GITHUB_TOKEN }}
+
+ - name: Build and push api-gateway Docker image
+ uses: docker/build-push-action@v6
+ with:
+ context: ./submodules/api-gateway
+ push: true
+ tags: ghcr.io/${{ github.repository }}/api-gateway:latest
+
+ #-----------------------------------------------------------------------
+ #--- Build and push mflibrary-frontend Docker image
+ #-----------------------------------------------------------------------
+ build-mflibrary-frontend:
+ needs: changes
+ if: needs.changes.outputs.frontend == 'true'
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ submodules: true
+
+ - name: Set up Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: '20'
+
+ - name: Install dependencies
+ run: npm ci
+ working-directory: ./mflibrary-frontend
+
+ - name: Run frontend tests
+ run: npm test -- --watch=false --browsers=ChromeHeadless
+ working-directory: ./mflibrary-frontend
+
+ - name: Login to GitHub Container Registry
+ uses: docker/login-action@v3
+ with:
+ registry: ghcr.io
+ username: ${{ github.actor }}
+ password: ${{ secrets.GITHUB_TOKEN }}
+
+ - name: Build and push mflibrary-frontend Docker image
+ uses: docker/build-push-action@v6
+ with:
+ context: ./mflibrary-frontend
+ push: true
+ tags: ghcr.io/${{ github.repository }}/mflibrary-frontend:latest
diff --git a/.github/workflows/push_pr_to_dev.yml b/.github/workflows/push_pr_to_dev.yml
new file mode 100644
index 0000000..a9dce69
--- /dev/null
+++ b/.github/workflows/push_pr_to_dev.yml
@@ -0,0 +1,200 @@
+# Execute on every push or PR to dev
+name: Push or PR to dev
+on:
+ push:
+ branches:
+ - dev
+ pull_request:
+ branches:
+ - dev
+jobs:
+ #-----------------------------------------------------------------------
+ #--- Detect the changes
+ #-----------------------------------------------------------------------
+ changes:
+ runs-on: ubuntu-latest
+ needs: validate-branch
+ if: success()
+ outputs:
+ user: ${{ steps.filter.outputs.user }}
+ book: ${{ steps.filter.outputs.book }}
+ review: ${{ steps.filter.outputs.review }}
+ api_gateway: ${{ steps.filter.outputs.api_gateway }}
+ registry_service: ${{ steps.filter.outputs.registry_service }}
+ frontend: ${{ steps.filter.outputs.frontend }}
+
+ steps:
+ - name: Checkout the main repository
+ uses: actions/checkout@v4
+ with:
+ submodules: true
+
+ - name: Detect changes
+ id: filter
+ uses: dorny/paths-filter@v3
+ with:
+ filters: |
+ user:
+ - 'services/user-service/**'
+ book:
+ - 'services/book-service/**'
+ review:
+ - 'services/review-service/**'
+ api_gateway:
+ - 'services/api-gateway/**'
+ registry_service:
+ - 'services/registry-service/**'
+ frontend:
+ - 'mflibrary-frontend/**'
+
+ #-----------------------------------------------------------------------
+ #--- Test user-service
+ #-----------------------------------------------------------------------
+ test-user-service:
+ needs: changes
+ if: needs.changes.outputs.user == 'true'
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout the submodule user-service
+ uses: actions/checkout@v4
+ with:
+ submodules: true
+
+ - name: Set up JDK 21
+ uses: actions/setup-java@v4
+ with:
+ java-version: '21'
+ distribution: 'temurin'
+ cache: 'maven'
+
+ - name: Run the user-service tests
+ run: |
+ chmod +x ./submodules/user-service/mvnw
+ ./submodules/user-service/mvnw -f ./submodules/user-service/pom.xml clean test
+
+ #-----------------------------------------------------------------------
+ #--- Test book-service
+ #-----------------------------------------------------------------------
+ test-book-service:
+ needs: changes
+ if: needs.changes.outputs.book == 'true'
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout the submodule book-service
+ uses: actions/checkout@v4
+ with:
+ submodules: true
+
+ - name: Set up JDK 21
+ uses: actions/setup-java@v4
+ with:
+ java-version: '21'
+ distribution: 'temurin'
+ cache: 'maven'
+
+ - name: Run the book-service tests
+ run: |
+ chmod +x ./submodules/book-service/mvnw
+ ./submodules/book-service/mvnw -f ./submodules/book-service/pom.xml clean test
+
+ #-----------------------------------------------------------------------
+ #--- Test review-service
+ #-----------------------------------------------------------------------
+ test-review-service:
+ needs: changes
+ if: needs.changes.outputs.review == 'true'
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout the submodule review-service
+ uses: actions/checkout@v4
+ with:
+ submodules: true
+
+ - name: Set up JDK 21
+ uses: actions/setup-java@v4
+ with:
+ java-version: '21'
+ distribution: 'temurin'
+ cache: 'maven'
+
+ - name: Run the review-service tests
+ run: |
+ chmod +x ./submodules/review-service/mvnw
+ ./submodules/review-service/mvnw -f ./submodules/review-service/pom.xml clean test
+
+ #-----------------------------------------------------------------------
+ #--- Test registry-service
+ #-----------------------------------------------------------------------
+ test-registry-service:
+ needs: changes
+ if: needs.changes.outputs.registry_service == 'true'
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout the submodule registry-service
+ uses: actions/checkout@v4
+ with:
+ submodules: true
+
+ - name: Set up JDK 21
+ uses: actions/setup-java@v4
+ with:
+ java-version: '21'
+ distribution: 'temurin'
+ cache: 'maven'
+
+ - name: Run the registry-service tests
+ run: |
+ chmod +x ./submodules/registry-service/mvnw
+ ./submodules/registry-service/mvnw -f ./submodules/registry-service/pom.xml clean test
+
+ #-----------------------------------------------------------------------
+ #--- Test api-gateway
+ #-----------------------------------------------------------------------
+ test-api-gateway:
+ needs: changes
+ if: needs.changes.outputs.api_gateway == 'true'
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout the submodule api-gateway
+ uses: actions/checkout@v4
+ with:
+ submodules: true
+
+ - name: Set up JDK 21
+ uses: actions/setup-java@v4
+ with:
+ java-version: '21'
+ distribution: 'temurin'
+ cache: 'maven'
+
+ - name: Run the api-gateway tests
+ run: |
+ chmod +x ./submodules/api-gateway/mvnw
+ ./submodules/api-gateway/mvnw -f ./submodules/api-gateway/pom.xml clean test
+
+ #-----------------------------------------------------------------------
+ #--- Test mflibrary-frontend
+ #-----------------------------------------------------------------------
+ test-mflibrary-frontend:
+ needs: changes
+ if: needs.changes.outputs.frontend == 'true'
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ submodules: true
+
+ - name: Set up Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: '20'
+
+ - name: Install dependencies
+ run: npm ci
+ working-directory: ./mflibrary-frontend
+
+ - name: Run frontend tests
+ run: npm test -- --watch=false --browsers=ChromeHeadless
+ working-directory: ./mflibrary-frontend
diff --git a/.infra/keycloak/app-mflibrary-realm-export.json b/.infra/keycloak/app-mflibrary-realm-export.json
new file mode 100644
index 0000000..a92ba67
--- /dev/null
+++ b/.infra/keycloak/app-mflibrary-realm-export.json
@@ -0,0 +1,2475 @@
+{
+ "id": "218ea758-771b-4791-a613-924cce82360c",
+ "realm": "app-mflibrary",
+ "displayName": "",
+ "displayNameHtml": "",
+ "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": "734e0a38-3b92-4962-a044-3c8126d64718",
+ "name": "ADMIN",
+ "description": "",
+ "composite": false,
+ "clientRole": false,
+ "containerId": "218ea758-771b-4791-a613-924cce82360c",
+ "attributes": {}
+ },
+ {
+ "id": "10fb5b97-80c8-4694-b6fc-bebd4d934acb",
+ "name": "default-roles-app-mflibrary",
+ "description": "${role_default-roles}",
+ "composite": true,
+ "composites": {
+ "realm": [
+ "offline_access",
+ "uma_authorization"
+ ],
+ "client": {
+ "account": [
+ "view-profile",
+ "manage-account"
+ ]
+ }
+ },
+ "clientRole": false,
+ "containerId": "218ea758-771b-4791-a613-924cce82360c",
+ "attributes": {}
+ },
+ {
+ "id": "d3147ccc-a3fc-4c57-9e99-9d60c786fa6d",
+ "name": "MODERATOR",
+ "description": "",
+ "composite": false,
+ "clientRole": false,
+ "containerId": "218ea758-771b-4791-a613-924cce82360c",
+ "attributes": {}
+ },
+ {
+ "id": "55c361f9-09f5-45f1-a098-8072c8e2b4c4",
+ "name": "USER",
+ "description": "",
+ "composite": false,
+ "clientRole": false,
+ "containerId": "218ea758-771b-4791-a613-924cce82360c",
+ "attributes": {}
+ },
+ {
+ "id": "6b9e66d2-c317-4c66-8b01-2d0d1c9f63a4",
+ "name": "offline_access",
+ "description": "${role_offline-access}",
+ "composite": false,
+ "clientRole": false,
+ "containerId": "218ea758-771b-4791-a613-924cce82360c",
+ "attributes": {}
+ },
+ {
+ "id": "99bf2c8d-57e4-47a5-b2e5-f734ad2ab77d",
+ "name": "uma_authorization",
+ "description": "${role_uma_authorization}",
+ "composite": false,
+ "clientRole": false,
+ "containerId": "218ea758-771b-4791-a613-924cce82360c",
+ "attributes": {}
+ }
+ ],
+ "client": {
+ "realm-management": [
+ {
+ "id": "edae7a74-4d5d-4590-986c-642ca44f66a4",
+ "name": "manage-authorization",
+ "description": "${role_manage-authorization}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "b8de4b96-6b86-40ae-8a89-44667673edf9",
+ "attributes": {}
+ },
+ {
+ "id": "6dd187bf-292b-473d-89fd-ce73f45b0ed9",
+ "name": "view-users",
+ "description": "${role_view-users}",
+ "composite": true,
+ "composites": {
+ "client": {
+ "realm-management": [
+ "query-groups",
+ "query-users"
+ ]
+ }
+ },
+ "clientRole": true,
+ "containerId": "b8de4b96-6b86-40ae-8a89-44667673edf9",
+ "attributes": {}
+ },
+ {
+ "id": "6442f543-2a82-4519-8cc1-b5b300e81cf6",
+ "name": "manage-clients",
+ "description": "${role_manage-clients}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "b8de4b96-6b86-40ae-8a89-44667673edf9",
+ "attributes": {}
+ },
+ {
+ "id": "1f6eefeb-a5e9-46e5-bef2-3b491fabd6c7",
+ "name": "impersonation",
+ "description": "${role_impersonation}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "b8de4b96-6b86-40ae-8a89-44667673edf9",
+ "attributes": {}
+ },
+ {
+ "id": "7986f323-b3f8-4fea-93d9-159edcb2208b",
+ "name": "view-authorization",
+ "description": "${role_view-authorization}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "b8de4b96-6b86-40ae-8a89-44667673edf9",
+ "attributes": {}
+ },
+ {
+ "id": "01c589e4-a0de-4841-a237-e075b1fc6642",
+ "name": "query-clients",
+ "description": "${role_query-clients}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "b8de4b96-6b86-40ae-8a89-44667673edf9",
+ "attributes": {}
+ },
+ {
+ "id": "2895c88c-555c-4d2c-b49f-302f20cd808f",
+ "name": "manage-users",
+ "description": "${role_manage-users}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "b8de4b96-6b86-40ae-8a89-44667673edf9",
+ "attributes": {}
+ },
+ {
+ "id": "2d20bf9e-14f9-4b8a-8bdf-e0614b33c448",
+ "name": "query-users",
+ "description": "${role_query-users}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "b8de4b96-6b86-40ae-8a89-44667673edf9",
+ "attributes": {}
+ },
+ {
+ "id": "37a1fbe3-20f5-427e-bbc5-d8672bf1269d",
+ "name": "manage-events",
+ "description": "${role_manage-events}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "b8de4b96-6b86-40ae-8a89-44667673edf9",
+ "attributes": {}
+ },
+ {
+ "id": "68a4d061-cafa-49de-964b-06c5a06ec186",
+ "name": "query-realms",
+ "description": "${role_query-realms}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "b8de4b96-6b86-40ae-8a89-44667673edf9",
+ "attributes": {}
+ },
+ {
+ "id": "572500d9-ae52-4f6c-a5d4-bfa8c1311149",
+ "name": "view-clients",
+ "description": "${role_view-clients}",
+ "composite": true,
+ "composites": {
+ "client": {
+ "realm-management": [
+ "query-clients"
+ ]
+ }
+ },
+ "clientRole": true,
+ "containerId": "b8de4b96-6b86-40ae-8a89-44667673edf9",
+ "attributes": {}
+ },
+ {
+ "id": "b1f8e6ba-9655-40aa-b593-9168aaab9e8b",
+ "name": "view-realm",
+ "description": "${role_view-realm}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "b8de4b96-6b86-40ae-8a89-44667673edf9",
+ "attributes": {}
+ },
+ {
+ "id": "20b5d9a0-862d-4a53-8466-ff88c953a96f",
+ "name": "realm-admin",
+ "description": "${role_realm-admin}",
+ "composite": true,
+ "composites": {
+ "client": {
+ "realm-management": [
+ "manage-authorization",
+ "view-users",
+ "manage-clients",
+ "impersonation",
+ "view-authorization",
+ "query-clients",
+ "manage-users",
+ "query-users",
+ "manage-events",
+ "view-clients",
+ "query-realms",
+ "view-realm",
+ "manage-realm",
+ "manage-identity-providers",
+ "query-groups",
+ "view-identity-providers",
+ "view-events",
+ "create-client"
+ ]
+ }
+ },
+ "clientRole": true,
+ "containerId": "b8de4b96-6b86-40ae-8a89-44667673edf9",
+ "attributes": {}
+ },
+ {
+ "id": "1a692075-0e19-4e1d-902f-928d557b8fc1",
+ "name": "manage-realm",
+ "description": "${role_manage-realm}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "b8de4b96-6b86-40ae-8a89-44667673edf9",
+ "attributes": {}
+ },
+ {
+ "id": "ef46b8f6-1fb9-4c22-b54f-f7c2a096da1b",
+ "name": "manage-identity-providers",
+ "description": "${role_manage-identity-providers}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "b8de4b96-6b86-40ae-8a89-44667673edf9",
+ "attributes": {}
+ },
+ {
+ "id": "eb0861df-feaa-415e-8ddb-0f8a821045d0",
+ "name": "query-groups",
+ "description": "${role_query-groups}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "b8de4b96-6b86-40ae-8a89-44667673edf9",
+ "attributes": {}
+ },
+ {
+ "id": "c0e4cbb6-1dda-4d9b-b0de-92eec8448769",
+ "name": "view-events",
+ "description": "${role_view-events}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "b8de4b96-6b86-40ae-8a89-44667673edf9",
+ "attributes": {}
+ },
+ {
+ "id": "7526716f-f604-45b7-ac2c-7ba2d3290165",
+ "name": "view-identity-providers",
+ "description": "${role_view-identity-providers}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "b8de4b96-6b86-40ae-8a89-44667673edf9",
+ "attributes": {}
+ },
+ {
+ "id": "fcc3154d-9d71-4104-8d10-f1306e3d52f9",
+ "name": "create-client",
+ "description": "${role_create-client}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "b8de4b96-6b86-40ae-8a89-44667673edf9",
+ "attributes": {}
+ }
+ ],
+ "mflibrary-swagger": [],
+ "mflibrary-review-service": [],
+ "security-admin-console": [],
+ "mflibrary-book-service": [],
+ "admin-cli": [],
+ "mflibrary-user-service": [],
+ "account-console": [],
+ "broker": [
+ {
+ "id": "e0264b02-e923-495a-a65e-e1eeb825b465",
+ "name": "read-token",
+ "description": "${role_read-token}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "56846b2a-e6f3-4f76-b369-191a294952f0",
+ "attributes": {}
+ }
+ ],
+ "account": [
+ {
+ "id": "93583c38-6520-481e-a755-5a7c6dee207a",
+ "name": "view-consent",
+ "description": "${role_view-consent}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "93677196-8f1f-4884-8468-087550361a65",
+ "attributes": {}
+ },
+ {
+ "id": "c6943228-8337-45a8-a94c-ec0698b9ff11",
+ "name": "view-profile",
+ "description": "${role_view-profile}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "93677196-8f1f-4884-8468-087550361a65",
+ "attributes": {}
+ },
+ {
+ "id": "98cfe8e8-155f-4a88-a176-187736f2da70",
+ "name": "view-groups",
+ "description": "${role_view-groups}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "93677196-8f1f-4884-8468-087550361a65",
+ "attributes": {}
+ },
+ {
+ "id": "0732f234-c02f-4881-b4f3-544034567652",
+ "name": "view-applications",
+ "description": "${role_view-applications}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "93677196-8f1f-4884-8468-087550361a65",
+ "attributes": {}
+ },
+ {
+ "id": "65b47b64-2747-441d-a009-ff3084eb13f3",
+ "name": "manage-account-links",
+ "description": "${role_manage-account-links}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "93677196-8f1f-4884-8468-087550361a65",
+ "attributes": {}
+ },
+ {
+ "id": "94a9547f-202c-4720-8921-1650ab5729f7",
+ "name": "manage-account",
+ "description": "${role_manage-account}",
+ "composite": true,
+ "composites": {
+ "client": {
+ "account": [
+ "manage-account-links"
+ ]
+ }
+ },
+ "clientRole": true,
+ "containerId": "93677196-8f1f-4884-8468-087550361a65",
+ "attributes": {}
+ },
+ {
+ "id": "e3bf99e7-060b-42f1-857e-2f214f4ff3fb",
+ "name": "delete-account",
+ "description": "${role_delete-account}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "93677196-8f1f-4884-8468-087550361a65",
+ "attributes": {}
+ },
+ {
+ "id": "c06f8f53-78c1-4026-a3b3-4e037e537ce3",
+ "name": "manage-consent",
+ "description": "${role_manage-consent}",
+ "composite": true,
+ "composites": {
+ "client": {
+ "account": [
+ "view-consent"
+ ]
+ }
+ },
+ "clientRole": true,
+ "containerId": "93677196-8f1f-4884-8468-087550361a65",
+ "attributes": {}
+ }
+ ]
+ }
+ },
+ "groups": [],
+ "defaultRole": {
+ "id": "10fb5b97-80c8-4694-b6fc-bebd4d934acb",
+ "name": "default-roles-app-mflibrary",
+ "description": "${role_default-roles}",
+ "composite": true,
+ "clientRole": false,
+ "containerId": "218ea758-771b-4791-a613-924cce82360c"
+ },
+ "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": "88b95c38-999f-4ddd-926b-3169c95350d5",
+ "createdTimestamp": 1753801287944,
+ "username": "etoundi",
+ "enabled": true,
+ "totp": false,
+ "emailVerified": true,
+ "firstName": "etoundi",
+ "lastName": "etoundi",
+ "email": "etoundi@gmail.com",
+ "credentials": [
+ {
+ "id": "51c48c32-6726-4300-895d-f8cf9c59aafe",
+ "type": "password",
+ "userLabel": "password = etoundi",
+ "createdDate": 1753801303459,
+ "secretData": "{\"value\":\"q4WjW1FyFpNQgsPN1ubPcROswbE/yrR5GeX7aBnEBaM=\",\"salt\":\"DcUNcafHnSedXbdx+ir/Xw==\",\"additionalParameters\":{}}",
+ "credentialData": "{\"hashIterations\":27500,\"algorithm\":\"pbkdf2-sha256\",\"additionalParameters\":{}}"
+ }
+ ],
+ "disableableCredentialTypes": [],
+ "requiredActions": [],
+ "realmRoles": [
+ "default-roles-app-mflibrary",
+ "ADMIN",
+ "MODERATOR"
+ ],
+ "notBefore": 0,
+ "groups": []
+ },
+ {
+ "id": "c2b46ff4-a3bc-4d0e-af75-be82dabaf2c4",
+ "createdTimestamp": 1753801007923,
+ "username": "eugene",
+ "enabled": true,
+ "totp": false,
+ "emailVerified": true,
+ "firstName": "eugene",
+ "lastName": "ETOUNDI II",
+ "email": "eugene@gmail.com",
+ "credentials": [
+ {
+ "id": "2eab4ff2-6781-4976-8090-aab8f550a9cc",
+ "type": "password",
+ "userLabel": "password = eugene",
+ "createdDate": 1753801025909,
+ "secretData": "{\"value\":\"EaYzsjoSFa7b7t/o934DQ5y6cRMTlcBzQfNipD8NUVc=\",\"salt\":\"fTqvDEgOj3CSaUzEe2pFEQ==\",\"additionalParameters\":{}}",
+ "credentialData": "{\"hashIterations\":27500,\"algorithm\":\"pbkdf2-sha256\",\"additionalParameters\":{}}"
+ }
+ ],
+ "disableableCredentialTypes": [],
+ "requiredActions": [],
+ "realmRoles": [
+ "default-roles-app-mflibrary",
+ "USER"
+ ],
+ "notBefore": 0,
+ "groups": []
+ }
+ ],
+ "scopeMappings": [
+ {
+ "clientScope": "offline_access",
+ "roles": [
+ "offline_access"
+ ]
+ }
+ ],
+ "clientScopeMappings": {
+ "account": [
+ {
+ "client": "account-console",
+ "roles": [
+ "manage-account",
+ "view-groups"
+ ]
+ }
+ ]
+ },
+ "clients": [
+ {
+ "id": "93677196-8f1f-4884-8468-087550361a65",
+ "clientId": "account",
+ "name": "${client_account}",
+ "rootUrl": "${authBaseUrl}",
+ "baseUrl": "/realms/app-mflibrary/account/",
+ "surrogateAuthRequired": false,
+ "enabled": true,
+ "alwaysDisplayInConsole": false,
+ "clientAuthenticatorType": "client-secret",
+ "redirectUris": [
+ "/realms/app-mflibrary/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",
+ "profile",
+ "roles",
+ "email"
+ ],
+ "optionalClientScopes": [
+ "address",
+ "phone",
+ "offline_access",
+ "microprofile-jwt"
+ ]
+ },
+ {
+ "id": "24170deb-bd4c-452a-8459-55ef419b2af6",
+ "clientId": "account-console",
+ "name": "${client_account-console}",
+ "rootUrl": "${authBaseUrl}",
+ "baseUrl": "/realms/app-mflibrary/account/",
+ "surrogateAuthRequired": false,
+ "enabled": true,
+ "alwaysDisplayInConsole": false,
+ "clientAuthenticatorType": "client-secret",
+ "redirectUris": [
+ "/realms/app-mflibrary/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": "aeb7cee4-df69-4f4e-b5c7-56af9d41ca8c",
+ "name": "audience resolve",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-audience-resolve-mapper",
+ "consentRequired": false,
+ "config": {}
+ }
+ ],
+ "defaultClientScopes": [
+ "web-origins",
+ "acr",
+ "profile",
+ "roles",
+ "email"
+ ],
+ "optionalClientScopes": [
+ "address",
+ "phone",
+ "offline_access",
+ "microprofile-jwt"
+ ]
+ },
+ {
+ "id": "f0f96cf0-dd3a-4c4a-9675-55fd751be311",
+ "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",
+ "acr",
+ "profile",
+ "roles",
+ "email"
+ ],
+ "optionalClientScopes": [
+ "address",
+ "phone",
+ "offline_access",
+ "microprofile-jwt"
+ ]
+ },
+ {
+ "id": "56846b2a-e6f3-4f76-b369-191a294952f0",
+ "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",
+ "acr",
+ "profile",
+ "roles",
+ "email"
+ ],
+ "optionalClientScopes": [
+ "address",
+ "phone",
+ "offline_access",
+ "microprofile-jwt"
+ ]
+ },
+ {
+ "id": "52db16e3-8fd1-42cc-b233-e92fd49ccd6c",
+ "clientId": "mflibrary-book-service",
+ "name": "",
+ "description": "",
+ "rootUrl": "",
+ "adminUrl": "",
+ "baseUrl": "",
+ "surrogateAuthRequired": false,
+ "enabled": true,
+ "alwaysDisplayInConsole": false,
+ "clientAuthenticatorType": "client-secret",
+ "redirectUris": [
+ "http://localhost:8082/*"
+ ],
+ "webOrigins": [
+ "/*"
+ ],
+ "notBefore": 0,
+ "bearerOnly": false,
+ "consentRequired": false,
+ "standardFlowEnabled": true,
+ "implicitFlowEnabled": false,
+ "directAccessGrantsEnabled": true,
+ "serviceAccountsEnabled": false,
+ "publicClient": true,
+ "frontchannelLogout": true,
+ "protocol": "openid-connect",
+ "attributes": {
+ "oidc.ciba.grant.enabled": "false",
+ "oauth2.device.authorization.grant.enabled": "false",
+ "display.on.consent.screen": "false",
+ "backchannel.logout.session.required": "true",
+ "backchannel.logout.revoke.offline.tokens": "false"
+ },
+ "authenticationFlowBindingOverrides": {},
+ "fullScopeAllowed": true,
+ "nodeReRegistrationTimeout": -1,
+ "defaultClientScopes": [
+ "web-origins",
+ "acr",
+ "profile",
+ "roles",
+ "email"
+ ],
+ "optionalClientScopes": [
+ "address",
+ "phone",
+ "offline_access",
+ "microprofile-jwt"
+ ]
+ },
+ {
+ "id": "73a0f789-f560-45ad-b0d1-f7892960eda4",
+ "clientId": "mflibrary-review-service",
+ "name": "",
+ "description": "",
+ "rootUrl": "",
+ "adminUrl": "",
+ "baseUrl": "",
+ "surrogateAuthRequired": false,
+ "enabled": true,
+ "alwaysDisplayInConsole": false,
+ "clientAuthenticatorType": "client-secret",
+ "redirectUris": [
+ "http://localhost:8083/*"
+ ],
+ "webOrigins": [
+ "/*"
+ ],
+ "notBefore": 0,
+ "bearerOnly": false,
+ "consentRequired": false,
+ "standardFlowEnabled": true,
+ "implicitFlowEnabled": false,
+ "directAccessGrantsEnabled": true,
+ "serviceAccountsEnabled": false,
+ "publicClient": true,
+ "frontchannelLogout": true,
+ "protocol": "openid-connect",
+ "attributes": {
+ "oidc.ciba.grant.enabled": "false",
+ "oauth2.device.authorization.grant.enabled": "false",
+ "display.on.consent.screen": "false",
+ "backchannel.logout.session.required": "true",
+ "backchannel.logout.revoke.offline.tokens": "false"
+ },
+ "authenticationFlowBindingOverrides": {},
+ "fullScopeAllowed": true,
+ "nodeReRegistrationTimeout": -1,
+ "defaultClientScopes": [
+ "web-origins",
+ "acr",
+ "profile",
+ "roles",
+ "email"
+ ],
+ "optionalClientScopes": [
+ "address",
+ "phone",
+ "offline_access",
+ "microprofile-jwt"
+ ]
+ },
+ {
+ "id": "663f302c-03fd-4fba-900f-0656b9c93640",
+ "clientId": "mflibrary-swagger",
+ "name": "",
+ "description": "",
+ "rootUrl": "",
+ "adminUrl": "",
+ "baseUrl": "",
+ "surrogateAuthRequired": false,
+ "enabled": true,
+ "alwaysDisplayInConsole": false,
+ "clientAuthenticatorType": "client-secret",
+ "secret": "bDoklJAiYHTzt706a8wHV4E0CgdTCC6Y",
+ "redirectUris": [
+ "http://localhost:8083/swagger-ui/oauth2-redirect.html",
+ "http://localhost:8082/swagger-ui/oauth2-redirect.html",
+ "http://localhost:8081/swagger-ui/oauth2-redirect.html"
+ ],
+ "webOrigins": [
+ "*"
+ ],
+ "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": "1754661498",
+ "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",
+ "pkce.code.challenge.method": "S256",
+ "token.response.type.bearer.lower-case": "false"
+ },
+ "authenticationFlowBindingOverrides": {},
+ "fullScopeAllowed": true,
+ "nodeReRegistrationTimeout": -1,
+ "defaultClientScopes": [
+ "web-origins",
+ "acr",
+ "profile",
+ "roles",
+ "email"
+ ],
+ "optionalClientScopes": [
+ "address",
+ "phone",
+ "offline_access",
+ "microprofile-jwt"
+ ]
+ },
+ {
+ "id": "83ba144c-23e5-4c6f-bd30-49843f1fdf8b",
+ "clientId": "mflibrary-user-service",
+ "name": "",
+ "description": "",
+ "rootUrl": "",
+ "adminUrl": "",
+ "baseUrl": "",
+ "surrogateAuthRequired": false,
+ "enabled": true,
+ "alwaysDisplayInConsole": false,
+ "clientAuthenticatorType": "client-secret",
+ "redirectUris": [
+ "http://localhost:8081/*"
+ ],
+ "webOrigins": [
+ "/*"
+ ],
+ "notBefore": 0,
+ "bearerOnly": false,
+ "consentRequired": false,
+ "standardFlowEnabled": true,
+ "implicitFlowEnabled": false,
+ "directAccessGrantsEnabled": true,
+ "serviceAccountsEnabled": false,
+ "publicClient": true,
+ "frontchannelLogout": true,
+ "protocol": "openid-connect",
+ "attributes": {
+ "oidc.ciba.grant.enabled": "false",
+ "oauth2.device.authorization.grant.enabled": "false",
+ "display.on.consent.screen": "false",
+ "backchannel.logout.session.required": "true",
+ "backchannel.logout.revoke.offline.tokens": "false"
+ },
+ "authenticationFlowBindingOverrides": {},
+ "fullScopeAllowed": true,
+ "nodeReRegistrationTimeout": -1,
+ "defaultClientScopes": [
+ "web-origins",
+ "acr",
+ "profile",
+ "roles",
+ "email"
+ ],
+ "optionalClientScopes": [
+ "address",
+ "phone",
+ "offline_access",
+ "microprofile-jwt"
+ ]
+ },
+ {
+ "id": "b8de4b96-6b86-40ae-8a89-44667673edf9",
+ "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": [
+ "web-origins",
+ "acr",
+ "profile",
+ "roles",
+ "email"
+ ],
+ "optionalClientScopes": [
+ "address",
+ "phone",
+ "offline_access",
+ "microprofile-jwt"
+ ]
+ },
+ {
+ "id": "6b60ba1c-c06d-444f-b6d5-9da89da51fd8",
+ "clientId": "security-admin-console",
+ "name": "${client_security-admin-console}",
+ "rootUrl": "${authAdminUrl}",
+ "baseUrl": "/admin/app-mflibrary/console/",
+ "surrogateAuthRequired": false,
+ "enabled": true,
+ "alwaysDisplayInConsole": false,
+ "clientAuthenticatorType": "client-secret",
+ "redirectUris": [
+ "/admin/app-mflibrary/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": "43821366-a617-420e-adea-d7a8fcf85838",
+ "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",
+ "profile",
+ "roles",
+ "email"
+ ],
+ "optionalClientScopes": [
+ "address",
+ "phone",
+ "offline_access",
+ "microprofile-jwt"
+ ]
+ }
+ ],
+ "clientScopes": [
+ {
+ "id": "093f260f-f05d-4afa-8193-cd427f81178b",
+ "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": "6f882681-bb84-4784-bfde-b35ecc352b88",
+ "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": "25347a8a-9a53-4304-94aa-89a69b84ab84",
+ "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": "51e3cc99-873f-431b-8b13-bb80a0cc7580",
+ "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": "18af49f6-6333-4f18-8bf3-54fbf3cf1b09",
+ "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": "2f64ae98-c1a7-4c2c-8489-966bf602da5d",
+ "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": "86f73b0c-d1d2-4d51-9083-0031c9403bdd",
+ "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": "fd43b82e-0f9f-4a45-ba69-baa531526709",
+ "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": "9a4417f6-dafb-4cf3-b208-a479f42ad14c",
+ "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": "d619387b-f03d-4fed-8017-5b1f6b85ea9b",
+ "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": "45bd635f-8277-47c5-8804-8527145c1034",
+ "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": "f07693ab-2eca-4fcf-b8bd-7edd071848fb",
+ "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": "ff77f10f-d141-4c57-be71-c524070cd2ce",
+ "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": "6bfa89dc-3538-4875-abf1-d2c68f55083d",
+ "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": "b3088e52-cc90-4141-b5c1-e72f7b6eb124",
+ "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": "f8cf7b1e-72fc-45cf-9b43-369655cb0198",
+ "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": "efcb769d-50e2-4031-a21b-67cb1108f7c2",
+ "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": "9cbdad28-43e0-4d31-a036-d1ccb061c732",
+ "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": "51264fc0-69c1-40f4-a73d-b939a8d8aef0",
+ "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": "663ffac2-a565-403b-82f9-e7c7ce48af76",
+ "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": "0e2305bf-5470-4f08-b478-36eec667b227",
+ "name": "audience resolve",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-audience-resolve-mapper",
+ "consentRequired": false,
+ "config": {
+ "introspection.token.claim": "true",
+ "access.token.claim": "true"
+ }
+ },
+ {
+ "id": "d709fb86-a0d0-48d0-8c03-6e04ec20cf99",
+ "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": "0b92013c-926e-457f-868c-d6546851ea4e",
+ "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": "6e1766c6-30fd-4418-b73e-2aba078228d8",
+ "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": "0963c4cf-29e0-4129-96b1-201adcc923df",
+ "name": "allowed web origins",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-allowed-origins-mapper",
+ "consentRequired": false,
+ "config": {
+ "introspection.token.claim": "true",
+ "access.token.claim": "true"
+ }
+ }
+ ]
+ },
+ {
+ "id": "6e396805-3ed6-4a9b-bfc5-f678b1da5510",
+ "name": "role_list",
+ "description": "SAML role list",
+ "protocol": "saml",
+ "attributes": {
+ "consent.screen.text": "${samlRoleListScopeConsentText}",
+ "display.on.consent.screen": "true"
+ },
+ "protocolMappers": [
+ {
+ "id": "8401f109-4768-44c6-8a21-a2bc53966291",
+ "name": "role list",
+ "protocol": "saml",
+ "protocolMapper": "saml-role-list-mapper",
+ "consentRequired": false,
+ "config": {
+ "single": "false",
+ "attribute.nameformat": "Basic",
+ "attribute.name": "Role"
+ }
+ }
+ ]
+ },
+ {
+ "id": "06d31f0e-f41b-430a-a236-e9df40717114",
+ "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": "ddbaa057-f431-4ef2-811e-8afce5f52ce8",
+ "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"
+ }
+ }
+ ]
+ },
+ {
+ "id": "0e1d15e3-be10-40c5-b9b8-0ae3ccb05854",
+ "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": "4d7c6421-c89a-4f03-bc36-843a942d3792",
+ "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": "7c6c588c-99b3-4d8e-a221-5498ead73363",
+ "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": "091203bc-11a1-49c2-86d6-3f3cb92a073a",
+ "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": "b3bcf340-088e-4af0-8abd-9497bc0776ee",
+ "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": "adc6f6d5-0338-4c17-887e-a464586b1e32",
+ "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": "3b65be95-231d-4f2a-a82f-e581693e653b",
+ "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": "45f6c4a9-6fa6-43fa-835e-fd4f0ebbe771",
+ "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"
+ }
+ }
+ ]
+ }
+ ],
+ "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": "e1962956-8cca-451f-af44-7fd23e6157d2",
+ "name": "Full Scope Disabled",
+ "providerId": "scope",
+ "subType": "anonymous",
+ "subComponents": {},
+ "config": {}
+ },
+ {
+ "id": "eb403e54-cd63-4250-b1f4-1b157d47a07c",
+ "name": "Allowed Protocol Mapper Types",
+ "providerId": "allowed-protocol-mappers",
+ "subType": "authenticated",
+ "subComponents": {},
+ "config": {
+ "allowed-protocol-mapper-types": [
+ "oidc-sha256-pairwise-sub-mapper",
+ "oidc-address-mapper",
+ "oidc-usermodel-attribute-mapper",
+ "oidc-full-name-mapper",
+ "oidc-usermodel-property-mapper",
+ "saml-role-list-mapper",
+ "saml-user-property-mapper",
+ "saml-user-attribute-mapper"
+ ]
+ }
+ },
+ {
+ "id": "467b084c-0062-4c9a-a562-2cc8d7e5e6b1",
+ "name": "Trusted Hosts",
+ "providerId": "trusted-hosts",
+ "subType": "anonymous",
+ "subComponents": {},
+ "config": {
+ "host-sending-registration-request-must-match": [
+ "true"
+ ],
+ "client-uris-must-match": [
+ "true"
+ ]
+ }
+ },
+ {
+ "id": "4ac168d6-063e-46e9-a5b0-e5a34ec95aa8",
+ "name": "Allowed Client Scopes",
+ "providerId": "allowed-client-templates",
+ "subType": "authenticated",
+ "subComponents": {},
+ "config": {
+ "allow-default-scopes": [
+ "true"
+ ]
+ }
+ },
+ {
+ "id": "44861a38-766c-4de0-a64e-df70ad8cd26b",
+ "name": "Max Clients Limit",
+ "providerId": "max-clients",
+ "subType": "anonymous",
+ "subComponents": {},
+ "config": {
+ "max-clients": [
+ "200"
+ ]
+ }
+ },
+ {
+ "id": "88739104-3a6b-4fea-91dc-95152b6b290a",
+ "name": "Allowed Client Scopes",
+ "providerId": "allowed-client-templates",
+ "subType": "anonymous",
+ "subComponents": {},
+ "config": {
+ "allow-default-scopes": [
+ "true"
+ ]
+ }
+ },
+ {
+ "id": "acfa0434-79c2-41c3-8bb3-4feccfb7c21c",
+ "name": "Consent Required",
+ "providerId": "consent-required",
+ "subType": "anonymous",
+ "subComponents": {},
+ "config": {}
+ },
+ {
+ "id": "e380f078-1394-4e2a-8764-f8b451fd66bc",
+ "name": "Allowed Protocol Mapper Types",
+ "providerId": "allowed-protocol-mappers",
+ "subType": "anonymous",
+ "subComponents": {},
+ "config": {
+ "allowed-protocol-mapper-types": [
+ "saml-user-property-mapper",
+ "saml-user-attribute-mapper",
+ "oidc-usermodel-attribute-mapper",
+ "oidc-full-name-mapper",
+ "oidc-sha256-pairwise-sub-mapper",
+ "oidc-address-mapper",
+ "saml-role-list-mapper",
+ "oidc-usermodel-property-mapper"
+ ]
+ }
+ }
+ ],
+ "org.keycloak.keys.KeyProvider": [
+ {
+ "id": "328209da-4782-41e5-8e50-d49174547435",
+ "name": "rsa-enc-generated",
+ "providerId": "rsa-enc-generated",
+ "subComponents": {},
+ "config": {
+ "privateKey": [
+ "MIIEogIBAAKCAQEAzWvWwCd1ob4ktNCZyn0BwdXanxN5OcIoAb07RJk4t/vIJcDAm0zaWZE5he24y9RjbbThWgMb1eZqkPzozIeBurojSK7+q5QAv+ljpOUTTDC0oyG0jOiy77b22pD0ir04KU6wdcrLJk/GGOKhyRxYcvxz/tG7UHYCIjV3M0ETCCORa5Dl889Gtt5xdbY8h6c3LD1zXOHwaqOBb9bsCA3J9Kl2/moh+hi5s0+fRVESyQneReN19ccpCBLgBA9MTwELcRnGg3GKtVcCvFXdJMMctsWuateP2Is+XTR+R1J36cNxQCzZ/0l15u0pt3+OU7fOlN8fdjDFhyvvPJpnEObDGwIDAQABAoIBAAZuhKB8ZIbjUpr8V8UWfeXpMC3Xhe3WE3VqHjlw8Q/SAxirJY4i4bztLxGpp+u0aRelBw4s7qbF5hIv+y0Y8fV8JsQHU1w+MBy63306caQCA0xrurJTqTkjvixyL+O+h8B95ALJ9tQZNfXx9eJebSa3D0OaufGLk/sRw5KK70jXNvuS6kM34alasx2VatqX1aDqZo1ILKniyR02G1nLpfSS+ketQPVNSsBmTRBFWAha6KPSshNS3mt9FMhEqAIzzN2gTcEgoK6SeOGxEfsw+Nx0GHcN7jO/wpfSrRxSAztDezcaarHzKfxlPMiqM6lAYlrMPC6Klm0RD6iPYAldSdECgYEA6DgGnXmG6NPFZ1tFK7hrZq4uyTNGqnzIErmsVZhPLYgv6QuILOCJ6JAY4ofx9WtTf0PtXTZjApAYVAc8beJgU7FMan1cSnStE+X9nigYX3x5cj85RCaztVcImMOEDfeS9PqCB40FkZIrI1xYeoAYAMx+F+hFsW5WBcYb5mVr8KsCgYEA4nVFycBLVKGVI4qeYMXqZI5RVG4lDzKd+i5piD4/1fjpL8x7IidS6iC6pXDFCIvRdK/T9ZjgPmxWFhHATr3+nPmSpwvtaJfIe2XNDkI0CpZwEuEMUXZWKDZHIucGg9PUUcf3pGGqyVd4FStSFwrNQnX4WQtV6oKjebzAhDfg11ECgYBt2aL3d3ekSBmHzRsplXHo/tjPANya5bBXe1HUo9pAtb3ERlpCsG1MgG3lK14ANKco+t8cSxAHNFbt2QZzDLV4odR+Q5MW/Z6qXQ/ecyUkdmOU8eeLH6u/Ss6cRVEAsm7oSGCeZc2OkVCqx5JrUJEKP7IeaRge2Q0EajTkhnHLRQKBgHGUbApCfgXWfRy0W7chzOveTYBRNhknRADE4n1I62+ARkSJBIEexAFVpQdxRgGBTu59eYvGv0HPyGWNRay4skk9C4bo/ovlBNKPPoeWQM/GoDN32FvLRG8qugcRZD0eM3FJIDW8HpKZYksLzUJtUoGw9XyDqPXTy/Y060HlXMnhAoGAPkLM7OyvdFcQAfSpTds2E0WQAblO1WEKp5n2NvEH+RW+TwoFy8udbxotWeNDtc0dOPY/6wjxBLxZbZvAzles5isz++XD9lSz2uS68kQXqvwfDLgiZV/qlS9/PuSDGUSoIVNLIggFBwutHbgVoDCfVSFDwJbv6eY6O/UNIZEUwhk="
+ ],
+ "keyUse": [
+ "ENC"
+ ],
+ "certificate": [
+ "MIICqTCCAZECBgGYVmh/3zANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1hcHAtbWZsaWJyYXJ5MB4XDTI1MDcyOTEzMzcyNVoXDTM1MDcyOTEzMzkwNVowGDEWMBQGA1UEAwwNYXBwLW1mbGlicmFyeTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM1r1sAndaG+JLTQmcp9AcHV2p8TeTnCKAG9O0SZOLf7yCXAwJtM2lmROYXtuMvUY2204VoDG9XmapD86MyHgbq6I0iu/quUAL/pY6TlE0wwtKMhtIzosu+29tqQ9Iq9OClOsHXKyyZPxhjiockcWHL8c/7Ru1B2AiI1dzNBEwgjkWuQ5fPPRrbecXW2PIenNyw9c1zh8GqjgW/W7AgNyfSpdv5qIfoYubNPn0VREskJ3kXjdfXHKQgS4AQPTE8BC3EZxoNxirVXArxV3STDHLbFrmrXj9iLPl00fkdSd+nDcUAs2f9JdebtKbd/jlO3zpTfH3YwxYcr7zyaZxDmwxsCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAyF76OGIXvBk0fDZW9fOjvj0cJlQi4LIunSi6g8lnOYwyIRxFBWKrK2Sx6MglMTFRm4ZtyiQYWHEZ2Xcr32UCEIZ8IW9+6yAKZV6ljEu0BSKAZmHssMPQps6tdndCckNYbyXeDWTIq55HS2TkpI/Ptg1sbLyXSx0dxeRgK1IuLOsIQMdBuZ9Ck5b1araGLY+OXmtVqOExUjt4uOpkkHeCvhyEc3pqaPjttWbIgTybnCLHqOe/GlBb9zCZBLOnYXx0vMGM34S1Av5ojNrjcdf/rU0A0ZorAj2xOM5VFUQyqjBtYkYR5k+MAfTGFTJ2LXTCXxbGs+zwGaHh/yKbsV7CkQ=="
+ ],
+ "priority": [
+ "100"
+ ],
+ "algorithm": [
+ "RSA-OAEP"
+ ]
+ }
+ },
+ {
+ "id": "fb8efef1-9600-469e-9ef0-5706cb40c40f",
+ "name": "hmac-generated",
+ "providerId": "hmac-generated",
+ "subComponents": {},
+ "config": {
+ "kid": [
+ "64252d9e-8ae5-40fc-9ecf-bc17a94357aa"
+ ],
+ "secret": [
+ "byagywt4CSCn5LNOCucOpOAVWSzfLS057pa2TwlM6rIkKxpgZ-uVeibuK10jNz2YeJd9-u1u4y5bPsK_Q2gSIw"
+ ],
+ "priority": [
+ "100"
+ ],
+ "algorithm": [
+ "HS256"
+ ]
+ }
+ },
+ {
+ "id": "e3db360a-80cd-4564-b2fc-71dff089645e",
+ "name": "aes-generated",
+ "providerId": "aes-generated",
+ "subComponents": {},
+ "config": {
+ "kid": [
+ "de9c0f04-02ff-49d2-9d3e-a3af7eb5f750"
+ ],
+ "secret": [
+ "K2Uaeg-X-pTa5Bb8NzkMGg"
+ ],
+ "priority": [
+ "100"
+ ]
+ }
+ },
+ {
+ "id": "fa71afc9-fc89-454c-865d-a7be14386856",
+ "name": "rsa-generated",
+ "providerId": "rsa-generated",
+ "subComponents": {},
+ "config": {
+ "privateKey": [
+ "MIIEogIBAAKCAQEAmPSrldwqKVNb62K5OhNEky9/ZEmEeefCKfObkl+aTYpRplZG6UsQkkPxId+uf17EQLRyEGvYXqUufYmO+P6i58m2a+gAfF5FYg6/wD8O47GPRDZBbbdoVCtQ61bos5QKtilXEUhRCj9+ZsPg7eUa6A6tHCgNrw+XCQxKzkmRBu8tpAPggkewE7fd55L1CYTh4JPDn+4rBL6dsJyJjO0e0VfiYy5gEeE2kHyTFzBmhZhJ7Fhcmhxcy9+lsMPeTib0BwCtafsboZpYydQ0nKLKQZTbC1dC0ESLOQ2R6KZBNXEx6hG8kGWxfoT7ZPQRSxWi6Ammz+0nu7zOGGT7wbU3uwIDAQABAoIBADZ8CVcTmw0nfXnGq/ZtAKNxau6dZYxLKxXoigVE+uEeIWGgIBhgPeHsQ8vuMul6J2xpGqyQzf1A1+OuCXjWs87fQpUDipDCv/JjEJj5nWMsT71bmkjr6UT6PRPn3HKDjKFA7pvgZ8W/wlX29nunfcMl3zJFbkJqykFV2JvNBtUx9pMwz8RRG8P/CoMAV1W7MaYS9bhzqOloyo/BPi5DO/UzPZIaL8spWVeb8wW4AaG0kbBiUcEGsRvFBsHHV5xTuBi6HSYQnI1aHn3Ljyf5G8oKPpbPGk9E3Hpeo1IrMNu1Tm8hnekOaMF6/si4XJLAl5KibGUxsN/R9xH/DJfvTjECgYEA0jRpKargbbPMbJ6f8kRrlUcVewRhoADi19jL4bFZLk0EDKqNXTCnTOb5HVmPvACDgLwkH804VY89pPIIBot19UM/ozp6i5S45w6yPNzW9H73dmBs0s3SuqHi7TtGdYLSOqcsoamP5zDF6czglxhEexl73k20kkwG1a+d9INGKDMCgYEAukda52LhbhKlEYekp8uu/b2TVyp2yFjLAZcpeDdTTccKyEBTACrZmrJkij1enUaxmDcDiUXn8Q8DVLPVIEKPySAVw5iGk4QVhfQAY/z7udQM4InS7N0dWM6Tg5WKIonFYMVVlROurUGQ4JRS+lhlPz0UY9AGAg82VsK9oo4DylkCgYBb4gsB6q6VZV17MU9LD/tS0jKihkTCMwD1Rs/ABMytv36ApuCKFqVaqS/FU4vPqw3QbO0BdawlQiq4+g7mBXn3ToD3sa01bDnyzeq9Te8sCn/TH80RzGRLrk3KUvm2jgulFcQdmkfLz/cC/spBYZs1j+skPiUrOc5XA5/w7JzzHwKBgCy3PEcXIW4+44kVupzc9CDNBTWDaAgn6HN1SeslvMWK5jez2TjNEHdmI2Rb3v56Hd+gNSUattbS98W5dYvM7p8lKJRPZN68cj45mG5oKDUvhffQneVmHslWrWqE1yf7UnosZKLomqHUf2aptFGMLqHDk8VyBj8wT6b8EHGZDafhAoGAFM7CuyAgV/awX8I++hsL5inMwZFeyEmHEdmnPmvx0ue80Kn5gPh2tY/PkN2NVyer+mUse1pD63AVOGaaE5E9tOTF+8Ou/ODff5H3ICstq33T90sxFSdz2G9ehMDMTHaPe9gQqLjdGWNO07dihi2XBi7OysT9rZCn3/N+RLxeCvU="
+ ],
+ "keyUse": [
+ "SIG"
+ ],
+ "certificate": [
+ "MIICqTCCAZECBgGYVmh/iDANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1hcHAtbWZsaWJyYXJ5MB4XDTI1MDcyOTEzMzcyNVoXDTM1MDcyOTEzMzkwNVowGDEWMBQGA1UEAwwNYXBwLW1mbGlicmFyeTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJj0q5XcKilTW+tiuToTRJMvf2RJhHnnwinzm5Jfmk2KUaZWRulLEJJD8SHfrn9exEC0chBr2F6lLn2Jjvj+oufJtmvoAHxeRWIOv8A/DuOxj0Q2QW23aFQrUOtW6LOUCrYpVxFIUQo/fmbD4O3lGugOrRwoDa8PlwkMSs5JkQbvLaQD4IJHsBO33eeS9QmE4eCTw5/uKwS+nbCciYztHtFX4mMuYBHhNpB8kxcwZoWYSexYXJocXMvfpbDD3k4m9AcArWn7G6GaWMnUNJyiykGU2wtXQtBEizkNkeimQTVxMeoRvJBlsX6E+2T0EUsVougJps/tJ7u8zhhk+8G1N7sCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAHVpS61llJ2ro/bDGbWq9nAuZwi7nt0LeIzixaqRNSgLM+wGecG6cRGozZ6o4DCdovXhyNpyfXXMLoNYfgiIYs8ordb8LSEN5886rxi2ykolf2Xv5p17FrkjMd18SfdYHYYoh7Qs6jWPaK4V9HRuFwCkyCk23/vJxYUeLE0yCwUDGcO3MF7C1QlNAosDyTGh+CJ2FFALzwqCDIJbkiA0lctUhejdkCZwS9hBw1waEDae6SfZ+jnXgKjR5rDIY6zK+7/LnV/JpgBdYK9jX92SWULKIPwSG3pG3Onmde0i7RlfAEaKCcSsTwa7iKhpAlVYgVQMYCcmWMOi73qjzR7VDZA=="
+ ],
+ "priority": [
+ "100"
+ ]
+ }
+ }
+ ]
+ },
+ "internationalizationEnabled": false,
+ "supportedLocales": [],
+ "authenticationFlows": [
+ {
+ "id": "16f66568-6848-4241-91a8-89dce5b08bd3",
+ "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": "80bacd7e-520f-4ae8-9d0d-8489301e7f64",
+ "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": "c82fd587-6ccb-4e94-a4a9-304998c09864",
+ "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": "709f078c-90e4-4c69-bb98-20f31bc4d354",
+ "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": "dd52b674-1b0b-4604-915a-f0bb34925df9",
+ "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": "e3cc8fe4-2950-4da3-8383-16623cc89990",
+ "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": "0f718a54-4962-4a7b-9ded-f065236151a7",
+ "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": "1a973fec-8e77-440d-95ca-cffe7a15617c",
+ "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": "0489d267-3773-4c44-a46a-b2ce786bcce4",
+ "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": "06a7614e-5bba-4882-af56-3aa530bd8802",
+ "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": "df5b2bf4-8dc0-46dd-ba7c-1306d27bcef2",
+ "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": "64078cf2-072f-48c4-813f-6938539f629b",
+ "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": "82f5fcd7-ad45-4b31-8df3-fb28fbfbe8cc",
+ "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": "a486a0eb-695c-4dab-8346-4ad2e5d38ffc",
+ "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": "b30e82f6-2aa3-4679-9491-08bec2058ed3",
+ "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": "5524a288-7f78-486f-b4c6-20e9eac5c19f",
+ "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": "3f47b9dd-3ee7-48e7-8519-1acd12db86a6",
+ "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": "30b3e50e-fd0c-404f-97ff-be5fb2d8f72f",
+ "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": "22dfbe69-9f04-4643-8b88-e7e6f343298b",
+ "alias": "create unique user config",
+ "config": {
+ "require.password.update.after.registration": "false"
+ }
+ },
+ {
+ "id": "bd0bc798-33aa-42b1-8623-ba4bdabb37b8",
+ "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",
+ "cibaAuthRequestedUserHint": "login_hint",
+ "oauth2DevicePollingInterval": "5",
+ "clientOfflineSessionMaxLifespan": "0",
+ "clientSessionIdleTimeout": "0",
+ "clientOfflineSessionIdleTimeout": "0",
+ "cibaInterval": "5",
+ "realmReusableOtpCode": "false",
+ "cibaExpiresIn": "120",
+ "oauth2DeviceCodeLifespan": "600",
+ "parRequestUriLifespan": "60",
+ "clientSessionMaxLifespan": "0",
+ "frontendUrl": "",
+ "acr.loa.map": "{}"
+ },
+ "keycloakVersion": "23.0.3",
+ "userManagedAccessAllowed": true,
+ "clientProfiles": {
+ "profiles": []
+ },
+ "clientPolicies": {
+ "policies": []
+ }
+}
\ No newline at end of file
diff --git a/.infra/keycloak/master-realm-export.json b/.infra/keycloak/master-realm-export.json
new file mode 100644
index 0000000..8926b1d
--- /dev/null
+++ b/.infra/keycloak/master-realm-export.json
@@ -0,0 +1,2448 @@
+{
+ "id": "e402eb56-beee-4a96-9bfd-b0fa9edd865c",
+ "realm": "master",
+ "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": 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": "625fcc77-d7c9-4efe-bba7-fc812b848b1b",
+ "name": "offline_access",
+ "description": "${role_offline-access}",
+ "composite": false,
+ "clientRole": false,
+ "containerId": "e402eb56-beee-4a96-9bfd-b0fa9edd865c",
+ "attributes": {}
+ },
+ {
+ "id": "356d13a7-0582-4820-a50b-3884d7a1fa95",
+ "name": "uma_authorization",
+ "description": "${role_uma_authorization}",
+ "composite": false,
+ "clientRole": false,
+ "containerId": "e402eb56-beee-4a96-9bfd-b0fa9edd865c",
+ "attributes": {}
+ },
+ {
+ "id": "2e6b67e8-cbef-4758-bd4b-33fa80afe311",
+ "name": "create-realm",
+ "description": "${role_create-realm}",
+ "composite": false,
+ "clientRole": false,
+ "containerId": "e402eb56-beee-4a96-9bfd-b0fa9edd865c",
+ "attributes": {}
+ },
+ {
+ "id": "8ad5b5c5-623e-4a96-9006-600a1133493a",
+ "name": "default-roles-master",
+ "description": "${role_default-roles}",
+ "composite": true,
+ "composites": {
+ "realm": [
+ "offline_access",
+ "uma_authorization"
+ ],
+ "client": {
+ "account": [
+ "view-profile",
+ "manage-account"
+ ]
+ }
+ },
+ "clientRole": false,
+ "containerId": "e402eb56-beee-4a96-9bfd-b0fa9edd865c",
+ "attributes": {}
+ },
+ {
+ "id": "59ec3c89-d7e0-47e7-a55c-6259de7816d8",
+ "name": "admin",
+ "description": "${role_admin}",
+ "composite": true,
+ "composites": {
+ "realm": [
+ "create-realm"
+ ],
+ "client": {
+ "app-mflibrary-realm": [
+ "view-events",
+ "query-clients",
+ "view-users",
+ "manage-events",
+ "view-authorization",
+ "manage-users",
+ "create-client",
+ "view-identity-providers",
+ "manage-identity-providers",
+ "manage-clients",
+ "view-realm",
+ "manage-authorization",
+ "query-realms",
+ "impersonation",
+ "query-users",
+ "manage-realm",
+ "view-clients",
+ "query-groups"
+ ],
+ "master-realm": [
+ "view-authorization",
+ "manage-events",
+ "manage-identity-providers",
+ "view-realm",
+ "impersonation",
+ "query-users",
+ "view-clients",
+ "query-realms",
+ "manage-clients",
+ "manage-authorization",
+ "view-identity-providers",
+ "view-events",
+ "query-groups",
+ "manage-realm",
+ "view-users",
+ "manage-users",
+ "query-clients",
+ "create-client"
+ ]
+ }
+ },
+ "clientRole": false,
+ "containerId": "e402eb56-beee-4a96-9bfd-b0fa9edd865c",
+ "attributes": {}
+ }
+ ],
+ "client": {
+ "app-mflibrary-realm": [
+ {
+ "id": "5b47af12-84ab-49b6-8f78-c4cbdd14814a",
+ "name": "manage-clients",
+ "description": "${role_manage-clients}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "3affe488-343a-417d-878d-c43ffc0136d3",
+ "attributes": {}
+ },
+ {
+ "id": "af3b2969-2e66-4710-9fc1-44c8621a4bf4",
+ "name": "view-realm",
+ "description": "${role_view-realm}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "3affe488-343a-417d-878d-c43ffc0136d3",
+ "attributes": {}
+ },
+ {
+ "id": "9f055889-7529-4a2d-8598-a72c194f49f6",
+ "name": "manage-authorization",
+ "description": "${role_manage-authorization}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "3affe488-343a-417d-878d-c43ffc0136d3",
+ "attributes": {}
+ },
+ {
+ "id": "cf306cc0-b1e0-44eb-83c2-fca01f79cf45",
+ "name": "query-realms",
+ "description": "${role_query-realms}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "3affe488-343a-417d-878d-c43ffc0136d3",
+ "attributes": {}
+ },
+ {
+ "id": "d723ab77-a10a-4a64-8a70-a5a66f1b7c98",
+ "name": "impersonation",
+ "description": "${role_impersonation}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "3affe488-343a-417d-878d-c43ffc0136d3",
+ "attributes": {}
+ },
+ {
+ "id": "970b5c87-4b55-440a-8a67-0e7db72cdf12",
+ "name": "query-users",
+ "description": "${role_query-users}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "3affe488-343a-417d-878d-c43ffc0136d3",
+ "attributes": {}
+ },
+ {
+ "id": "cecacca6-f284-4fd0-bbfc-ae6c965a537f",
+ "name": "view-events",
+ "description": "${role_view-events}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "3affe488-343a-417d-878d-c43ffc0136d3",
+ "attributes": {}
+ },
+ {
+ "id": "ed81838b-8da6-4dfc-98f6-a5738fd0e282",
+ "name": "query-clients",
+ "description": "${role_query-clients}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "3affe488-343a-417d-878d-c43ffc0136d3",
+ "attributes": {}
+ },
+ {
+ "id": "50d59313-427b-4697-b6ea-66c37e1fb893",
+ "name": "view-users",
+ "description": "${role_view-users}",
+ "composite": true,
+ "composites": {
+ "client": {
+ "app-mflibrary-realm": [
+ "query-users",
+ "query-groups"
+ ]
+ }
+ },
+ "clientRole": true,
+ "containerId": "3affe488-343a-417d-878d-c43ffc0136d3",
+ "attributes": {}
+ },
+ {
+ "id": "c8bed629-fc3a-477e-b639-1cb4f59c68f4",
+ "name": "manage-events",
+ "description": "${role_manage-events}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "3affe488-343a-417d-878d-c43ffc0136d3",
+ "attributes": {}
+ },
+ {
+ "id": "6c67023c-7009-4ad1-bc59-eef32107a345",
+ "name": "manage-realm",
+ "description": "${role_manage-realm}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "3affe488-343a-417d-878d-c43ffc0136d3",
+ "attributes": {}
+ },
+ {
+ "id": "55a6e333-4582-4939-baf4-1215b30a9f02",
+ "name": "view-clients",
+ "description": "${role_view-clients}",
+ "composite": true,
+ "composites": {
+ "client": {
+ "app-mflibrary-realm": [
+ "query-clients"
+ ]
+ }
+ },
+ "clientRole": true,
+ "containerId": "3affe488-343a-417d-878d-c43ffc0136d3",
+ "attributes": {}
+ },
+ {
+ "id": "e6573615-f9f6-470c-a0c5-71810a26c5fe",
+ "name": "view-authorization",
+ "description": "${role_view-authorization}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "3affe488-343a-417d-878d-c43ffc0136d3",
+ "attributes": {}
+ },
+ {
+ "id": "0cd5f5ac-8732-4c88-988d-69080de06d6e",
+ "name": "manage-users",
+ "description": "${role_manage-users}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "3affe488-343a-417d-878d-c43ffc0136d3",
+ "attributes": {}
+ },
+ {
+ "id": "3cfb395a-05f9-4867-bce9-f0c9ea861047",
+ "name": "create-client",
+ "description": "${role_create-client}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "3affe488-343a-417d-878d-c43ffc0136d3",
+ "attributes": {}
+ },
+ {
+ "id": "2410b6ca-521e-46dd-99a8-f7bce2056c61",
+ "name": "manage-identity-providers",
+ "description": "${role_manage-identity-providers}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "3affe488-343a-417d-878d-c43ffc0136d3",
+ "attributes": {}
+ },
+ {
+ "id": "13a7913d-6e14-49ee-b5c5-64944bb94976",
+ "name": "view-identity-providers",
+ "description": "${role_view-identity-providers}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "3affe488-343a-417d-878d-c43ffc0136d3",
+ "attributes": {}
+ },
+ {
+ "id": "d1a5a81c-3fa3-41bb-9764-6086e563447c",
+ "name": "query-groups",
+ "description": "${role_query-groups}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "3affe488-343a-417d-878d-c43ffc0136d3",
+ "attributes": {}
+ }
+ ],
+ "security-admin-console": [],
+ "admin-cli": [],
+ "account-console": [],
+ "broker": [
+ {
+ "id": "438d137a-89b2-48b2-a520-602a207f2b41",
+ "name": "read-token",
+ "description": "${role_read-token}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "7a07262c-2e77-446a-8374-23c3465978ab",
+ "attributes": {}
+ }
+ ],
+ "master-realm": [
+ {
+ "id": "2074d999-97ab-4bda-866a-6105d35798eb",
+ "name": "query-realms",
+ "description": "${role_query-realms}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "6b49cf80-e5a9-4c9f-b624-a2ef8b46c829",
+ "attributes": {}
+ },
+ {
+ "id": "8276b674-ebbf-4dcc-9cdf-9c54e19a849f",
+ "name": "view-authorization",
+ "description": "${role_view-authorization}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "6b49cf80-e5a9-4c9f-b624-a2ef8b46c829",
+ "attributes": {}
+ },
+ {
+ "id": "8f87c957-814e-470f-bb8f-cec9f8f07be3",
+ "name": "manage-authorization",
+ "description": "${role_manage-authorization}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "6b49cf80-e5a9-4c9f-b624-a2ef8b46c829",
+ "attributes": {}
+ },
+ {
+ "id": "271d8a00-6efa-4f5e-8561-e5405bb5c2e2",
+ "name": "manage-clients",
+ "description": "${role_manage-clients}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "6b49cf80-e5a9-4c9f-b624-a2ef8b46c829",
+ "attributes": {}
+ },
+ {
+ "id": "b00ee69f-4c23-40fa-bf63-f8cb52b675bc",
+ "name": "view-identity-providers",
+ "description": "${role_view-identity-providers}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "6b49cf80-e5a9-4c9f-b624-a2ef8b46c829",
+ "attributes": {}
+ },
+ {
+ "id": "f5241c57-8ea6-4a75-821f-1ee12f9265b4",
+ "name": "manage-events",
+ "description": "${role_manage-events}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "6b49cf80-e5a9-4c9f-b624-a2ef8b46c829",
+ "attributes": {}
+ },
+ {
+ "id": "33c7599d-6045-450b-8f77-a6cc7633854f",
+ "name": "manage-identity-providers",
+ "description": "${role_manage-identity-providers}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "6b49cf80-e5a9-4c9f-b624-a2ef8b46c829",
+ "attributes": {}
+ },
+ {
+ "id": "52a5ac46-c249-4d3a-8eab-30b72a7b3cd2",
+ "name": "view-events",
+ "description": "${role_view-events}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "6b49cf80-e5a9-4c9f-b624-a2ef8b46c829",
+ "attributes": {}
+ },
+ {
+ "id": "f68fa187-beae-458a-b7e7-8f94372e6ee0",
+ "name": "manage-realm",
+ "description": "${role_manage-realm}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "6b49cf80-e5a9-4c9f-b624-a2ef8b46c829",
+ "attributes": {}
+ },
+ {
+ "id": "31b03ec0-0236-4fa8-b90e-86cef99d56bb",
+ "name": "query-groups",
+ "description": "${role_query-groups}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "6b49cf80-e5a9-4c9f-b624-a2ef8b46c829",
+ "attributes": {}
+ },
+ {
+ "id": "c2d0fcd1-512d-4960-a8d4-b673c48caf6e",
+ "name": "impersonation",
+ "description": "${role_impersonation}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "6b49cf80-e5a9-4c9f-b624-a2ef8b46c829",
+ "attributes": {}
+ },
+ {
+ "id": "18fbd1e0-203b-47d9-8660-be498e539d2a",
+ "name": "view-realm",
+ "description": "${role_view-realm}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "6b49cf80-e5a9-4c9f-b624-a2ef8b46c829",
+ "attributes": {}
+ },
+ {
+ "id": "644a700e-64d7-482d-b8a0-b78e33c73d05",
+ "name": "view-users",
+ "description": "${role_view-users}",
+ "composite": true,
+ "composites": {
+ "client": {
+ "master-realm": [
+ "query-groups",
+ "query-users"
+ ]
+ }
+ },
+ "clientRole": true,
+ "containerId": "6b49cf80-e5a9-4c9f-b624-a2ef8b46c829",
+ "attributes": {}
+ },
+ {
+ "id": "29bc6f46-0da3-494f-81ec-f5b1b7b13530",
+ "name": "query-users",
+ "description": "${role_query-users}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "6b49cf80-e5a9-4c9f-b624-a2ef8b46c829",
+ "attributes": {}
+ },
+ {
+ "id": "3f92906a-5322-4809-afe8-f118621b26ce",
+ "name": "manage-users",
+ "description": "${role_manage-users}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "6b49cf80-e5a9-4c9f-b624-a2ef8b46c829",
+ "attributes": {}
+ },
+ {
+ "id": "0e1608d2-609b-47e6-9d99-c6e15c755feb",
+ "name": "view-clients",
+ "description": "${role_view-clients}",
+ "composite": true,
+ "composites": {
+ "client": {
+ "master-realm": [
+ "query-clients"
+ ]
+ }
+ },
+ "clientRole": true,
+ "containerId": "6b49cf80-e5a9-4c9f-b624-a2ef8b46c829",
+ "attributes": {}
+ },
+ {
+ "id": "85f3b152-ca5f-4e9b-9409-7d6cdab0373a",
+ "name": "query-clients",
+ "description": "${role_query-clients}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "6b49cf80-e5a9-4c9f-b624-a2ef8b46c829",
+ "attributes": {}
+ },
+ {
+ "id": "8831bb62-d473-407a-9429-06af97fa36d8",
+ "name": "create-client",
+ "description": "${role_create-client}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "6b49cf80-e5a9-4c9f-b624-a2ef8b46c829",
+ "attributes": {}
+ }
+ ],
+ "account": [
+ {
+ "id": "a3904939-dea0-48bd-8ff1-fdfd98d2b3f0",
+ "name": "manage-account-links",
+ "description": "${role_manage-account-links}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "c05cc545-1daa-412d-9fa3-f7f6597088fb",
+ "attributes": {}
+ },
+ {
+ "id": "bd82adb6-8ecc-4bfe-90ac-2e2c0bdbd7dc",
+ "name": "view-applications",
+ "description": "${role_view-applications}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "c05cc545-1daa-412d-9fa3-f7f6597088fb",
+ "attributes": {}
+ },
+ {
+ "id": "42775dff-5423-491e-8159-360d62b7f201",
+ "name": "manage-consent",
+ "description": "${role_manage-consent}",
+ "composite": true,
+ "composites": {
+ "client": {
+ "account": [
+ "view-consent"
+ ]
+ }
+ },
+ "clientRole": true,
+ "containerId": "c05cc545-1daa-412d-9fa3-f7f6597088fb",
+ "attributes": {}
+ },
+ {
+ "id": "104cabba-6e8b-40f7-bbaf-388f549d2eb8",
+ "name": "view-consent",
+ "description": "${role_view-consent}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "c05cc545-1daa-412d-9fa3-f7f6597088fb",
+ "attributes": {}
+ },
+ {
+ "id": "964afd0c-3e07-494d-ae78-5ef5699694b7",
+ "name": "delete-account",
+ "description": "${role_delete-account}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "c05cc545-1daa-412d-9fa3-f7f6597088fb",
+ "attributes": {}
+ },
+ {
+ "id": "31b4473a-35f3-49f6-8eb1-d3f17b782dee",
+ "name": "view-profile",
+ "description": "${role_view-profile}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "c05cc545-1daa-412d-9fa3-f7f6597088fb",
+ "attributes": {}
+ },
+ {
+ "id": "d9e6e9f0-fd41-4d00-b3be-c3d24b0521d3",
+ "name": "view-groups",
+ "description": "${role_view-groups}",
+ "composite": false,
+ "clientRole": true,
+ "containerId": "c05cc545-1daa-412d-9fa3-f7f6597088fb",
+ "attributes": {}
+ },
+ {
+ "id": "f7b98fb8-edb5-411a-b4a2-0b8733b725dd",
+ "name": "manage-account",
+ "description": "${role_manage-account}",
+ "composite": true,
+ "composites": {
+ "client": {
+ "account": [
+ "manage-account-links"
+ ]
+ }
+ },
+ "clientRole": true,
+ "containerId": "c05cc545-1daa-412d-9fa3-f7f6597088fb",
+ "attributes": {}
+ }
+ ]
+ }
+ },
+ "groups": [],
+ "defaultRole": {
+ "id": "8ad5b5c5-623e-4a96-9006-600a1133493a",
+ "name": "default-roles-master",
+ "description": "${role_default-roles}",
+ "composite": true,
+ "clientRole": false,
+ "containerId": "e402eb56-beee-4a96-9bfd-b0fa9edd865c"
+ },
+ "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": "c7459daf-5b3c-433f-90a9-78c7fde2bd4d",
+ "createdTimestamp": 1753795934028,
+ "username": "admin",
+ "enabled": true,
+ "totp": false,
+ "emailVerified": false,
+ "credentials": [
+ {
+ "id": "1f6669b5-ace3-45b8-b20c-fb22d4f2c102",
+ "type": "password",
+ "createdDate": 1753795934207,
+ "secretData": "{\"value\":\"Ib152JwaV+5WL5LUCcq30XXb16Gt3nOsTT+IeriDw+M=\",\"salt\":\"QUXb8sZDjcryHcMXEhdx1A==\",\"additionalParameters\":{}}",
+ "credentialData": "{\"hashIterations\":27500,\"algorithm\":\"pbkdf2-sha256\",\"additionalParameters\":{}}"
+ }
+ ],
+ "disableableCredentialTypes": [],
+ "requiredActions": [],
+ "realmRoles": [
+ "default-roles-master",
+ "admin"
+ ],
+ "clientRoles": {
+ "app-mflibrary-realm": [
+ "manage-clients",
+ "view-realm",
+ "manage-authorization",
+ "query-realms",
+ "view-events",
+ "query-users",
+ "query-clients",
+ "view-users",
+ "manage-realm",
+ "manage-events",
+ "view-clients",
+ "view-authorization",
+ "manage-users",
+ "create-client",
+ "view-identity-providers",
+ "manage-identity-providers",
+ "query-groups"
+ ]
+ },
+ "notBefore": 0,
+ "groups": []
+ }
+ ],
+ "scopeMappings": [
+ {
+ "clientScope": "offline_access",
+ "roles": [
+ "offline_access"
+ ]
+ }
+ ],
+ "clientScopeMappings": {
+ "account": [
+ {
+ "client": "account-console",
+ "roles": [
+ "manage-account",
+ "view-groups"
+ ]
+ }
+ ]
+ },
+ "clients": [
+ {
+ "id": "c05cc545-1daa-412d-9fa3-f7f6597088fb",
+ "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": {
+ "post.logout.redirect.uris": "+"
+ },
+ "authenticationFlowBindingOverrides": {},
+ "fullScopeAllowed": false,
+ "nodeReRegistrationTimeout": 0,
+ "defaultClientScopes": [
+ "web-origins",
+ "acr",
+ "profile",
+ "roles",
+ "email"
+ ],
+ "optionalClientScopes": [
+ "address",
+ "phone",
+ "offline_access",
+ "microprofile-jwt"
+ ]
+ },
+ {
+ "id": "f820b9de-9ce9-492e-9845-d7650bf381ae",
+ "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": {
+ "post.logout.redirect.uris": "+",
+ "pkce.code.challenge.method": "S256"
+ },
+ "authenticationFlowBindingOverrides": {},
+ "fullScopeAllowed": false,
+ "nodeReRegistrationTimeout": 0,
+ "protocolMappers": [
+ {
+ "id": "f24e2c0f-1e9e-4352-b721-5e1b6646d4b0",
+ "name": "audience resolve",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-audience-resolve-mapper",
+ "consentRequired": false,
+ "config": {}
+ }
+ ],
+ "defaultClientScopes": [
+ "web-origins",
+ "acr",
+ "profile",
+ "roles",
+ "email"
+ ],
+ "optionalClientScopes": [
+ "address",
+ "phone",
+ "offline_access",
+ "microprofile-jwt"
+ ]
+ },
+ {
+ "id": "3da95088-9c0e-4d51-b649-4e19c95be6b5",
+ "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",
+ "acr",
+ "profile",
+ "roles",
+ "email"
+ ],
+ "optionalClientScopes": [
+ "address",
+ "phone",
+ "offline_access",
+ "microprofile-jwt"
+ ]
+ },
+ {
+ "id": "3affe488-343a-417d-878d-c43ffc0136d3",
+ "clientId": "app-mflibrary-realm",
+ "name": "app-mflibrary 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,
+ "attributes": {},
+ "authenticationFlowBindingOverrides": {},
+ "fullScopeAllowed": false,
+ "nodeReRegistrationTimeout": 0,
+ "defaultClientScopes": [],
+ "optionalClientScopes": []
+ },
+ {
+ "id": "7a07262c-2e77-446a-8374-23c3465978ab",
+ "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",
+ "acr",
+ "profile",
+ "roles",
+ "email"
+ ],
+ "optionalClientScopes": [
+ "address",
+ "phone",
+ "offline_access",
+ "microprofile-jwt"
+ ]
+ },
+ {
+ "id": "6b49cf80-e5a9-4c9f-b624-a2ef8b46c829",
+ "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,
+ "attributes": {},
+ "authenticationFlowBindingOverrides": {},
+ "fullScopeAllowed": false,
+ "nodeReRegistrationTimeout": 0,
+ "defaultClientScopes": [
+ "web-origins",
+ "acr",
+ "profile",
+ "roles",
+ "email"
+ ],
+ "optionalClientScopes": [
+ "address",
+ "phone",
+ "offline_access",
+ "microprofile-jwt"
+ ]
+ },
+ {
+ "id": "79e88c21-e6c7-4019-b1ad-c831a22a504b",
+ "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": {
+ "post.logout.redirect.uris": "+",
+ "pkce.code.challenge.method": "S256"
+ },
+ "authenticationFlowBindingOverrides": {},
+ "fullScopeAllowed": false,
+ "nodeReRegistrationTimeout": 0,
+ "protocolMappers": [
+ {
+ "id": "9376a0b2-76b5-4394-b3ef-ec1152baa15c",
+ "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",
+ "profile",
+ "roles",
+ "email"
+ ],
+ "optionalClientScopes": [
+ "address",
+ "phone",
+ "offline_access",
+ "microprofile-jwt"
+ ]
+ }
+ ],
+ "clientScopes": [
+ {
+ "id": "c115c68d-36d6-4e89-afe2-2f0db0014627",
+ "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": "b487300b-a963-4314-a0f6-33ac98bf4b10",
+ "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"
+ }
+ }
+ ]
+ },
+ {
+ "id": "e95ae60e-d961-4fb5-8b4c-c579566bf6d3",
+ "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": "351c32b2-f137-4d4e-af66-418da01888a5",
+ "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": "f33337da-d5ab-4b44-aeb1-7a46fae8e503",
+ "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": "0a388fe8-4e71-415c-9857-957afa7361c5",
+ "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": "4b1ae24e-46d5-4614-8fc4-308271e126d1",
+ "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": "27b7e221-5187-43f0-996a-9442a2da6227",
+ "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": "4cce7f6b-731b-4f06-91ad-07056cfaabd5",
+ "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": "4761b794-7e64-4462-8c57-850e3ebab41c",
+ "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": "35864b97-dd65-49d9-b890-284120092203",
+ "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": "b37ed0fe-b3dc-4a26-a7d7-0578c7ff1f01",
+ "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": "c4581728-2c0c-486d-92f3-2aa74af8f078",
+ "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": "06b69424-8101-434a-a997-918be09f0612",
+ "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": "63f2a52f-2afa-4e60-a05d-09b842bbbe34",
+ "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": "e54d2fb1-41c7-4eb7-b267-03c9ac85d42c",
+ "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": "3565ae3d-fd99-439c-b61b-977a6920c395",
+ "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": "4ad50ec2-88d4-4991-ae7f-422b204d6e99",
+ "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": "7659f784-ef22-4a65-a50b-ef480cb14993",
+ "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": "3259b921-7ded-44c5-b5e3-c94b1a40ee82",
+ "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": "8b4a6e7b-030f-4566-9ced-04b832ef64bf",
+ "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": "bc7173c0-47c5-4333-8536-9ca1b1077b5b",
+ "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": "14938c23-3c0b-4e39-a801-a3afddb66359",
+ "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": "fefba312-eb6f-4cd0-b9d6-b6f715c86521",
+ "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": "33f8239f-8490-43e8-b7dd-1e6d7aa628f9",
+ "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": "cce2406b-03fa-4144-997f-3702d7d8c8b3",
+ "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": "f409e289-e5ca-4943-8162-6b32425a92cc",
+ "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": "c5620362-b962-4c25-ad4e-e2e2de055d65",
+ "name": "allowed web origins",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-allowed-origins-mapper",
+ "consentRequired": false,
+ "config": {
+ "introspection.token.claim": "true",
+ "access.token.claim": "true"
+ }
+ }
+ ]
+ },
+ {
+ "id": "024942e9-bfd1-4270-ade9-8741909d0965",
+ "name": "role_list",
+ "description": "SAML role list",
+ "protocol": "saml",
+ "attributes": {
+ "consent.screen.text": "${samlRoleListScopeConsentText}",
+ "display.on.consent.screen": "true"
+ },
+ "protocolMappers": [
+ {
+ "id": "8a83cb8c-2058-4c43-9df4-bac632762af0",
+ "name": "role list",
+ "protocol": "saml",
+ "protocolMapper": "saml-role-list-mapper",
+ "consentRequired": false,
+ "config": {
+ "single": "false",
+ "attribute.nameformat": "Basic",
+ "attribute.name": "Role"
+ }
+ }
+ ]
+ },
+ {
+ "id": "69bf72e2-c859-4e4a-a061-aeb0c56c5c00",
+ "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": "5c6a6c60-3443-4281-bda0-ba1fe3ee7d81",
+ "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": "9d17b0f8-fd57-48bd-8818-f6f2b7fed22e",
+ "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": "874801ba-0e69-4765-83e2-2376f19550e8",
+ "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": "0769625b-f620-4923-a22d-83a2b5ab8e7c",
+ "name": "audience resolve",
+ "protocol": "openid-connect",
+ "protocolMapper": "oidc-audience-resolve-mapper",
+ "consentRequired": false,
+ "config": {
+ "introspection.token.claim": "true",
+ "access.token.claim": "true"
+ }
+ },
+ {
+ "id": "cf70aa06-30dc-430b-967d-f944849ed505",
+ "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": "716ed74e-5e41-41db-ad38-cd8cd843528c",
+ "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"
+ }
+ }
+ ]
+ }
+ ],
+ "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",
+ "xXSSProtection": "1; mode=block",
+ "contentSecurityPolicy": "frame-src 'self'; frame-ancestors 'self'; object-src 'none';",
+ "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": "30c12de4-b2eb-43ee-8add-2b99c78716c9",
+ "name": "Allowed Client Scopes",
+ "providerId": "allowed-client-templates",
+ "subType": "authenticated",
+ "subComponents": {},
+ "config": {
+ "allow-default-scopes": [
+ "true"
+ ]
+ }
+ },
+ {
+ "id": "a0373be0-0bb5-4ea7-a3c6-05c7e3eda715",
+ "name": "Consent Required",
+ "providerId": "consent-required",
+ "subType": "anonymous",
+ "subComponents": {},
+ "config": {}
+ },
+ {
+ "id": "2c9993e7-948a-432a-8490-22cdd3788506",
+ "name": "Full Scope Disabled",
+ "providerId": "scope",
+ "subType": "anonymous",
+ "subComponents": {},
+ "config": {}
+ },
+ {
+ "id": "45e76ed0-a8aa-4046-886a-76782b60cf36",
+ "name": "Allowed Protocol Mapper Types",
+ "providerId": "allowed-protocol-mappers",
+ "subType": "authenticated",
+ "subComponents": {},
+ "config": {
+ "allowed-protocol-mapper-types": [
+ "oidc-usermodel-property-mapper",
+ "saml-user-attribute-mapper",
+ "saml-role-list-mapper",
+ "oidc-address-mapper",
+ "oidc-full-name-mapper",
+ "oidc-sha256-pairwise-sub-mapper",
+ "oidc-usermodel-attribute-mapper",
+ "saml-user-property-mapper"
+ ]
+ }
+ },
+ {
+ "id": "77f50033-4c37-4c08-be0d-ed52c00c2c51",
+ "name": "Max Clients Limit",
+ "providerId": "max-clients",
+ "subType": "anonymous",
+ "subComponents": {},
+ "config": {
+ "max-clients": [
+ "200"
+ ]
+ }
+ },
+ {
+ "id": "db41b397-d40c-46c9-bde6-0742f07085ff",
+ "name": "Trusted Hosts",
+ "providerId": "trusted-hosts",
+ "subType": "anonymous",
+ "subComponents": {},
+ "config": {
+ "host-sending-registration-request-must-match": [
+ "true"
+ ],
+ "client-uris-must-match": [
+ "true"
+ ]
+ }
+ },
+ {
+ "id": "85350f84-7202-429e-9530-b66730e8e740",
+ "name": "Allowed Client Scopes",
+ "providerId": "allowed-client-templates",
+ "subType": "anonymous",
+ "subComponents": {},
+ "config": {
+ "allow-default-scopes": [
+ "true"
+ ]
+ }
+ },
+ {
+ "id": "a81bed64-cf2c-436c-9e1d-9a258ffc36c4",
+ "name": "Allowed Protocol Mapper Types",
+ "providerId": "allowed-protocol-mappers",
+ "subType": "anonymous",
+ "subComponents": {},
+ "config": {
+ "allowed-protocol-mapper-types": [
+ "oidc-full-name-mapper",
+ "oidc-usermodel-attribute-mapper",
+ "oidc-address-mapper",
+ "saml-user-attribute-mapper",
+ "oidc-sha256-pairwise-sub-mapper",
+ "saml-role-list-mapper",
+ "saml-user-property-mapper",
+ "oidc-usermodel-property-mapper"
+ ]
+ }
+ }
+ ],
+ "org.keycloak.keys.KeyProvider": [
+ {
+ "id": "95ad8fba-b8d8-4729-82c6-08e3d7537917",
+ "name": "hmac-generated",
+ "providerId": "hmac-generated",
+ "subComponents": {},
+ "config": {
+ "kid": [
+ "5f15bc70-396f-49b9-97f8-5a828bd577cd"
+ ],
+ "secret": [
+ "Zj14ogpfilo6kGe-ATOaUcz5wZdanuMOSsS7yO5ieN2AvKn7iOgdYS2gdcGrXDTfi70FcnKbiiGCamSl8QvuOg"
+ ],
+ "priority": [
+ "100"
+ ],
+ "algorithm": [
+ "HS256"
+ ]
+ }
+ },
+ {
+ "id": "66d778e0-dfc9-4055-8982-87c2ea134b25",
+ "name": "rsa-generated",
+ "providerId": "rsa-generated",
+ "subComponents": {},
+ "config": {
+ "privateKey": [
+ "MIIEowIBAAKCAQEA0XXBSmNYe8gZFhX2/SBfTRrAVZvFOQrntYvz4kYBhY72TSd+3ltMnDbrEyhLxd3YLs/Oicjo9J7v7B4Y8IOllUTYAm1OpUEzIOi5SlyQYNPvZ1lNM+VM94ffK00tHFXD36i0ry0exWrdOJrEce1mzzFbd86hKyh66D9y5EuMkeG0tT0wUCIYNXG6gzT7OFRrqpg0XwnXfeVij6DNtWRnjH7tg46q0wxMN5OgjMGTQq5yNl4b87CV1rYAK0sSxXODbscc71KNFKN9H1QnXnp+v58m4zVWYVhXnzCIcPyJqMWsYmwDVvRiCLYJo4/a1UAXxfRE/eIeDPudO+uKYbkdewIDAQABAoIBABGd3cvr3x1KDxIUdtmDR4Csp1CL8WKC0Eosoy58xNP+2ihTEhCRjTf2Rn8t/HF/3xbQ04YzJ6SrWXJ6dY6FBAAx8hkCKIMtoKc765mdf2clbBU9JYkf2AFZpCN4MjsX24mMHuY83UGtYz3Hho4ucV8rv42sC1Id7XhrHbalxATg194HKVTp/dDm+mlcIfFMa7jtLqZSdLWbhvOKt1gXZJscSQ/SfOz8TdBFWXy93rjmTc/jrgh+BLrWLHRvCmpY+aWqbACRHyCPN73Ffkeumy2UUoUG/SNYL8biANNOC6IDvcxR66wTC2zYpUt0/n1Ak1fFQOmN8F9ZT7Fl5FFZywECgYEA8TKBhnas3Jal8dD4WdankPviHaaeZOduU3Om+hqySVT29MCArJKkrZ/xlfBdUOTZY3A5fWz4wuvXp1WCSEKUpxTq0luQIE4zX48VdbxYu2SqpaPV+zXCIx9qjKooK2zTQDEaJnkCPUnHEBHnM1UvAxBX/Gq9QbklhKyVGkef3SsCgYEA3lCeVyznLECSChLogYwbtyL3IVUp6dpywpzTy0y6chJVnkimHAARqSemC///aFJzxUpYu69mlTMvwAF3GlSj+EfWRN115jHkxObx9z6zR28Kyx+4baO4/HAV4YV9Gjy4GPZBg8mR7z9NP/k3PYDab1ouRahgODoe9v6LTfRJuPECgYA/iI1DzRjlli0qEGCK0ZccAq1iIBSTAb827jzqnoOd+2p9uANs8ce9EGeDlmgOOenlXpdWKZExTwxkQIrr29XqWQEt3f6N8+tmXXtKow1Ad1jX/tsLq/JybAEWAnBIWAchXo3D2pYzbK6p1f1vsR2MEg8LJ1ao7EsssoUoAfvjNwKBgEj3YODv5fgKQWR5DELov3f+S+puz1Dn1960JneFeXRTPDK1WX+7LhC86KzrmuKcnU7VtgXz7dFueW+li3fi6+ZjfZogrb+eBJ3zxtsFg0Yg1gQRJzElGWQRTb01WPgxkaLvwFUG5ZUGy84Bd/YBwq/lg2Ztexc5TEx5AzPUyBWhAoGBAJsObA05iO38B3LC7sJ2OHY6W0OG4eR/QJKpQejs6qnoFTslCg5tTpVmiHAo5O5QqxxobBszs7059ous4SADKvUmOyasPTtA41Qbhb0iB3D5yUQeVBLbxbmgGRMg0ZouXYDrLiBtMRjm4yRj1+m2C85AiyH5m+Uz5q/lFwb39uN9"
+ ],
+ "keyUse": [
+ "SIG"
+ ],
+ "certificate": [
+ "MIICmzCCAYMCBgGYVmI0hTANBgkqhkiG9w0BAQsFADARMQ8wDQYDVQQDDAZtYXN0ZXIwHhcNMjUwNzI5MTMzMDMzWhcNMzUwNzI5MTMzMjEzWjARMQ8wDQYDVQQDDAZtYXN0ZXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDRdcFKY1h7yBkWFfb9IF9NGsBVm8U5Cue1i/PiRgGFjvZNJ37eW0ycNusTKEvF3dguz86JyOj0nu/sHhjwg6WVRNgCbU6lQTMg6LlKXJBg0+9nWU0z5Uz3h98rTS0cVcPfqLSvLR7Fat04msRx7WbPMVt3zqErKHroP3LkS4yR4bS1PTBQIhg1cbqDNPs4VGuqmDRfCdd95WKPoM21ZGeMfu2DjqrTDEw3k6CMwZNCrnI2XhvzsJXWtgArSxLFc4NuxxzvUo0Uo30fVCdeen6/nybjNVZhWFefMIhw/ImoxaxibANW9GIItgmjj9rVQBfF9ET94h4M+50764phuR17AgMBAAEwDQYJKoZIhvcNAQELBQADggEBAD/hRzaGdPiyNOT87RDxX4W0hBlxm4Lqo+ROXpBtZS5NPnAaUHeWRigdTRLEmlKXKcEadZHVrt9dzs9pSue7AiILHIV+sb7fUoOruuD9mA003NrFmITstnk+VSQ8+8A4p6kNoyJh+wuPuzRQ/rZWPv3jy4EOzpFX19WrAzSbsN2DN78TANWZJCUquHk8ElDvotwRVD+ywrljNg/96P0A56M3wKVd6NM13YRODEeshuRnuJgiVyxJkCZ0anU35r97EWe20Q5x+CovHtEETfl3oKpo+0R+8SDSDfe8B1wKKiFXklk/EZtb+famXQtd9NUhsSW9bElJLLFWcGMNfUx3pUM="
+ ],
+ "priority": [
+ "100"
+ ]
+ }
+ },
+ {
+ "id": "a0250b47-b4d2-4b6a-91cf-dcc6de692e9f",
+ "name": "rsa-enc-generated",
+ "providerId": "rsa-enc-generated",
+ "subComponents": {},
+ "config": {
+ "privateKey": [
+ "MIIEowIBAAKCAQEAwex1W8+cQjX7JH80bdi8AcK27TGFNzoWdQ9b5MjPPj03MOKgSlGjZZw/1R9wlgK3xJ8QdRFEsXnGiZMqPqFhGwXrjA0Sc58fuOOGGlX50YrMFpCgC9wAMMZIIgul1rZpF9GwbcQV+YtzDOcHWfwj7duwyckZVPoMoSoI7/5/r+JJH2wG+d9DN0dmxvN2IsO4FYPHnAtvbksNEfX9ZH5RDCK1bqTyBw0q9/S8gqz0l56Zl9PpcXFleTmtAeUhwgwXpjmPG5aTHNaxFDlOcycScV9uePWtoO6RfavUIxFBUywYo+sYtR2xiCSjTYE3gKm6iAilSemmPXN0CbFzDg5DrQIDAQABAoIBABB5NQ3/0KsaOVOkH7DOJshygUYcfQ/QNiyrCZghi+NiYWAcfFfb4AjHcW+6HD8OC4zfI0+CkEaQTPKOZxoLbPuV8OjEioL6a0AyScfOcmqfww8OqZ3gSj7adTG5MhUPiVVt6XIlpGU+uJ8JuCjnf6jazwWROP7sP+rn7nrusGuhJBu730gwqQBuUOaMr4KbLO+jcM6JSqvvcXeOk/vQRBZqBnhMhJWMRchsOqV4PhtyVUPq1cXCLIEGJ8vzx+wlN/YpaV519YriWvPwCSM1EpcKHqpMuak5VJBKHzUW8rXGIZbHc1VKXniXbJ/WUMc2LmUbQ4Ap/skIAyc2BvkBMekCgYEA91XdFD/5HvrfsI6N+D4/xgRoQFSsncLdSAJMtN+iQlLa1h8M9Yp1Xy+XKMqEYV/2oYc21jUrinfLdSfumDXurxGf7nkMIi3i6YRdaVBosiJHavFQQVmHQ1w40NtNwRDTGI2NO2TQTu1RN7/TtUsxy5Bjzj13bWUp3RK34YEzFQkCgYEAyLeXYqV8L/sAnRuv/kmOEklfp7KwzxttVmEtCOf859M+nK2GxVx95GuyhC3tNQvtyOXJf2gY6vbS9tCRQOijWkkCcd1H3mpFvZfWa2sicepVv5IFOxRIOATLDy4k1WvdxYsazejjZLLnIxJmSW4Ki8ekQqQiKukmTPS8hHR9JoUCgYEAlLyC5XGPK20sZa1kfLtaeIcf9ke1Qm3zyiDv5flyRzYyOX+UuHgaGzKwUSxwLWqbEwoQFQMGew+NP5fS6J/OOGN97NfITymPAmTCE9nyC+WHUy1o2NOw/vYPiLHI8Whfua0uGGCI0F3wcHkgJC7i9AqRqm3WSugCI9rkz2x1vpkCgYB64gN5rmzghyAyD3BpEyk6wtcgOUMMGPOQjb/fkwAAAhF0JLy8+cpNXS4WxHNUJbB3bU82hEm1GFXCK6CyB3ty2/32Lg5A+fkmgN4SN64H5fqHZWN0bw9j1HNpIMwGKZrFxUsswybsUKc3jp022Xr1Zs2Gyyvr73+2X6NGyHaSbQKBgCzDUlzrYviCvA9pHysMuEIVQ6KVmwWQ+XhTCG6T7ZnWOH/sCfJC9WmHCywNJQPyNJs1DzzOPgKu+Tm88oyIm9GkXNZ3UPkw8EUmaQTo0DchfBH3Zvs8Vs6Ay+gqLZUnYFOkLtBRuo2hwOX+43+2Ze2y5F1sxFcmoCUjoRoSLZI3"
+ ],
+ "keyUse": [
+ "ENC"
+ ],
+ "certificate": [
+ "MIICmzCCAYMCBgGYVmI1sTANBgkqhkiG9w0BAQsFADARMQ8wDQYDVQQDDAZtYXN0ZXIwHhcNMjUwNzI5MTMzMDMzWhcNMzUwNzI5MTMzMjEzWjARMQ8wDQYDVQQDDAZtYXN0ZXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDB7HVbz5xCNfskfzRt2LwBwrbtMYU3OhZ1D1vkyM8+PTcw4qBKUaNlnD/VH3CWArfEnxB1EUSxecaJkyo+oWEbBeuMDRJznx+444YaVfnRiswWkKAL3AAwxkgiC6XWtmkX0bBtxBX5i3MM5wdZ/CPt27DJyRlU+gyhKgjv/n+v4kkfbAb530M3R2bG83Yiw7gVg8ecC29uSw0R9f1kflEMIrVupPIHDSr39LyCrPSXnpmX0+lxcWV5Oa0B5SHCDBemOY8blpMc1rEUOU5zJxJxX2549a2g7pF9q9QjEUFTLBij6xi1HbGIJKNNgTeAqbqICKVJ6aY9c3QJsXMODkOtAgMBAAEwDQYJKoZIhvcNAQELBQADggEBAGmvYsQOoGKZQESAG00Gh985N9BODeDDENWEnf3t1Q1BBr7VPMak7EpVXrqdkSKy9O/jDHPjFbN9ULWp3NpWRJrqyRmvoelSwvHszcjG6GA2U5r/NDjCPnT/mTqd5VG0sMieE3CJZF223PLf2MpxyCYxfkKv3mPVWQZu3Y14qMsmoVO8lE/Lo+KF05YlqCuW5xjA7Ak7YUjbof0mrmYoet9gLzrG16PlFBkdMca2DO8ZHqWLv0T2k4kj5XFE8jKQhZcIqu7jVIqnccCCKPr/72rUdumWtRyabqiT9gC6jTlA18x3OSAUiRcb7mu44v8a+PSw2VILj7Hn1BLnD0Lo5xg="
+ ],
+ "priority": [
+ "100"
+ ],
+ "algorithm": [
+ "RSA-OAEP"
+ ]
+ }
+ },
+ {
+ "id": "8dc8e9e1-3a4c-49e0-bc9c-24441ecec46b",
+ "name": "aes-generated",
+ "providerId": "aes-generated",
+ "subComponents": {},
+ "config": {
+ "kid": [
+ "5e171541-e588-4f99-b026-f9ab6cb05ce3"
+ ],
+ "secret": [
+ "-_aEJe5lxo2XErtUAXWo4Q"
+ ],
+ "priority": [
+ "100"
+ ]
+ }
+ }
+ ]
+ },
+ "internationalizationEnabled": false,
+ "supportedLocales": [],
+ "authenticationFlows": [
+ {
+ "id": "47f09920-7629-4280-a713-3db23f3f352e",
+ "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": "7bbbb4ba-c941-4b8a-aec0-5d0608485507",
+ "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": "a51742d8-4cb4-468d-ad01-e9e69c058c51",
+ "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": "fd34e419-438e-47b6-ad88-b0082da91389",
+ "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": "dd37ecaf-ed24-431f-b190-ca71fafd5ccf",
+ "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": "ea56f157-771c-4690-8110-880de0072d6c",
+ "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": "1f400a48-1746-48ba-a433-035d77f4d4cf",
+ "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": "40641a1a-b632-478f-9969-0baf713faabc",
+ "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": "6c74146e-ae91-4e80-8400-98e992b8e9ad",
+ "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": "bc69c83e-3808-43bd-8153-231aaa8feb95",
+ "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": "c41a4373-c39a-4656-bd10-c9d38cdda06f",
+ "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": "14d0c0c2-a11c-4edc-ab7e-71a6c5d36f1d",
+ "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": "d7082091-9db1-4707-9218-1e71740b020c",
+ "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": "e1441209-a5e1-40a5-8b39-52c4e29c2563",
+ "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": "aa5d27b1-bd9e-443e-9864-0a2a211d940f",
+ "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": "319dfd5b-7393-4ba6-b3ea-9380f951de73",
+ "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
+ },
+ {
+ "authenticator": "registration-terms-and-conditions",
+ "authenticatorFlow": false,
+ "requirement": "DISABLED",
+ "priority": 70,
+ "autheticatorFlow": false,
+ "userSetupAllowed": false
+ }
+ ]
+ },
+ {
+ "id": "40e62256-7121-4c48-9af1-90b07c1d09c5",
+ "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": "6b80e48e-97fa-44ae-9ae2-4993224df321",
+ "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": "2cdd0e7b-5f2e-4a78-8565-8462d23b4972",
+ "alias": "create unique user config",
+ "config": {
+ "require.password.update.after.registration": "false"
+ }
+ },
+ {
+ "id": "62f40ea5-c91f-4aaa-9403-3e10ba76a4ce",
+ "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",
+ "parRequestUriLifespan": "60",
+ "cibaInterval": "5",
+ "realmReusableOtpCode": "false"
+ },
+ "keycloakVersion": "23.0.3",
+ "userManagedAccessAllowed": false,
+ "clientProfiles": {
+ "profiles": []
+ },
+ "clientPolicies": {
+ "policies": []
+ }
+}
\ No newline at end of file
diff --git a/.infra/postgres/init/bookdb_dump.sql b/.infra/postgres/init/bookdb_dump.sql
new file mode 100644
index 0000000..fbce87f
--- /dev/null
+++ b/.infra/postgres/init/bookdb_dump.sql
@@ -0,0 +1,234 @@
+--
+-- PostgreSQL database dump
+--
+CREATE DATABASE bookdb;
+\connect bookdb;
+-- Dumped from database version 17.4
+-- Dumped by pg_dump version 17.4
+
+-- Started on 2025-08-12 17:16:14
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET idle_in_transaction_session_timeout = 0;
+SET transaction_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SELECT pg_catalog.set_config('search_path', '', false);
+SET check_function_bodies = false;
+SET xmloption = content;
+SET client_min_messages = warning;
+SET row_security = off;
+
+SET default_tablespace = '';
+
+SET default_table_access_method = heap;
+
+--
+-- TOC entry 217 (class 1259 OID 25559)
+-- Name: book; Type: TABLE; Schema: public; Owner: postgres
+--
+
+CREATE TABLE public.book (
+ author character varying(255),
+ description character varying(255),
+ isbn character varying(255) NOT NULL,
+ title character varying(255) NOT NULL,
+ url character varying(255) NOT NULL
+);
+
+
+ALTER TABLE public.book OWNER TO postgres;
+
+--
+-- TOC entry 218 (class 1259 OID 25564)
+-- Name: book_category; Type: TABLE; Schema: public; Owner: postgres
+--
+
+CREATE TABLE public.book_category (
+ category_id bigint NOT NULL,
+ book_id character varying(255) NOT NULL
+);
+
+
+ALTER TABLE public.book_category OWNER TO postgres;
+
+--
+-- TOC entry 219 (class 1259 OID 25567)
+-- Name: book_reviews_ids; Type: TABLE; Schema: public; Owner: postgres
+--
+
+CREATE TABLE public.book_reviews_ids (
+ reviews_ids bigint,
+ book_isbn character varying(255) NOT NULL
+);
+
+
+ALTER TABLE public.book_reviews_ids OWNER TO postgres;
+
+--
+-- TOC entry 220 (class 1259 OID 25570)
+-- Name: category; Type: TABLE; Schema: public; Owner: postgres
+--
+
+CREATE TABLE public.category (
+ id bigint NOT NULL,
+ name character varying(255) NOT NULL
+);
+
+
+ALTER TABLE public.category OWNER TO postgres;
+
+--
+-- TOC entry 221 (class 1259 OID 25573)
+-- Name: category_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres
+--
+
+ALTER TABLE public.category ALTER COLUMN id ADD GENERATED BY DEFAULT AS IDENTITY (
+ SEQUENCE NAME public.category_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1
+);
+
+
+--
+-- TOC entry 4865 (class 0 OID 25559)
+-- Dependencies: 217
+-- Data for Name: book; Type: TABLE DATA; Schema: public; Owner: postgres
+--
+
+COPY public.book (author, description, isbn, title, url) FROM stdin;
+J.K. Rowling A young wizard embarks on an adventure. 978-0747532743 Harry Potter and the Philosopher's Stone http://example.com/hp1
+J.R.R. Tolkien An epic fantasy journey through Middle-earth. 978-0618260300 The Lord of the Rings http://example.com/lotr
+Harper Lee A novel about racial injustice in the Deep South. 978-0061120084 To Kill a Mockingbird http://example.com/tkam
+F. Scott Fitzgerald A story of wealth and excess in the Jazz Age. 978-0743273565 The Great Gatsby http://example.com/gatsby
+\.
+
+
+--
+-- TOC entry 4866 (class 0 OID 25564)
+-- Dependencies: 218
+-- Data for Name: book_category; Type: TABLE DATA; Schema: public; Owner: postgres
+--
+
+COPY public.book_category (category_id, book_id) FROM stdin;
+1 978-0747532743
+1 978-0061120084
+2 978-0618260300
+3 978-0743273565
+\.
+
+
+--
+-- TOC entry 4867 (class 0 OID 25567)
+-- Dependencies: 219
+-- Data for Name: book_reviews_ids; Type: TABLE DATA; Schema: public; Owner: postgres
+--
+
+COPY public.book_reviews_ids (reviews_ids, book_isbn) FROM stdin;
+\.
+
+
+--
+-- TOC entry 4868 (class 0 OID 25570)
+-- Dependencies: 220
+-- Data for Name: category; Type: TABLE DATA; Schema: public; Owner: postgres
+--
+
+COPY public.category (id, name) FROM stdin;
+1 science
+2 music
+3 art
+\.
+
+
+--
+-- TOC entry 4875 (class 0 OID 0)
+-- Dependencies: 221
+-- Name: category_id_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres
+--
+
+SELECT pg_catalog.setval('public.category_id_seq', 4, true);
+
+
+--
+-- TOC entry 4712 (class 2606 OID 25575)
+-- Name: book_category book_category_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
+--
+
+ALTER TABLE ONLY public.book_category
+ ADD CONSTRAINT book_category_pkey PRIMARY KEY (category_id, book_id);
+
+
+--
+-- TOC entry 4708 (class 2606 OID 25577)
+-- Name: book book_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
+--
+
+ALTER TABLE ONLY public.book
+ ADD CONSTRAINT book_pkey PRIMARY KEY (isbn);
+
+
+--
+-- TOC entry 4710 (class 2606 OID 25579)
+-- Name: book book_url_key; Type: CONSTRAINT; Schema: public; Owner: postgres
+--
+
+ALTER TABLE ONLY public.book
+ ADD CONSTRAINT book_url_key UNIQUE (url);
+
+
+--
+-- TOC entry 4714 (class 2606 OID 25581)
+-- Name: category category_name_key; Type: CONSTRAINT; Schema: public; Owner: postgres
+--
+
+ALTER TABLE ONLY public.category
+ ADD CONSTRAINT category_name_key UNIQUE (name);
+
+
+--
+-- TOC entry 4716 (class 2606 OID 25583)
+-- Name: category category_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
+--
+
+ALTER TABLE ONLY public.category
+ ADD CONSTRAINT category_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 4717 (class 2606 OID 25584)
+-- Name: book_category fkam8llderp40mvbbwceqpu6l2s; Type: FK CONSTRAINT; Schema: public; Owner: postgres
+--
+
+ALTER TABLE ONLY public.book_category
+ ADD CONSTRAINT fkam8llderp40mvbbwceqpu6l2s FOREIGN KEY (category_id) REFERENCES public.category(id);
+
+
+--
+-- TOC entry 4719 (class 2606 OID 25589)
+-- Name: book_reviews_ids fkdaf05hf6k7g06uqv46k9bp9ef; Type: FK CONSTRAINT; Schema: public; Owner: postgres
+--
+
+ALTER TABLE ONLY public.book_reviews_ids
+ ADD CONSTRAINT fkdaf05hf6k7g06uqv46k9bp9ef FOREIGN KEY (book_isbn) REFERENCES public.book(isbn);
+
+
+--
+-- TOC entry 4718 (class 2606 OID 25594)
+-- Name: book_category fknyegcbpvce2mnmg26h0i856fd; Type: FK CONSTRAINT; Schema: public; Owner: postgres
+--
+
+ALTER TABLE ONLY public.book_category
+ ADD CONSTRAINT fknyegcbpvce2mnmg26h0i856fd FOREIGN KEY (book_id) REFERENCES public.book(isbn);
+
+
+-- Completed on 2025-08-12 17:16:14
+
+--
+-- PostgreSQL database dump complete
+--
+
diff --git a/.infra/postgres/init/reviewdb_dump.sql b/.infra/postgres/init/reviewdb_dump.sql
new file mode 100644
index 0000000..53a6c57
--- /dev/null
+++ b/.infra/postgres/init/reviewdb_dump.sql
@@ -0,0 +1,219 @@
+--
+-- PostgreSQL database dump
+--
+CREATE DATABASE reviewdb;
+\connect reviewdb;
+-- Dumped from database version 17.4
+-- Dumped by pg_dump version 17.4
+
+-- Started on 2025-08-12 17:17:25
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET idle_in_transaction_session_timeout = 0;
+SET transaction_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SELECT pg_catalog.set_config('search_path', '', false);
+SET check_function_bodies = false;
+SET xmloption = content;
+SET client_min_messages = warning;
+SET row_security = off;
+
+SET default_tablespace = '';
+
+SET default_table_access_method = heap;
+
+--
+-- TOC entry 220 (class 1259 OID 49892)
+-- Name: comment; Type: TABLE; Schema: public; Owner: postgres
+--
+
+CREATE TABLE public.comment (
+ id bigint NOT NULL,
+ review_date timestamp(6) without time zone NOT NULL,
+ book_id character varying(255) NOT NULL,
+ content character varying(255) NOT NULL,
+ user_id character varying(255) NOT NULL
+);
+
+
+ALTER TABLE public.comment OWNER TO postgres;
+
+--
+-- TOC entry 219 (class 1259 OID 49891)
+-- Name: comment_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres
+--
+
+ALTER TABLE public.comment ALTER COLUMN id ADD GENERATED BY DEFAULT AS IDENTITY (
+ SEQUENCE NAME public.comment_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1
+);
+
+
+--
+-- TOC entry 222 (class 1259 OID 49900)
+-- Name: rate; Type: TABLE; Schema: public; Owner: postgres
+--
+
+CREATE TABLE public.rate (
+ score integer NOT NULL,
+ id bigint NOT NULL,
+ review_date timestamp(6) without time zone NOT NULL,
+ book_id character varying(255) NOT NULL,
+ user_id character varying(255) NOT NULL
+);
+
+
+ALTER TABLE public.rate OWNER TO postgres;
+
+--
+-- TOC entry 221 (class 1259 OID 49899)
+-- Name: rate_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres
+--
+
+ALTER TABLE public.rate ALTER COLUMN id ADD GENERATED BY DEFAULT AS IDENTITY (
+ SEQUENCE NAME public.rate_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1
+);
+
+
+--
+-- TOC entry 218 (class 1259 OID 33190)
+-- Name: review; Type: TABLE; Schema: public; Owner: postgres
+--
+
+CREATE TABLE public.review (
+ id bigint NOT NULL,
+ book_id character varying(255) NOT NULL,
+ comment character varying(255),
+ rating integer NOT NULL,
+ review_date timestamp(6) without time zone NOT NULL,
+ user_id character varying(255) NOT NULL
+);
+
+
+ALTER TABLE public.review OWNER TO postgres;
+
+--
+-- TOC entry 217 (class 1259 OID 33189)
+-- Name: review_id_seq; Type: SEQUENCE; Schema: public; Owner: postgres
+--
+
+ALTER TABLE public.review ALTER COLUMN id ADD GENERATED BY DEFAULT AS IDENTITY (
+ SEQUENCE NAME public.review_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1
+);
+
+
+--
+-- TOC entry 4859 (class 0 OID 49892)
+-- Dependencies: 220
+-- Data for Name: comment; Type: TABLE DATA; Schema: public; Owner: postgres
+--
+
+COPY public.comment (id, review_date, book_id, content, user_id) FROM stdin;
+4 2025-08-11 01:25:26.809866 978-0747532743 Test comment 88b95c38-999f-4ddd-926b-3169c95350d5
+5 2025-08-11 01:28:59.426721 978-0747532743 Test comment 88b95c38-999f-4ddd-926b-3169c95350d5
+\.
+
+
+--
+-- TOC entry 4861 (class 0 OID 49900)
+-- Dependencies: 222
+-- Data for Name: rate; Type: TABLE DATA; Schema: public; Owner: postgres
+--
+
+COPY public.rate (score, id, review_date, book_id, user_id) FROM stdin;
+\.
+
+
+--
+-- TOC entry 4857 (class 0 OID 33190)
+-- Dependencies: 218
+-- Data for Name: review; Type: TABLE DATA; Schema: public; Owner: postgres
+--
+
+COPY public.review (id, book_id, comment, rating, review_date, user_id) FROM stdin;
+1 978-0747532743 comment1 5 2025-03-24 20:10:05.499705 user1
+8 978-0747532743 comment2 1 2025-03-28 17:22:23.176307 user2
+10 978-0747532743 comment2 5 2025-03-28 17:29:42.363614 user1
+12 978-0747532743 comment2 5 2025-03-28 19:54:53.657112 user1
+13 978-0747532743 comment2 5 2025-03-28 19:55:50.912027 user1
+14 978-0747532743 comment2 5 2025-03-28 19:57:54.441261 user1
+15 978-0747532743 comment2 5 2025-03-28 20:06:52.645619 user1
+\.
+
+
+--
+-- TOC entry 4867 (class 0 OID 0)
+-- Dependencies: 219
+-- Name: comment_id_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres
+--
+
+SELECT pg_catalog.setval('public.comment_id_seq', 6, true);
+
+
+--
+-- TOC entry 4868 (class 0 OID 0)
+-- Dependencies: 221
+-- Name: rate_id_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres
+--
+
+SELECT pg_catalog.setval('public.rate_id_seq', 1, false);
+
+
+--
+-- TOC entry 4869 (class 0 OID 0)
+-- Dependencies: 217
+-- Name: review_id_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres
+--
+
+SELECT pg_catalog.setval('public.review_id_seq', 15, true);
+
+
+--
+-- TOC entry 4708 (class 2606 OID 49898)
+-- Name: comment comment_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
+--
+
+ALTER TABLE ONLY public.comment
+ ADD CONSTRAINT comment_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 4710 (class 2606 OID 49906)
+-- Name: rate rate_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
+--
+
+ALTER TABLE ONLY public.rate
+ ADD CONSTRAINT rate_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 4706 (class 2606 OID 33196)
+-- Name: review review_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
+--
+
+ALTER TABLE ONLY public.review
+ ADD CONSTRAINT review_pkey PRIMARY KEY (id);
+
+
+-- Completed on 2025-08-12 17:17:25
+
+--
+-- PostgreSQL database dump complete
+--
+
diff --git a/.infra/postgres/init/userdb_dump.sql b/.infra/postgres/init/userdb_dump.sql
new file mode 100644
index 0000000..cbf3e2b
--- /dev/null
+++ b/.infra/postgres/init/userdb_dump.sql
@@ -0,0 +1,141 @@
+--
+-- PostgreSQL database dump
+--
+CREATE DATABASE userdb;
+\connect userdb;
+-- Dumped from database version 17.4
+-- Dumped by pg_dump version 17.4
+
+-- Started on 2025-08-12 17:17:52
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET idle_in_transaction_session_timeout = 0;
+SET transaction_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SELECT pg_catalog.set_config('search_path', '', false);
+SET check_function_bodies = false;
+SET xmloption = content;
+SET client_min_messages = warning;
+SET row_security = off;
+
+SET default_tablespace = '';
+
+SET default_table_access_method = heap;
+
+--
+-- TOC entry 217 (class 1259 OID 49907)
+-- Name: user_reviews_ids; Type: TABLE; Schema: public; Owner: postgres
+--
+
+CREATE TABLE public.user_reviews_ids (
+ reviews_ids bigint,
+ user_keycloak_id character varying(255) NOT NULL
+);
+
+
+ALTER TABLE public.user_reviews_ids OWNER TO postgres;
+
+--
+-- TOC entry 218 (class 1259 OID 49910)
+-- Name: user_roles; Type: TABLE; Schema: public; Owner: postgres
+--
+
+CREATE TABLE public.user_roles (
+ keycloak_id character varying(255) NOT NULL,
+ roles character varying(255),
+ CONSTRAINT user_roles_roles_check CHECK (((roles)::text = ANY ((ARRAY['USER'::character varying, 'ADMIN'::character varying, 'MODERATOR'::character varying])::text[])))
+);
+
+
+ALTER TABLE public.user_roles OWNER TO postgres;
+
+--
+-- TOC entry 219 (class 1259 OID 49916)
+-- Name: user_table; Type: TABLE; Schema: public; Owner: postgres
+--
+
+CREATE TABLE public.user_table (
+ keycloak_id character varying(255) NOT NULL,
+ username character varying(255) NOT NULL
+);
+
+
+ALTER TABLE public.user_table OWNER TO postgres;
+
+--
+-- TOC entry 4854 (class 0 OID 49907)
+-- Dependencies: 217
+-- Data for Name: user_reviews_ids; Type: TABLE DATA; Schema: public; Owner: postgres
+--
+
+COPY public.user_reviews_ids (reviews_ids, user_keycloak_id) FROM stdin;
+\.
+
+
+--
+-- TOC entry 4855 (class 0 OID 49910)
+-- Dependencies: 218
+-- Data for Name: user_roles; Type: TABLE DATA; Schema: public; Owner: postgres
+--
+
+COPY public.user_roles (keycloak_id, roles) FROM stdin;
+88b95c38-999f-4ddd-926b-3169c95350d5 ADMIN
+88b95c38-999f-4ddd-926b-3169c95350d5 MODERATOR
+\.
+
+
+--
+-- TOC entry 4856 (class 0 OID 49916)
+-- Dependencies: 219
+-- Data for Name: user_table; Type: TABLE DATA; Schema: public; Owner: postgres
+--
+
+COPY public.user_table (keycloak_id, username) FROM stdin;
+88b95c38-999f-4ddd-926b-3169c95350d5 eugene
+\.
+
+
+--
+-- TOC entry 4704 (class 2606 OID 49922)
+-- Name: user_table user_table_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
+--
+
+ALTER TABLE ONLY public.user_table
+ ADD CONSTRAINT user_table_pkey PRIMARY KEY (keycloak_id);
+
+
+--
+-- TOC entry 4706 (class 2606 OID 49924)
+-- Name: user_table user_table_username_key; Type: CONSTRAINT; Schema: public; Owner: postgres
+--
+
+ALTER TABLE ONLY public.user_table
+ ADD CONSTRAINT user_table_username_key UNIQUE (username);
+
+
+--
+-- TOC entry 4708 (class 2606 OID 49930)
+-- Name: user_roles fk4ibfcuv76h7uee0wh6yiputje; Type: FK CONSTRAINT; Schema: public; Owner: postgres
+--
+
+ALTER TABLE ONLY public.user_roles
+ ADD CONSTRAINT fk4ibfcuv76h7uee0wh6yiputje FOREIGN KEY (keycloak_id) REFERENCES public.user_table(keycloak_id);
+
+
+--
+-- TOC entry 4707 (class 2606 OID 49925)
+-- Name: user_reviews_ids fk8rtwyoamdsnpelwvbpw8p19rp; Type: FK CONSTRAINT; Schema: public; Owner: postgres
+--
+
+ALTER TABLE ONLY public.user_reviews_ids
+ ADD CONSTRAINT fk8rtwyoamdsnpelwvbpw8p19rp FOREIGN KEY (user_keycloak_id) REFERENCES public.user_table(keycloak_id);
+
+
+-- Completed on 2025-08-12 17:17:53
+
+--
+-- PostgreSQL database dump complete
+--
+
diff --git a/docker-compose.yml b/docker-compose.yml
new file mode 100644
index 0000000..c4cce20
--- /dev/null
+++ b/docker-compose.yml
@@ -0,0 +1,134 @@
+services:
+ zookeeper:
+ container_name: mflibrary_zookeeper
+ image: confluentinc/cp-zookeeper:7.5.0
+ ports:
+ - "2181:2181"
+ networks:
+ - mflibrary-network
+ environment:
+ ZOOKEEPER_CLIENT_PORT: 2181
+ ZOOKEEPER_TICK_TIME: 2000
+
+ kafka:
+ container_name: mflibrary_kafka
+ image: confluentinc/cp-kafka:7.5.0
+ ports:
+ - "29092:29092" # for localhost access
+ - "9092:9092" # access inter-container
+ networks:
+ - mflibrary-network
+ environment:
+ KAFKA_BROKER_ID: 1
+ KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
+ # Two listeners, two ports
+ KAFKA_LISTENERS: INSIDE://:9092,OUTSIDE://:29092
+ KAFKA_ADVERTISED_LISTENERS: INSIDE://kafka:9092,OUTSIDE://localhost:29092
+ KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
+ # Kafka uses the "INSIDE" listener for inter-broker communication
+ KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE
+ KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
+ depends_on:
+ - zookeeper
+
+ keycloak:
+ container_name: mflibrary_keycloak
+ image: quay.io/keycloak/keycloak:24.0.1
+ ports:
+ - "8085:8080"
+ networks:
+ - mflibrary-network
+ environment:
+ KEYCLOAK_ADMIN: admin
+ KEYCLOAK_ADMIN_PASSWORD: admin
+ command: start-dev --import-realm
+ volumes:
+ - ./.infra/keycloak/app-mflibrary-realm-export.json:/opt/keycloak/data/import/app-mflibrary-realm-export.json
+ - ./.infra/keycloak/master-realm-export.json:/opt/keycloak/data/import/master-realm-export.json
+
+ postgres:
+ container_name: mflibrary_postgres
+ image: postgres:17-alpine
+ ports:
+ - "5432:5432"
+ networks:
+ - mflibrary-network
+ environment:
+ POSTGRES_USER: postgres
+ POSTGRES_PASSWORD: postgres
+ volumes:
+ - ./.infra/postgres/init:/docker-entrypoint-initdb.d
+
+ registry-service:
+ container_name: mflibrary_registry-service
+ build: ./services/registry-service
+ ports:
+ - "8761:8761"
+ networks:
+ - mflibrary-network
+ environment:
+ - SPRING_PROFILES_ACTIVE=docker
+ depends_on:
+ - kafka
+ - keycloak
+
+ api-gateway:
+ container_name: mflibrary_api-gateway
+ build: ./services/api-gateway
+ ports:
+ - "8765:8765"
+ networks:
+ - mflibrary-network
+ environment:
+ - SPRING_PROFILES_ACTIVE=docker
+ depends_on:
+ - registry-service
+
+ user-service:
+ container_name: mflibrary_user-service
+ build: ./services/user-service
+ ports:
+ - "8081:8081"
+ networks:
+ - mflibrary-network
+ environment:
+ - SPRING_PROFILES_ACTIVE=docker
+ depends_on:
+ - kafka
+ - keycloak
+ - postgres
+ - registry-service
+
+ book-service:
+ container_name: mflibrary_book-service
+ build: ./services/book-service
+ ports:
+ - "8082:8082"
+ networks:
+ - mflibrary-network
+ environment:
+ - SPRING_PROFILES_ACTIVE=docker
+ depends_on:
+ - kafka
+ - keycloak
+ - postgres
+ - registry-service
+
+ review-service:
+ container_name: mflibrary_review-service
+ build: ./services/review-service
+ ports:
+ - "8083:8083"
+ networks:
+ - mflibrary-network
+ environment:
+ - SPRING_PROFILES_ACTIVE=docker
+ depends_on:
+ - kafka
+ - keycloak
+ - postgres
+ - registry-service
+
+networks:
+ mflibrary-network:
+ driver: bridge
\ No newline at end of file