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