{"templateId":"markdown","versions":[{"version":"v1.40","label":"v1.40 STS","link":"/products/custody/identity-and-access/sso/identity-federation-guide","default":true,"active":false,"folderId":"c15a2701"},{"version":"v1.39","label":"v1.39 STS","link":"/products/custody/v1.39/identity-and-access/sso/identity-federation-guide","default":false,"active":false,"folderId":"c15a2701"},{"version":"v1.38","label":"v1.38 STS","link":"/products/custody/v1.38/identity-and-access/sso/identity-federation-guide","default":false,"active":true,"folderId":"c15a2701"},{"version":"v1.34","label":"v1.34 LTS","link":"/products/custody/v1.34/identity-and-access/sso/identity-federation-guide","default":false,"active":false,"folderId":"c15a2701"},{"version":"v1.26","label":"v1.26 LTS","link":"/products/custody/v1.26/identity-and-access/sso/identity-federation-guide","default":false,"active":false,"folderId":"c15a2701"},{"version":"v1.19","label":"v1.19 LTS","link":"/products/custody/v1.19/identity-and-access/sso/identity-federation-guide","default":false,"active":false,"folderId":"c15a2701"},{"version":"v1.15","label":"v1.15 LTS","link":"/products/custody/v1.15/identity-and-access/sso/identity-federation-guide","default":false,"active":false,"folderId":"c15a2701"}],"sharedDataIds":{"sidebar":"sidebar-products/custody/@v1.15/sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":[]},"type":"markdown"},"seo":{"title":"Plan identity federation","description":"User guides, API reference, and support resources.","siteUrl":"https://docs.ripple.com","lang":"en-US","llmstxt":{"hide":false,"sections":[{"title":"Table of contents","includeFiles":["**/*"],"excludeFiles":[]}],"excludeFiles":[]}},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"plan-identity-federation","__idx":0},"children":["Plan identity federation"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Use this page to plan federated identity before configuring Keycloak or updating users."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"planning-checklist","__idx":1},"children":["Planning checklist"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Decision"},"children":["Decision"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"What to define"},"children":["What to define"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["OIDC provider"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["The external identity provider, its discovery endpoint, and network connectivity from Keycloak."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Provider alias"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["A unique lower-case alias in Keycloak. This value must match the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["providerId"]}," in Custody user ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["loginIds"]},"."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["User identifier"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["The claim that uniquely identifies each user. Prefer a stable claim that does not change when an email address changes."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Scopes"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Request the claims needed by your mappers. OIDC requires ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["openid"]},"; ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["profile"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["email"]}," are commonly needed for username and email claims."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Required claims"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Optional claim checks that restrict access to users assigned to the Custody application in your identity provider."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["User mapping"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Existing Custody users must have ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["loginIds"]}," that match the identifier Keycloak emits after mapping."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Session policy"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Keycloak session lifetimes, concurrent-session controls, and upstream IdP logout behavior."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Secrets"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Where client secrets are stored, how they are rotated, and how Keycloak and deployment secrets stay synchronized."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Rollout"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Test users, fallback access, operator responsibilities, and production verification."]}]}]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"identifier-design","__idx":2},"children":["Identifier design"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The most important SSO design choice is the identifier that links the external identity provider to a Custody user."]},{"$$mdtype":"Tag","name":"Diagram","attributes":{"data-language":"mermaid","diagramType":"mermaid","diagramSource":"flowchart LR\n    Claims[\"OIDC claims from IdP\"] --> Mappers[\"Keycloak provider mappers\"]\n    Mappers --> Token[\"Keycloak-issued token\"]\n    Token --> LoginId[\"Custody loginId lookup\"]\n    LoginId --> User[\"Custody user record\"]\n","diagramHtml":"<svg id=\"diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0\" width=\"100%\" xmlns=\"http://www.w3.org/2000/svg\" class=\"flowchart\" style=\"max-width: 1330.609375px;\" viewBox=\"0 0 1330.609375 70\" role=\"graphics-document document\" aria-roledescription=\"flowchart-v2\"><style>\n    #diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 foreignObject {\n      overflow: visible;\n    }\n  </style><style>#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0{font-family:\"Redocly Mermaid Sans\",Arial,\"Liberation Sans\",Arimo,Helvetica,\"Redocly Mermaid CJK\",sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 .error-icon{fill:#552222;}#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 .error-text{fill:#552222;stroke:#552222;}#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 .edge-thickness-normal{stroke-width:1px;}#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 .edge-thickness-thick{stroke-width:3.5px;}#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 .edge-pattern-solid{stroke-dasharray:0;}#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 .edge-thickness-invisible{stroke-width:0;fill:none;}#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 .edge-pattern-dashed{stroke-dasharray:3;}#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 .edge-pattern-dotted{stroke-dasharray:2;}#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 .marker{fill:#333333;stroke:#333333;}#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 .marker.cross{stroke:#333333;}#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 svg{font-family:\"Redocly Mermaid Sans\",Arial,\"Liberation Sans\",Arimo,Helvetica,\"Redocly Mermaid CJK\",sans-serif;font-size:16px;}#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 p{margin:0;}#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 .label{font-family:\"Redocly Mermaid Sans\",Arial,\"Liberation Sans\",Arimo,Helvetica,\"Redocly Mermaid CJK\",sans-serif;color:#333;}#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 .cluster-label text{fill:#333;}#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 .cluster-label span{color:#333;}#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 .cluster-label span p{background-color:transparent;}#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 .label text,#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 span{fill:#333;color:#333;}#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 .node rect,#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 .node circle,#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 .node ellipse,#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 .node polygon,#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 .rough-node .label text,#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 .node .label text,#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 .image-shape .label,#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 .icon-shape .label{text-anchor:middle;}#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 .rough-node .label,#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 .node .label,#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 .image-shape .label,#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 .icon-shape .label{text-align:center;}#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 .node.clickable{cursor:pointer;}#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 .arrowheadPath{fill:#333333;}#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 .edgePath .path{stroke:#333333;stroke-width:1px;}#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 .flowchart-link{stroke:#333333;fill:none;}#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 .cluster text{fill:#333;}#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 .cluster span{color:#333;}#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"Redocly Mermaid Sans\",Arial,\"Liberation Sans\",Arimo,Helvetica,\"Redocly Mermaid CJK\",sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 rect.text{fill:none;stroke-width:0;}#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 .icon-shape,#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 .icon-shape p,#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 .icon-shape .label rect,#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 .node .neo-node{stroke:#9370DB;}#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 [data-look=\"neo\"].node rect,#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 [data-look=\"neo\"].cluster rect,#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 [data-look=\"neo\"].node polygon{stroke:#9370DB;filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 [data-look=\"neo\"].swimlane.cluster rect{filter:none;}#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 [data-look=\"neo\"].node path{stroke:#9370DB;stroke-width:1px;}#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 [data-look=\"neo\"].node .outer-path{filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 [data-look=\"neo\"].node .neo-line path{stroke:#9370DB;filter:none;}#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 [data-look=\"neo\"].node circle{stroke:#9370DB;filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 [data-look=\"neo\"].node circle .state-start{fill:#000000;}#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 [data-look=\"neo\"].icon-shape .icon{fill:#9370DB;filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 [data-look=\"neo\"].icon-shape .icon-neo path{stroke:#9370DB;filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0 :root{--mermaid-font-family:\"Redocly Mermaid Sans\",Arial,\"Liberation Sans\",Arimo,Helvetica,\"Redocly Mermaid CJK\",sans-serif;}</style><g><marker id=\"diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0_flowchart-v2-pointEnd\" class=\"marker flowchart-v2\" viewBox=\"0 0 10 10\" refX=\"5\" refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"8\" markerHeight=\"8\" orient=\"auto\"><path d=\"M 0 0 L 10 5 L 0 10 z\" class=\"arrowMarkerPath\" style=\"stroke-width: 1; stroke-dasharray: 1, 0;\"></path></marker><marker id=\"diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0_flowchart-v2-pointStart\" class=\"marker flowchart-v2\" viewBox=\"0 0 10 10\" refX=\"4.5\" refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"8\" markerHeight=\"8\" orient=\"auto\"><path d=\"M 0 5 L 10 10 L 10 0 z\" class=\"arrowMarkerPath\" style=\"stroke-width: 1; stroke-dasharray: 1, 0;\"></path></marker><marker id=\"diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0_flowchart-v2-pointEnd-margin\" class=\"marker flowchart-v2\" viewBox=\"0 0 11.5 14\" refX=\"11.5\" refY=\"7\" markerUnits=\"userSpaceOnUse\" markerWidth=\"10.5\" markerHeight=\"14\" orient=\"auto\"><path d=\"M 0 0 L 11.5 7 L 0 14 z\" class=\"arrowMarkerPath\" style=\"stroke-width: 0; stroke-dasharray: 1, 0;\"></path></marker><marker id=\"diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0_flowchart-v2-pointStart-margin\" class=\"marker flowchart-v2\" viewBox=\"0 0 11.5 14\" refX=\"1\" refY=\"7\" markerUnits=\"userSpaceOnUse\" markerWidth=\"11.5\" markerHeight=\"14\" orient=\"auto\"><polygon points=\"0,7 11.5,14 11.5,0\" class=\"arrowMarkerPath\" style=\"stroke-width: 0; stroke-dasharray: 1, 0;\"></polygon></marker><marker id=\"diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0_flowchart-v2-circleEnd\" class=\"marker flowchart-v2\" viewBox=\"0 0 10 10\" refX=\"11\" refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"11\" markerHeight=\"11\" orient=\"auto\"><circle cx=\"5\" cy=\"5\" r=\"5\" class=\"arrowMarkerPath\" style=\"stroke-width: 1; stroke-dasharray: 1, 0;\"></circle></marker><marker id=\"diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0_flowchart-v2-circleStart\" class=\"marker flowchart-v2\" viewBox=\"0 0 10 10\" refX=\"-1\" refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"11\" markerHeight=\"11\" orient=\"auto\"><circle cx=\"5\" cy=\"5\" r=\"5\" class=\"arrowMarkerPath\" style=\"stroke-width: 1; stroke-dasharray: 1, 0;\"></circle></marker><marker id=\"diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0_flowchart-v2-circleEnd-margin\" class=\"marker flowchart-v2\" viewBox=\"0 0 10 10\" refY=\"5\" refX=\"12.25\" markerUnits=\"userSpaceOnUse\" markerWidth=\"14\" markerHeight=\"14\" orient=\"auto\"><circle cx=\"5\" cy=\"5\" r=\"5\" class=\"arrowMarkerPath\" style=\"stroke-width: 0; stroke-dasharray: 1, 0;\"></circle></marker><marker id=\"diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0_flowchart-v2-circleStart-margin\" class=\"marker flowchart-v2\" viewBox=\"0 0 10 10\" refX=\"-2\" refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"14\" markerHeight=\"14\" orient=\"auto\"><circle cx=\"5\" cy=\"5\" r=\"5\" class=\"arrowMarkerPath\" style=\"stroke-width: 0; stroke-dasharray: 1, 0;\"></circle></marker><marker id=\"diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0_flowchart-v2-crossEnd\" class=\"marker cross flowchart-v2\" viewBox=\"0 0 11 11\" refX=\"12\" refY=\"5.2\" markerUnits=\"userSpaceOnUse\" markerWidth=\"11\" markerHeight=\"11\" orient=\"auto\"><path d=\"M 1,1 l 9,9 M 10,1 l -9,9\" class=\"arrowMarkerPath\" style=\"stroke-width: 2; stroke-dasharray: 1, 0;\"></path></marker><marker id=\"diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0_flowchart-v2-crossStart\" class=\"marker cross flowchart-v2\" viewBox=\"0 0 11 11\" refX=\"-1\" refY=\"5.2\" markerUnits=\"userSpaceOnUse\" markerWidth=\"11\" markerHeight=\"11\" orient=\"auto\"><path d=\"M 1,1 l 9,9 M 10,1 l -9,9\" class=\"arrowMarkerPath\" style=\"stroke-width: 2; stroke-dasharray: 1, 0;\"></path></marker><marker id=\"diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0_flowchart-v2-crossEnd-margin\" class=\"marker cross flowchart-v2\" viewBox=\"0 0 15 15\" refX=\"17.7\" refY=\"7.5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"12\" markerHeight=\"12\" orient=\"auto\"><path d=\"M 1,1 L 14,14 M 1,14 L 14,1\" class=\"arrowMarkerPath\" style=\"stroke-width: 2.5;\"></path></marker><marker id=\"diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0_flowchart-v2-crossStart-margin\" class=\"marker cross flowchart-v2\" viewBox=\"0 0 15 15\" refX=\"-3.5\" refY=\"7.5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"12\" markerHeight=\"12\" orient=\"auto\"><path d=\"M 1,1 L 14,14 M 1,14 L 14,1\" class=\"arrowMarkerPath\" style=\"stroke-width: 2.5; stroke-dasharray: 1, 0;\"></path></marker><g class=\"root\"><g class=\"clusters\"></g><g class=\"edgePaths\"><path d=\"M222.688,35L226.854,35C231.021,35,239.354,35,247.021,35C254.688,35,261.688,35,265.188,35L268.688,35\" id=\"diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0-L_Claims_Mappers_0\" class=\"edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link\" style=\";\" data-edge=\"true\" data-et=\"edge\" data-id=\"L_Claims_Mappers_0\" data-points=\"W3sieCI6MjIyLjY4NzUsInkiOjM1fSx7IngiOjI0Ny42ODc1LCJ5IjozNX0seyJ4IjoyNzIuNjg3NSwieSI6MzV9XQ==\" data-look=\"classic\" marker-end=\"url(#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0_flowchart-v2-pointEnd)\"></path><path d=\"M526.563,35L530.729,35C534.896,35,543.229,35,550.896,35C558.563,35,565.563,35,569.063,35L572.563,35\" id=\"diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0-L_Mappers_Token_0\" class=\"edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link\" style=\";\" data-edge=\"true\" data-et=\"edge\" data-id=\"L_Mappers_Token_0\" data-points=\"W3sieCI6NTI2LjU2MjUsInkiOjM1fSx7IngiOjU1MS41NjI1LCJ5IjozNX0seyJ4Ijo1NzYuNTYyNSwieSI6MzV9XQ==\" data-look=\"classic\" marker-end=\"url(#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0_flowchart-v2-pointEnd)\"></path><path d=\"M796.656,35L800.823,35C804.99,35,813.323,35,820.99,35C828.656,35,835.656,35,839.156,35L842.656,35\" id=\"diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0-L_Token_LoginId_0\" class=\"edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link\" style=\";\" data-edge=\"true\" data-et=\"edge\" data-id=\"L_Token_LoginId_0\" data-points=\"W3sieCI6Nzk2LjY1NjI1LCJ5IjozNX0seyJ4Ijo4MjEuNjU2MjUsInkiOjM1fSx7IngiOjg0Ni42NTYyNSwieSI6MzV9XQ==\" data-look=\"classic\" marker-end=\"url(#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0_flowchart-v2-pointEnd)\"></path><path d=\"M1068.547,35L1072.714,35C1076.88,35,1085.214,35,1092.88,35C1100.547,35,1107.547,35,1111.047,35L1114.547,35\" id=\"diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0-L_LoginId_User_0\" class=\"edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link\" style=\";\" data-edge=\"true\" data-et=\"edge\" data-id=\"L_LoginId_User_0\" data-points=\"W3sieCI6MTA2OC41NDY4NzUsInkiOjM1fSx7IngiOjEwOTMuNTQ2ODc1LCJ5IjozNX0seyJ4IjoxMTE4LjU0Njg3NSwieSI6MzV9XQ==\" data-look=\"classic\" marker-end=\"url(#diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0_flowchart-v2-pointEnd)\"></path></g><g class=\"edgeLabels\"><g class=\"edgeLabel\"><g class=\"label\" data-id=\"L_Claims_Mappers_0\" transform=\"translate(0, 0)\"><foreignObject width=\"0\" height=\"0\"><div xmlns=\"http://www.w3.org/1999/xhtml\" class=\"labelBkg\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"edgeLabel\"></span></div></foreignObject></g></g><g class=\"edgeLabel\"><g class=\"label\" data-id=\"L_Mappers_Token_0\" transform=\"translate(0, 0)\"><foreignObject width=\"0\" height=\"0\"><div xmlns=\"http://www.w3.org/1999/xhtml\" class=\"labelBkg\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"edgeLabel\"></span></div></foreignObject></g></g><g class=\"edgeLabel\"><g class=\"label\" data-id=\"L_Token_LoginId_0\" transform=\"translate(0, 0)\"><foreignObject width=\"0\" height=\"0\"><div xmlns=\"http://www.w3.org/1999/xhtml\" class=\"labelBkg\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"edgeLabel\"></span></div></foreignObject></g></g><g class=\"edgeLabel\"><g class=\"label\" data-id=\"L_LoginId_User_0\" transform=\"translate(0, 0)\"><foreignObject width=\"0\" height=\"0\"><div xmlns=\"http://www.w3.org/1999/xhtml\" class=\"labelBkg\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"edgeLabel\"></span></div></foreignObject></g></g></g><g class=\"nodes\"><g class=\"node default\" id=\"diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0-flowchart-Claims-0\" data-look=\"classic\" transform=\"translate(115.34375, 35)\"><rect class=\"basic label-container\" style=\"\" x=\"-107.34375\" y=\"-27\" width=\"214.6875\" height=\"54\"></rect><g class=\"label\" style=\"\" transform=\"translate(-77.34375, -12)\"><rect></rect><foreignObject width=\"154.6875\" height=\"24\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"nodeLabel\"><p>OIDC claims from IdP</p></span></div></foreignObject></g></g><g class=\"node default\" id=\"diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0-flowchart-Mappers-1\" data-look=\"classic\" transform=\"translate(399.625, 35)\"><rect class=\"basic label-container\" style=\"\" x=\"-126.9375\" y=\"-27\" width=\"253.875\" height=\"54\"></rect><g class=\"label\" style=\"\" transform=\"translate(-96.9375, -12)\"><rect></rect><foreignObject width=\"193.875\" height=\"24\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"nodeLabel\"><p>Keycloak provider mappers</p></span></div></foreignObject></g></g><g class=\"node default\" id=\"diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0-flowchart-Token-3\" data-look=\"classic\" transform=\"translate(686.609375, 35)\"><rect class=\"basic label-container\" style=\"\" x=\"-110.046875\" y=\"-27\" width=\"220.09375\" height=\"54\"></rect><g class=\"label\" style=\"\" transform=\"translate(-80.046875, -12)\"><rect></rect><foreignObject width=\"160.09375\" height=\"24\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"nodeLabel\"><p>Keycloak-issued token</p></span></div></foreignObject></g></g><g class=\"node default\" id=\"diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0-flowchart-LoginId-5\" data-look=\"classic\" transform=\"translate(957.6015625, 35)\"><rect class=\"basic label-container\" style=\"\" x=\"-110.9453125\" y=\"-27\" width=\"221.890625\" height=\"54\"></rect><g class=\"label\" style=\"\" transform=\"translate(-80.9453125, -12)\"><rect></rect><foreignObject width=\"161.890625\" height=\"24\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"nodeLabel\"><p>Custody loginId lookup</p></span></div></foreignObject></g></g><g class=\"node default\" id=\"diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0-flowchart-User-7\" data-look=\"classic\" transform=\"translate(1220.578125, 35)\"><rect class=\"basic label-container\" style=\"\" x=\"-102.03125\" y=\"-27\" width=\"204.0625\" height=\"54\"></rect><g class=\"label\" style=\"\" transform=\"translate(-72.03125, -12)\"><rect></rect><foreignObject width=\"144.0625\" height=\"24\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"nodeLabel\"><p>Custody user record</p></span></div></foreignObject></g></g></g></g></g><defs><filter id=\"diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0-drop-shadow\" height=\"130%\" width=\"130%\"><feDropShadow dx=\"4\" dy=\"4\" stdDeviation=\"0\" flood-opacity=\"0.06\" flood-color=\"#000000\"></feDropShadow></filter></defs><defs><filter id=\"diagram-e2e4b0dc3f3b55678aa9164eedfa45adc4d7d1420149c0e875b63e5fdc016bc0-drop-shadow-small\" height=\"150%\" width=\"150%\"><feDropShadow dx=\"2\" dy=\"2\" stdDeviation=\"0\" flood-opacity=\"0.06\" flood-color=\"#000000\"></feDropShadow></filter></defs></svg>","diagramHtmlDark":"<svg id=\"diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c\" width=\"100%\" xmlns=\"http://www.w3.org/2000/svg\" class=\"flowchart\" style=\"max-width: 1330.609375px;\" viewBox=\"0 0 1330.609375 70\" role=\"graphics-document document\" aria-roledescription=\"flowchart-v2\"><style>\n    #diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c foreignObject {\n      overflow: visible;\n    }\n  </style><style>#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c{font-family:\"Redocly Mermaid Sans\",Arial,\"Liberation Sans\",Arimo,Helvetica,\"Redocly Mermaid CJK\",sans-serif;font-size:16px;fill:#ccc;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c .error-icon{fill:#a44141;}#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c .error-text{fill:#ddd;stroke:#ddd;}#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c .edge-thickness-normal{stroke-width:1px;}#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c .edge-thickness-thick{stroke-width:3.5px;}#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c .edge-pattern-solid{stroke-dasharray:0;}#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c .edge-thickness-invisible{stroke-width:0;fill:none;}#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c .edge-pattern-dashed{stroke-dasharray:3;}#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c .edge-pattern-dotted{stroke-dasharray:2;}#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c .marker{fill:lightgrey;stroke:lightgrey;}#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c .marker.cross{stroke:lightgrey;}#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c svg{font-family:\"Redocly Mermaid Sans\",Arial,\"Liberation Sans\",Arimo,Helvetica,\"Redocly Mermaid CJK\",sans-serif;font-size:16px;}#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c p{margin:0;}#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c .label{font-family:\"Redocly Mermaid Sans\",Arial,\"Liberation Sans\",Arimo,Helvetica,\"Redocly Mermaid CJK\",sans-serif;color:#ccc;}#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c .cluster-label text{fill:#F9FFFE;}#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c .cluster-label span{color:#F9FFFE;}#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c .cluster-label span p{background-color:transparent;}#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c .label text,#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c span{fill:#ccc;color:#ccc;}#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c .node rect,#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c .node circle,#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c .node ellipse,#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c .node polygon,#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c .node path{fill:#1f2020;stroke:#ccc;stroke-width:1px;}#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c .rough-node .label text,#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c .node .label text,#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c .image-shape .label,#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c .icon-shape .label{text-anchor:middle;}#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c .rough-node .label,#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c .node .label,#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c .image-shape .label,#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c .icon-shape .label{text-align:center;}#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c .node.clickable{cursor:pointer;}#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c .root .anchor path{fill:lightgrey!important;stroke-width:0;stroke:lightgrey;}#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c .arrowheadPath{fill:lightgrey;}#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c .edgePath .path{stroke:lightgrey;stroke-width:1px;}#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c .flowchart-link{stroke:lightgrey;fill:none;}#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c .edgeLabel{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c .edgeLabel p{background-color:hsl(0, 0%, 34.4117647059%);}#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c .edgeLabel rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c .labelBkg{background-color:rgba(87.75, 87.75, 87.75, 0.5);}#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c .cluster rect{fill:hsl(180, 1.5873015873%, 28.3529411765%);stroke:rgba(255, 255, 255, 0.25);stroke-width:1px;}#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c .cluster text{fill:#F9FFFE;}#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c .cluster span{color:#F9FFFE;}#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"Redocly Mermaid Sans\",Arial,\"Liberation Sans\",Arimo,Helvetica,\"Redocly Mermaid CJK\",sans-serif;font-size:12px;background:hsl(20, 1.5873015873%, 12.3529411765%);border:1px solid rgba(255, 255, 255, 0.25);border-radius:2px;pointer-events:none;z-index:100;}#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#ccc;}#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c rect.text{fill:none;stroke-width:0;}#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c .icon-shape,#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c .image-shape{background-color:hsl(0, 0%, 34.4117647059%);text-align:center;}#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c .icon-shape p,#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c .image-shape p{background-color:hsl(0, 0%, 34.4117647059%);padding:2px;}#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c .icon-shape .label rect,#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c .image-shape .label rect{opacity:0.5;background-color:hsl(0, 0%, 34.4117647059%);fill:hsl(0, 0%, 34.4117647059%);}#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c .node .neo-node{stroke:#ccc;}#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c [data-look=\"neo\"].node rect,#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c [data-look=\"neo\"].cluster rect,#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c [data-look=\"neo\"].node polygon{stroke:url(#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c [data-look=\"neo\"].swimlane.cluster rect{filter:none;}#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c [data-look=\"neo\"].node path{stroke:url(#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c-gradient);stroke-width:1px;}#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c [data-look=\"neo\"].node .outer-path{filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c [data-look=\"neo\"].node .neo-line path{stroke:#ccc;filter:none;}#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c [data-look=\"neo\"].node circle{stroke:url(#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c [data-look=\"neo\"].node circle .state-start{fill:#000000;}#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c [data-look=\"neo\"].icon-shape .icon{fill:url(#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c [data-look=\"neo\"].icon-shape .icon-neo path{stroke:url(#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c :root{--mermaid-font-family:\"Redocly Mermaid Sans\",Arial,\"Liberation Sans\",Arimo,Helvetica,\"Redocly Mermaid CJK\",sans-serif;}</style><g><marker id=\"diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c_flowchart-v2-pointEnd\" class=\"marker flowchart-v2\" viewBox=\"0 0 10 10\" refX=\"5\" refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"8\" markerHeight=\"8\" orient=\"auto\"><path d=\"M 0 0 L 10 5 L 0 10 z\" class=\"arrowMarkerPath\" style=\"stroke-width: 1; stroke-dasharray: 1, 0;\"></path></marker><marker id=\"diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c_flowchart-v2-pointStart\" class=\"marker flowchart-v2\" viewBox=\"0 0 10 10\" refX=\"4.5\" refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"8\" markerHeight=\"8\" orient=\"auto\"><path d=\"M 0 5 L 10 10 L 10 0 z\" class=\"arrowMarkerPath\" style=\"stroke-width: 1; stroke-dasharray: 1, 0;\"></path></marker><marker id=\"diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c_flowchart-v2-pointEnd-margin\" class=\"marker flowchart-v2\" viewBox=\"0 0 11.5 14\" refX=\"11.5\" refY=\"7\" markerUnits=\"userSpaceOnUse\" markerWidth=\"10.5\" markerHeight=\"14\" orient=\"auto\"><path d=\"M 0 0 L 11.5 7 L 0 14 z\" class=\"arrowMarkerPath\" style=\"stroke-width: 0; stroke-dasharray: 1, 0;\"></path></marker><marker id=\"diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c_flowchart-v2-pointStart-margin\" class=\"marker flowchart-v2\" viewBox=\"0 0 11.5 14\" refX=\"1\" refY=\"7\" markerUnits=\"userSpaceOnUse\" markerWidth=\"11.5\" markerHeight=\"14\" orient=\"auto\"><polygon points=\"0,7 11.5,14 11.5,0\" class=\"arrowMarkerPath\" style=\"stroke-width: 0; stroke-dasharray: 1, 0;\"></polygon></marker><marker id=\"diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c_flowchart-v2-circleEnd\" class=\"marker flowchart-v2\" viewBox=\"0 0 10 10\" refX=\"11\" refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"11\" markerHeight=\"11\" orient=\"auto\"><circle cx=\"5\" cy=\"5\" r=\"5\" class=\"arrowMarkerPath\" style=\"stroke-width: 1; stroke-dasharray: 1, 0;\"></circle></marker><marker id=\"diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c_flowchart-v2-circleStart\" class=\"marker flowchart-v2\" viewBox=\"0 0 10 10\" refX=\"-1\" refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"11\" markerHeight=\"11\" orient=\"auto\"><circle cx=\"5\" cy=\"5\" r=\"5\" class=\"arrowMarkerPath\" style=\"stroke-width: 1; stroke-dasharray: 1, 0;\"></circle></marker><marker id=\"diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c_flowchart-v2-circleEnd-margin\" class=\"marker flowchart-v2\" viewBox=\"0 0 10 10\" refY=\"5\" refX=\"12.25\" markerUnits=\"userSpaceOnUse\" markerWidth=\"14\" markerHeight=\"14\" orient=\"auto\"><circle cx=\"5\" cy=\"5\" r=\"5\" class=\"arrowMarkerPath\" style=\"stroke-width: 0; stroke-dasharray: 1, 0;\"></circle></marker><marker id=\"diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c_flowchart-v2-circleStart-margin\" class=\"marker flowchart-v2\" viewBox=\"0 0 10 10\" refX=\"-2\" refY=\"5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"14\" markerHeight=\"14\" orient=\"auto\"><circle cx=\"5\" cy=\"5\" r=\"5\" class=\"arrowMarkerPath\" style=\"stroke-width: 0; stroke-dasharray: 1, 0;\"></circle></marker><marker id=\"diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c_flowchart-v2-crossEnd\" class=\"marker cross flowchart-v2\" viewBox=\"0 0 11 11\" refX=\"12\" refY=\"5.2\" markerUnits=\"userSpaceOnUse\" markerWidth=\"11\" markerHeight=\"11\" orient=\"auto\"><path d=\"M 1,1 l 9,9 M 10,1 l -9,9\" class=\"arrowMarkerPath\" style=\"stroke-width: 2; stroke-dasharray: 1, 0;\"></path></marker><marker id=\"diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c_flowchart-v2-crossStart\" class=\"marker cross flowchart-v2\" viewBox=\"0 0 11 11\" refX=\"-1\" refY=\"5.2\" markerUnits=\"userSpaceOnUse\" markerWidth=\"11\" markerHeight=\"11\" orient=\"auto\"><path d=\"M 1,1 l 9,9 M 10,1 l -9,9\" class=\"arrowMarkerPath\" style=\"stroke-width: 2; stroke-dasharray: 1, 0;\"></path></marker><marker id=\"diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c_flowchart-v2-crossEnd-margin\" class=\"marker cross flowchart-v2\" viewBox=\"0 0 15 15\" refX=\"17.7\" refY=\"7.5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"12\" markerHeight=\"12\" orient=\"auto\"><path d=\"M 1,1 L 14,14 M 1,14 L 14,1\" class=\"arrowMarkerPath\" style=\"stroke-width: 2.5;\"></path></marker><marker id=\"diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c_flowchart-v2-crossStart-margin\" class=\"marker cross flowchart-v2\" viewBox=\"0 0 15 15\" refX=\"-3.5\" refY=\"7.5\" markerUnits=\"userSpaceOnUse\" markerWidth=\"12\" markerHeight=\"12\" orient=\"auto\"><path d=\"M 1,1 L 14,14 M 1,14 L 14,1\" class=\"arrowMarkerPath\" style=\"stroke-width: 2.5; stroke-dasharray: 1, 0;\"></path></marker><g class=\"root\"><g class=\"clusters\"></g><g class=\"edgePaths\"><path d=\"M222.688,35L226.854,35C231.021,35,239.354,35,247.021,35C254.688,35,261.688,35,265.188,35L268.688,35\" id=\"diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c-L_Claims_Mappers_0\" class=\"edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link\" style=\";\" data-edge=\"true\" data-et=\"edge\" data-id=\"L_Claims_Mappers_0\" data-points=\"W3sieCI6MjIyLjY4NzUsInkiOjM1fSx7IngiOjI0Ny42ODc1LCJ5IjozNX0seyJ4IjoyNzIuNjg3NSwieSI6MzV9XQ==\" data-look=\"classic\" marker-end=\"url(#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c_flowchart-v2-pointEnd)\"></path><path d=\"M526.563,35L530.729,35C534.896,35,543.229,35,550.896,35C558.563,35,565.563,35,569.063,35L572.563,35\" id=\"diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c-L_Mappers_Token_0\" class=\"edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link\" style=\";\" data-edge=\"true\" data-et=\"edge\" data-id=\"L_Mappers_Token_0\" data-points=\"W3sieCI6NTI2LjU2MjUsInkiOjM1fSx7IngiOjU1MS41NjI1LCJ5IjozNX0seyJ4Ijo1NzYuNTYyNSwieSI6MzV9XQ==\" data-look=\"classic\" marker-end=\"url(#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c_flowchart-v2-pointEnd)\"></path><path d=\"M796.656,35L800.823,35C804.99,35,813.323,35,820.99,35C828.656,35,835.656,35,839.156,35L842.656,35\" id=\"diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c-L_Token_LoginId_0\" class=\"edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link\" style=\";\" data-edge=\"true\" data-et=\"edge\" data-id=\"L_Token_LoginId_0\" data-points=\"W3sieCI6Nzk2LjY1NjI1LCJ5IjozNX0seyJ4Ijo4MjEuNjU2MjUsInkiOjM1fSx7IngiOjg0Ni42NTYyNSwieSI6MzV9XQ==\" data-look=\"classic\" marker-end=\"url(#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c_flowchart-v2-pointEnd)\"></path><path d=\"M1068.547,35L1072.714,35C1076.88,35,1085.214,35,1092.88,35C1100.547,35,1107.547,35,1111.047,35L1114.547,35\" id=\"diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c-L_LoginId_User_0\" class=\"edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link\" style=\";\" data-edge=\"true\" data-et=\"edge\" data-id=\"L_LoginId_User_0\" data-points=\"W3sieCI6MTA2OC41NDY4NzUsInkiOjM1fSx7IngiOjEwOTMuNTQ2ODc1LCJ5IjozNX0seyJ4IjoxMTE4LjU0Njg3NSwieSI6MzV9XQ==\" data-look=\"classic\" marker-end=\"url(#diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c_flowchart-v2-pointEnd)\"></path></g><g class=\"edgeLabels\"><g class=\"edgeLabel\"><g class=\"label\" data-id=\"L_Claims_Mappers_0\" transform=\"translate(0, 0)\"><foreignObject width=\"0\" height=\"0\"><div xmlns=\"http://www.w3.org/1999/xhtml\" class=\"labelBkg\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"edgeLabel\"></span></div></foreignObject></g></g><g class=\"edgeLabel\"><g class=\"label\" data-id=\"L_Mappers_Token_0\" transform=\"translate(0, 0)\"><foreignObject width=\"0\" height=\"0\"><div xmlns=\"http://www.w3.org/1999/xhtml\" class=\"labelBkg\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"edgeLabel\"></span></div></foreignObject></g></g><g class=\"edgeLabel\"><g class=\"label\" data-id=\"L_Token_LoginId_0\" transform=\"translate(0, 0)\"><foreignObject width=\"0\" height=\"0\"><div xmlns=\"http://www.w3.org/1999/xhtml\" class=\"labelBkg\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"edgeLabel\"></span></div></foreignObject></g></g><g class=\"edgeLabel\"><g class=\"label\" data-id=\"L_LoginId_User_0\" transform=\"translate(0, 0)\"><foreignObject width=\"0\" height=\"0\"><div xmlns=\"http://www.w3.org/1999/xhtml\" class=\"labelBkg\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"edgeLabel\"></span></div></foreignObject></g></g></g><g class=\"nodes\"><g class=\"node default\" id=\"diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c-flowchart-Claims-0\" data-look=\"classic\" transform=\"translate(115.34375, 35)\"><rect class=\"basic label-container\" style=\"\" x=\"-107.34375\" y=\"-27\" width=\"214.6875\" height=\"54\"></rect><g class=\"label\" style=\"\" transform=\"translate(-77.34375, -12)\"><rect></rect><foreignObject width=\"154.6875\" height=\"24\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"nodeLabel\"><p>OIDC claims from IdP</p></span></div></foreignObject></g></g><g class=\"node default\" id=\"diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c-flowchart-Mappers-1\" data-look=\"classic\" transform=\"translate(399.625, 35)\"><rect class=\"basic label-container\" style=\"\" x=\"-126.9375\" y=\"-27\" width=\"253.875\" height=\"54\"></rect><g class=\"label\" style=\"\" transform=\"translate(-96.9375, -12)\"><rect></rect><foreignObject width=\"193.875\" height=\"24\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"nodeLabel\"><p>Keycloak provider mappers</p></span></div></foreignObject></g></g><g class=\"node default\" id=\"diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c-flowchart-Token-3\" data-look=\"classic\" transform=\"translate(686.609375, 35)\"><rect class=\"basic label-container\" style=\"\" x=\"-110.046875\" y=\"-27\" width=\"220.09375\" height=\"54\"></rect><g class=\"label\" style=\"\" transform=\"translate(-80.046875, -12)\"><rect></rect><foreignObject width=\"160.09375\" height=\"24\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"nodeLabel\"><p>Keycloak-issued token</p></span></div></foreignObject></g></g><g class=\"node default\" id=\"diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c-flowchart-LoginId-5\" data-look=\"classic\" transform=\"translate(957.6015625, 35)\"><rect class=\"basic label-container\" style=\"\" x=\"-110.9453125\" y=\"-27\" width=\"221.890625\" height=\"54\"></rect><g class=\"label\" style=\"\" transform=\"translate(-80.9453125, -12)\"><rect></rect><foreignObject width=\"161.890625\" height=\"24\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"nodeLabel\"><p>Custody loginId lookup</p></span></div></foreignObject></g></g><g class=\"node default\" id=\"diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c-flowchart-User-7\" data-look=\"classic\" transform=\"translate(1220.578125, 35)\"><rect class=\"basic label-container\" style=\"\" x=\"-102.03125\" y=\"-27\" width=\"204.0625\" height=\"54\"></rect><g class=\"label\" style=\"\" transform=\"translate(-72.03125, -12)\"><rect></rect><foreignObject width=\"144.0625\" height=\"24\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;\"><span class=\"nodeLabel\"><p>Custody user record</p></span></div></foreignObject></g></g></g></g></g><defs><filter id=\"diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c-drop-shadow\" height=\"130%\" width=\"130%\"><feDropShadow dx=\"4\" dy=\"4\" stdDeviation=\"0\" flood-opacity=\"0.06\" flood-color=\"#FFFFFF\"></feDropShadow></filter></defs><defs><filter id=\"diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c-drop-shadow-small\" height=\"150%\" width=\"150%\"><feDropShadow dx=\"2\" dy=\"2\" stdDeviation=\"0\" flood-opacity=\"0.06\" flood-color=\"#FFFFFF\"></feDropShadow></filter></defs><linearGradient id=\"diagram-7efb7d09f7a4b5041a4ecaf4875e3ca90095bf37fb1b55ae59ce6d578e68fb4c-gradient\" gradientUnits=\"objectBoundingBox\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\"><stop offset=\"0%\" stop-color=\"#cccccc\" stop-opacity=\"1\"></stop><stop offset=\"100%\" stop-color=\"hsl(180, 0%, 18.3529411765%)\" stop-opacity=\"1\"></stop></linearGradient></svg>"},"children":["flowchart LR\n    Claims[\"OIDC claims from IdP\"] --> Mappers[\"Keycloak provider mappers\"]\n    Mappers --> Token[\"Keycloak-issued token\"]\n    Token --> LoginId[\"Custody loginId lookup\"]\n    LoginId --> User[\"Custody user record\"]\n"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Choose a claim that is:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Unique for each user."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Stable over time."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Present in every login token."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Available through the scopes configured in Keycloak."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["sub"]}," claim is required in OIDC ID tokens. Claims such as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["email"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["preferred_username"]}," can be useful, but they depend on provider configuration and requested scopes."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"claims-scopes-and-access-gating","__idx":3},"children":["Claims, scopes, and access gating"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Use scopes and required claims deliberately:"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Setting"},"children":["Setting"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Guidance"},"children":["Guidance"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["openid"]}," scope"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Required for OIDC identity tokens."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["profile"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["email"]}," scopes"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Request only when your mapper design needs profile or email claims. Some identity providers let these scopes be optional instead of granted by default."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Required or essential claim"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Use when your identity provider marks users as assigned to the Custody application through a specific claim. Users without the claim should not be treated as assigned."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Mapper claim"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Choose the claim that produces the Custody ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["loginIds.id"]}," value. Avoid claims that are absent, mutable, or not unique."]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Do not publish real tenant identifiers, client IDs, client secrets, or required-claim values in public runbooks. Use placeholders and store the actual values in your approved secret-management system."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"provider-aliases-and-login-ids","__idx":4},"children":["Provider aliases and login IDs"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The Keycloak identity provider alias identifies the upstream provider. The same value is used as the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["providerId"]}," in Custody user records."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"loginIds\": [\n    {\n      \"id\": \"user@example.com\",\n      \"providerId\": \"harmonize\"\n    },\n    {\n      \"id\": \"user@example.com\",\n      \"providerId\": \"corporate-oidc\"\n    }\n  ]\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["In this example, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["corporate-oidc"]}," must match the Keycloak provider alias. The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["id"]}," value must match the identifier produced by your Keycloak mapper design."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"existing-users","__idx":5},"children":["Existing users"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Before enabling SSO for existing users:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Confirm each user has the expected ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["loginIds"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Check for duplicate aliases or login IDs in the same domain."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Check that users with the same public key across domains use consistent identity data."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Confirm each user still has the roles and domain access needed after login."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If existing users are not mapped correctly, authentication can succeed in Keycloak while ","Ripple Custody"," cannot match the token to the expected user."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"session-and-logout-planning","__idx":6},"children":["Session and logout planning"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Once Keycloak federates a user, Keycloak becomes the identity provider from the downstream application perspective. Plan these controls in Keycloak:"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Control"},"children":["Control"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Why it matters"},"children":["Why it matters"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["SSO session idle and max values"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Bound how long a Keycloak session can remain active."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Concurrent-session controls"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Define how repeat sign-ins should behave for the same federated user."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Logout behavior"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Upstream IdP logout support varies. At minimum, Keycloak can terminate the local session."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Session revocation"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Operators may need to end a user's Keycloak sessions after access changes."]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For more information, see ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/custody/v1.38/identity-and-access/sso/keycloak-session-limiting"},"children":["Keycloak session limiting"]}," and ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/custody/v1.38/identity-and-access/sso/keycloak-inactivity-timeout"},"children":["Keycloak inactivity timeout"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"interactive-sso-and-service-credentials","__idx":7},"children":["Interactive SSO and service credentials"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Interactive user federation and service-to-service credentials are separate concerns."]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Credential type"},"children":["Credential type"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Use"},"children":["Use"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Federated user login"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Human users authenticate through Keycloak and the external OIDC provider."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Custody API signing"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["State mutation Custody API requests still require Custody signing."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Service-to-service client credentials"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Components or integrations use OAuth2 client credentials where supported by the deployment. Manage these credentials separately from the interactive SSO provider client."]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Do not reuse an interactive SSO client secret for service-to-service access. Rotate and test each credential path independently."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"rollout-model","__idx":8},"children":["Rollout model"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Phase"},"children":["Phase"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Verification"},"children":["Verification"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Prepare"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Keycloak can reach the OIDC discovery document and JWKS endpoint over the expected network path."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Configure"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Provider alias, scopes, client ID, client secret, redirect URI, and mappers are set in the Metaco realm."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Provision"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Custody users have ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["loginIds"]}," matching the provider alias and mapped identifier."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Test"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["A test user can log in, repeat login without duplicate users, and access the expected domains."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Operate"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Logs, secret rotation, session controls, and troubleshooting evidence are documented."]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For the Keycloak setup procedure, see ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/products/custody/v1.38/identity-and-access/sso/keycloak-integration"},"children":["Configure OIDC federation in Keycloak"]},"."]}]},"headings":[{"value":"Plan identity federation","id":"plan-identity-federation","depth":1},{"value":"Planning checklist","id":"planning-checklist","depth":2},{"value":"Identifier design","id":"identifier-design","depth":2},{"value":"Claims, scopes, and access gating","id":"claims-scopes-and-access-gating","depth":2},{"value":"Provider aliases and login IDs","id":"provider-aliases-and-login-ids","depth":2},{"value":"Existing users","id":"existing-users","depth":2},{"value":"Session and logout planning","id":"session-and-logout-planning","depth":2},{"value":"Interactive SSO and service credentials","id":"interactive-sso-and-service-credentials","depth":2},{"value":"Rollout model","id":"rollout-model","depth":2}],"frontmatter":{"seo":{"title":"Plan identity federation"}},"lastModified":"2026-07-27T10:10:43.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/products/custody/v1.38/identity-and-access/sso/identity-federation-guide","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}