Keycloak FAPI 2.0, DPoP and CIBA

Keycloak can enforce FAPI profiles through client policies, bind tokens to clients with DPoP, accept pushed authorization requests and run decoupled CIBA authentication. This page explains what each does, when your APIs need it and what a fixed-scope implementation involves.

On this page

When Keycloak FAPI 2.0 fits your financial-grade APIs

Keycloak FAPI 2.0 fits when your team exposes or consumes APIs that move money or access sensitive financial data, and standard OpenID Connect client configuration no longer gives you enough assurance for the counterparties and regulators you answer to. The decision usually starts with external obligations: a payment scheme, an open banking framework or a bank partner that names a specific profile in its onboarding requirements. If your APIs are internal, low-risk or limited to public data, a hardened standard client setup is usually the more proportionate starting point.

FAPI stands for Financial-grade API. The OpenID Foundation publishes FAPI as a set of profiles built on OAuth 2.0 and OpenID Connect. Each profile narrows the options a client and server may choose, so security properties stay predictable across implementations. FAPI 1.0 is the profile many open banking schemes reference, and FAPI 2.0 is the newer profile that reduces the number of permitted options and tightens others. Confirm which profile and version each counterparty requires, because a scheme may add options beyond the profile itself. In Keycloak, these requirements are applied through client policies that attach executors and conditions to clients. Confirm which executors your release supports for each profile before you commit to a design.

Three features in this topic cover different parts of the profile. DPoP (demonstrating proof of possession) binds access and refresh tokens to a key the client holds, so a token captured in transit or from logs cannot be replayed by another party without that key. Pushed authorization requests (PAR) send the authorization request parameters through a direct back-channel call before the browser is redirected, which lets the server validate them early and keeps sensitive parameters out of front-channel URLs. CIBA (Client-Initiated Backchannel Authentication) lets a client start an authentication on a separate device, such as a customer approving a payment on a phone, without a browser redirect on the consuming side. Each feature has its own settings and client requirements, so decide per API which ones your flows actually need.

Treat this as a Keycloak feature area to confirm, not a single setting you enable. Before design, check the current Keycloak server administration guide and the release notes for your version to see which FAPI executors, DPoP options, PAR and CIBA settings are supported and how mature each one is. Your resource servers must also validate DPoP proofs and enforce bound tokens, which Keycloak does not do on its own. Ask for a test plan that exercises each client policy with negative cases, such as replayed proofs, unpushed authorization requests and tokens presented without the bound key. Clarify with your counterparty whether it requires independent certification. DeployOpen does not issue audit reports or certifications, but it can prepare the configuration, test evidence and documentation that an independent assessor reviews.

Which FAPI, DPoP, PAR and CIBA options fit your APIs

This table compares the FAPI 1.0 and FAPI 2.0 profiles, DPoP, pushed authorization requests and CIBA as building blocks for financial-grade APIs. Read each row for the use case it fits, the client or API change it forces and the points to confirm in the Keycloak version you run. Settle the profile first, then add sender-constraint and request controls around it, since most deployments combine several options.

OptionFits whenClient or API changeConfirm in your Keycloak version
FAPI 1.0 profile through client policiesOpen banking or payments APIs already built to the FAPI 1.0 profile that need a tested Keycloak configuration.Clients must meet the profile's request, client authentication and token rules, applied to them through a client policy.Which FAPI 1.0 options the client policy profiles offer, what each one enforces, and how existing clients fail validation.
FAPI 2.0 profile through client policiesNew or re-platformed APIs targeting the FAPI 2.0 security profile, including those requiring sender-constrained tokens.Clients must follow stricter authorization request, token and client authentication rules, and legacy flows such as implicit or password grants will fail validation.Whether the FAPI 2.0 profile in your version matches the current specification, and which exceptions you must document in writing.
DPoP sender-constrained tokensAPIs that must bind access tokens to a client key so a stolen bearer token cannot be replayed.Clients generate a key pair, send a signed proof with each token request and API call, and resource servers validate that proof.Whether your version issues DPoP-bound tokens for each client type, and how your resource servers check proofs and nonces.
Pushed authorization requests (PAR)Clients sending sensitive or large authorization parameters that should stay off the browser URL.Clients post authorization parameters to the pushed request endpoint first, then redirect the user with a request reference.Whether PAR can be required per client or per policy, and how your gateway and front channel handle the request reference.
Client-initiated backchannel authentication (CIBA)Decoupled approval where a backend starts a request, such as a high-value payment, and the user approves on a bound device.The client calls the backchannel authentication endpoint, then polls or receives a callback once the user approves.Which delivery modes your version supports, how the user's device is bound, and how approval notifications reach your users.

How Keycloak FAPI 2.0 client policies enforce the profile

Keycloak applies FAPI requirements through client policies, which are attached to individual clients. A client policy groups profiles and executors, and each executor performs one check at a defined point in the flow. Realm-wide settings alone will not make a client conform, so the first decision is scope. List every client that must meet a FAPI profile, separate it from clients that stay on standard OpenID Connect, and attach the policy only to the first group. Mixed realms are common because internal tools and financial API clients often share one Keycloak server. Record the scope in your design document before you change any configuration, because the scope determines which clients need testing.

A policy checks three moments in the flow. At authorization time, executors can inspect the request itself, for example the response type, whether PKCE is used, the redirect URI, and whether pushed authorization requests are required. At token time, they check properties of the issued tokens, such as the signing algorithm and whether the token is sender-constrained. At client authentication time, they check how the client proves its identity, including the authentication method and the strength of its keys. The exact set of checks depends on the profile and the Keycloak release you run, so confirm each one against the server administration guide before you map it to a control in your own assessment.

You can define a policy in two places. The admin console provides a client policies area where you create policies, add profiles and executors, and attach them to clients. This suits exploration and a small number of clients. The realm configuration is the other place. Policies are part of the realm representation, so you can export them, keep them in version control and import them into another environment. If you deploy with the Keycloak Operator, the KeycloakRealmImport resource is a natural route. Choose one source of truth. Console edits that never return to the realm file can drift from the version in your repository and be overwritten at the next import.

A client that does not meet the profile should fail, and the failure should be visible. The intended behavior is that Keycloak rejects the request, token or authentication attempt with an error, and does not issue a token under weaker settings. A silent fallback to a standard flow would turn a configuration gap into an unnoticed compliance gap. Test this directly. For each in-scope client, send one request that breaks each rule, such as a missing PKCE challenge or a weak client key, and confirm the rejection and the error in the logs. Keep the results as evidence for the assessor, and repeat the tests after every upgrade, because executor behavior can change between releases.

Take the executor and policy names from the server administration guide for your release, not from community posts or memory, and copy them exactly into your realm configuration. A short mapping table helps. Each row lists a requirement from your chosen profile, the executor that enforces it, the point where it runs and the test that proves it. Share the table with your security team before the build starts, since it becomes the basis for both the configuration and the test plan. Confirm in your own environment that the Keycloak version you deploy supports each executor you rely on.

Setting up Keycloak FAPI 2.0 client policies step by step

This sequence takes a Keycloak server from version confirmation to a tested FAPI 2.0 configuration in which non-compliant clients are refused, sender-constrained tokens are enforced, and conformance results are documented before production. Each step ends with a check that the platform team can record as evidence.

  1. Confirm the Keycloak version and FAPI features

    The platform lead confirms which Keycloak release the organization will run and reads that release's documentation for the FAPI 2.0, DPoP, PAR and CIBA features the APIs depend on. Keycloak's current release is 26.8.1, published October 13, 2026, but the features your APIs need decide the version, so check each feature against the documentation for the chosen release. Keycloak has said that breaking changes in minor releases are opt-in, so record the exact version and feature list in the design document before any build work starts. The step is done when each required feature has a named source in the release documentation and the owner of the API program has approved the version in writing.

  2. Deploy Keycloak behind TLS and a reverse proxy

    The infrastructure team deploys a server in a non-production environment that matches the planned production topology, following the Keycloak production guide. TLS protects all communication, and the reverse proxy restricts paths so the admin console and Administration REST API sit on a different hostname or context path from public frontend URLs. Choose the database from the supported production list, which includes PostgreSQL 14 to 18, and confirm the version your platform team can operate. Enable metrics on the management interface if monitoring is in scope. The step is done when the admin console does not respond on the public hostname, public login endpoints respond over HTTPS, and the certificate chain validates from a client outside the internal network.

  3. Create a dedicated test realm

    The identity team creates a separate test realm so policy experiments stay away from production users, clients and keys. They import a small set of test users, including one who has the multi-factor method the policy will require, and they export the realm configuration so every change can be reviewed in version control. The team then checks the discovery document served by the test realm over HTTPS to confirm the endpoints, supported methods and signing algorithms match what the documentation describes. The step is done when a test user signs in through the browser flow the team configured and the realm export can be imported into a clean instance without manual edits.

  4. Define the client policy with the FAPI 2.0 profile

    The identity engineer creates a client policy in the test realm and attaches the FAPI 2.0 security profile that the server administration guide documents for the chosen version. The profile sets requirements on how clients authenticate, which redirect URIs and signing algorithms they may use, and how tokens are issued. The engineer confirms the profile's exact conditions in the documentation rather than working from memory. The check for this step is a deliberate negative test: a client created with a setting the profile forbids, such as an unapproved authentication method, must be refused by the server with an error. The step is done when the refusal is logged and the team has saved the test request and response as evidence.

  5. Configure confidential clients with the required authentication

    The engineer registers each API client as a confidential client and sets the client authentication method that the profile requires, confirmed against the documentation for the chosen release. Key material is generated and stored in the organization's key management process, and the public keys are registered with the client. The team then tests the client in two ways: a token request using a method the profile does not allow must fail, and a token request using the correct key material must succeed. The step is done when both results are recorded, and the team confirms that the key rotation procedure is written down and that someone other than the builder has reviewed it.

  6. Enable PAR and DPoP where the APIs need them

    The engineer enables pushed authorization requests for the clients that start authorization flows, so authorization parameters travel over a back-channel call before the browser redirect. For APIs that need sender-constrained tokens, the engineer turns on DPoP and binds tokens to the client's key pair. The check is strict: a token request without a valid DPoP proof must fail, a request with a proof signed by the wrong key must fail, and a request with a valid proof must succeed. A direct authorization request that carries parameters in the browser URL must be refused where PAR is required. The step is done when the team has tested each refusal and success case and has written down which APIs accept only sender-constrained tokens.

  7. Run conformance tests with production client libraries

    The team runs the conformance checks with the same client libraries and SDKs the applications use, not with a generic test client, because the library's behavior is part of what must conform. A conformance test tool that includes FAPI 2.0 test plans is run against the test realm, and the team confirms which tool, version and test plans cover the profile before relying on the results. Each failure is triaged as a configuration issue, a library issue or a server issue, and the fix is retested. The team repeats the run after every configuration change. The step is done when the final run passes the agreed test plans, the results and the configuration export are archived, and the owner signs off before any production change is scheduled.

How DPoP changes token handling for your resource servers

DPoP changes the core assumption behind an access token. A bearer token works for anyone who holds it, but a DPoP-bound token works only with the key pair that the client generated. The client creates the key pair, Keycloak binds the issued token to the public key, and each request to a protected API carries a signed proof that the client builds with the private key. Your resource servers must do more than read the Authorization header. They must check that the access token is bound to the key in the proof, that the proof was signed by that key, that it is recent, and that it has not been used before. Plan these checks in the resource server code or in the gateway that fronts it, and confirm which token types and proof claims your Keycloak version issues in the current documentation.

The first operational effect is key storage on clients. The private key is what makes a stolen access token useless, so its handling becomes a security control in its own right. Server-side clients can usually keep keys in a hardware-backed store, a secrets manager or a protected file with restricted permissions. Single-page applications and mobile apps need a different answer, and the options depend on the platform and on what the browser or operating system exposes. Ask each application team where the key lives, how long it lives, when it rotates, and what happens after a logout or device loss. Confirm with the Keycloak documentation which client settings enforce DPoP and whether any client types are excluded.

The second effect is time and replay. Each proof carries an issued-at value, and resource servers must accept proofs only within a defined window. If your API servers have clock drift, valid requests will fail intermittently, so confirm time synchronization across every node before go-live. Replay protection also needs shared state. If a proof identifier is stored only in local memory, a request sent to a different instance can be replayed without detection. Behind a load balancer, you need a shared store for recently seen proof identifiers, sized for your request volume, with expiry aligned to the acceptance window. Test this with several instances behind the balancer, not with one server.

The third effect is proxies and mixed clients. The proof includes the HTTP method and target URL, so a reverse proxy, ingress controller or API gateway that rewrites hosts, paths or schemes can make every proof fail. Configure forwarding headers so each resource server reconstructs the URL the client actually signed, and confirm that no intermediary strips the DPoP header. Mixed clients need a deliberate decision. During migration, you may keep some clients on bearer tokens, but that choice weakens the protection for those clients. Decide whether Keycloak should reject requests without proofs for specific clients, whether your APIs should accept both token forms for a fixed period, and who approves the exceptions and their end date.

Security risks in Keycloak FAPI 2.0 deployments

These six areas share one pattern: a Keycloak FAPI 2.0, DPoP or CIBA deployment can look correct in the admin console while failing at the protocol or network layer. Each card names a control and the check that proves it, so reviewers can test the deployment instead of trusting configuration screens.

Weak client authentication

Confidential clients in a FAPI profile should authenticate with a method the profile permits, such as private key JWT or mutual TLS, and the client policy should reject weaker methods for those clients. Confirm the permitted methods against the FAPI profile version you adopt. Check each FAPI client's configured authentication method, then send a token request with a client secret to confirm the server refuses it. Also review who can create or edit clients, because a client quietly switched back to a shared secret undoes the profile.

Redirect URI and PAR request handling

Redirect URIs should be exact matches with no wildcards or open path segments, because a loose pattern can send an authorization code to an endpoint the client does not control. Where pushed authorization requests are required, the authorization endpoint should refuse requests that arrive as plain front-channel parameters. Check both controls by attempting an authorization request with an off-pattern redirect URI and another without a PAR reference, then confirming each fails.

DPoP proof replay and key management

DPoP binds an access token to a client key, but the binding holds only when each resource server validates every proof: the signature, the HTTP method and URL, the issued-at time, and a unique identifier that cannot be reused. Confirm that every API in scope performs these checks, not only token signature validation. Define where DPoP private keys are stored, how they rotate, and how tokens bound to a compromised key are revoked. Test by replaying a captured proof against each resource server.

Backchannel logout token validation

The Keycloak 26.8 upgrade notes make signature validation of backchannel logout tokens from external providers mandatory. Before upgrading, list every external identity provider that sends logout tokens and confirm each one signs tokens with a key Keycloak can verify. After the upgrade, check that a logout token with an altered signature or an unknown key is rejected, and that legitimate logouts still complete for each provider.

TLS and admin console exposure

Keycloak's production guidance calls for TLS on all communication and a reverse proxy with path restrictions. Serve the admin console and Administration REST API on a hostname or context path separate from public frontend URLs, and block those paths at the proxy for internet clients. Check by requesting admin paths through the public hostname from outside your network and confirming they fail. Also scan both hostnames for weak TLS configuration and confirm the certificate chain is valid for each.

Audit logging of login failures

The Keycloak 26.8 upgrade notes persist login failures to the database by default, so database growth, retention and access to failure records become part of your operating responsibilities. Confirm the setting in your deployment and agree a retention period with your compliance owner. Check that failed sign-ins record the user, client and time, and that events reach your SIEM through the forwarding method you choose. Test by generating controlled failed logins and tracing each one end to end.

When decoupled CIBA authentication fits a payment or call-center flow

Decoupled CIBA, the Client-Initiated Backchannel Authentication flow, fits a narrow set of journeys: the device that starts the transaction is not the device where the person approves it. A typical example is a payment initiated by a merchant or call-center agent on one screen, with the customer approving the payment on their own phone. The client starts the request, Keycloak authenticates the user out of band, and the client receives the outcome without the user being redirected through the browser that made the request. Before you plan a CIBA build in Keycloak, confirm that this split of devices is a real requirement of the journey and not a convenience that a standard redirect flow could handle.

The main trade-off is reachability. The user must be able to receive and complete the authentication on the authenticating device, within the time the request stays valid. A customer with no signal, a switched-off phone, or a notification that is silenced will simply fail the flow, and the client has to handle that outcome cleanly. Notification delivery is also part of the design, not an afterthought. You need to decide how the authentication device is registered and bound to the user, how the request reaches it, and whether the client polls for the result, waits for a ping callback, or uses a push mode. Each mode places different demands on your client, your network paths and your retry logic.

The binding message deserves as much attention as the transport. The user sees a short text on the authenticating device, and that text is the only evidence they have of what they are approving. A payment approval should show the payee and amount in plain language, and a call-center verification should say which service is requesting access. Keep the message short enough to fit a phone notification and avoid wording that a fraudster could reuse to make a request look routine. Review the wording with fraud and customer operations teams before build, because it is part of the control, not just the interface.

Whether Keycloak supports each CIBA mode, and how, must be confirmed for the exact version you plan to run, along with any extension points you would need for your notification channel. Do not assume a mode is available because a specification describes it. Ask for a written list of supported modes, the configuration that enables them, and any features that are experimental or unsupported in your version, and test each mode against your own client before committing to a design.

Many teams do not need CIBA at all. If the customer or agent can complete a standard authorization code flow with sender-constrained tokens in the same browser session, that is usually simpler to build, test and audit. Reserve CIBA for journeys where the device split is inherent and the business accepts the reachability and messaging trade-offs. A short written comparison of the two flows for each use case is a useful gate before any CIBA work is scoped.

What to confirm before committing to FAPI, DPoP and CIBA

Each item below is a point where the target Keycloak release, your client libraries or your database design can change whether FAPI 2.0, DPoP and CIBA work as planned. Confirm them against the release you intend to run, using the Keycloak documentation for that version, before you fix the architecture or the project scope.

FAPI profile and client authentication

Confirm which FAPI profile version the target Keycloak release enforces through client policies, and which client authentication methods it accepts for confidential clients. Check whether the profile you need is provided by the release or requires settings you would have to build yourself. Compare the result against the security profile your auditors and API partners expect, because a configuration that is close can still fail a conformance review on one parameter. Record the exact client policy settings you will export and version control.

Token types and DPoP options

Check which token types the release issues for each client type, and whether it binds access tokens and refresh tokens to a DPoP key proof. Confirm the proof validation options it exposes, including any settings for proof lifetime, replay handling and nonces, and whether those settings apply per client or per realm. Verify how each resource server in your estate validates the bound token and the DPoP proof, since a token bound at the authorization server still needs a matching check at every API that accepts it.

PAR and DPoP support in client libraries

Check that every library, gateway and SDK you rely on supports pushed authorization requests and DPoP, on both the client side that builds the proof and the resource server side that validates it. Test with the exact versions you will deploy, because support is often partial, such as PAR without DPoP or DPoP without refresh token binding. Also confirm that your API gateway forwards the DPoP and Authorization headers unchanged to the services that validate them.

CIBA modes and notification channels

List the CIBA delivery modes the target release implements, and compare them with the modes defined by the CIBA specification to see which ones your decoupled authentication flow needs. Confirm how the authentication request reaches the user's device, which notification channel the release supports, and whether the consumption device must expose a callback endpoint. Check how the release handles binding messages and request expiry, and confirm both behaviors in the documentation for the version you will run.

Supported database and high availability

Confirm that the database engine and version you plan to use appear in the release's list of supported production databases. Keycloak lists PostgreSQL 14 to 18 along with several other engines, and the default dev-file database is for development only. Check the high availability design as well: Keycloak documents a single cluster optionally spread across availability zones, multi-cluster v2 without external Infinispan, and a deprecated v1 multi-cluster design. Both supported designs require a synchronously replicated database, so verify your replication setup before you commit.

Minor release changes and version review

Keycloak plans four minor releases a year, and since version 26.0 the project has stated that breaking changes in a minor release will be opt-in. A new FAPI or DPoP behavior may therefore need a deliberate configuration change, and a newer minor release can keep existing behavior until you enable it. Review the upgrade notes for the exact version you choose, including the 26.8 notes on SMTP StartTLS and backchannel logout token validation, and test your FAPI, DPoP and CIBA flows on that version before you lock the scope.

How PCI DSS, DORA and the FTC Safeguards Rule touch this design

Three regimes may shape how you configure Keycloak for FAPI 2.0 clients, DPoP-bound tokens and CIBA flows, but none of them is satisfied by a single setting. PCI DSS applies to entities that store, process or transmit cardholder data or sensitive authentication data, and to entities that could affect the security of the cardholder data environment, including merchants, processors, acquirers, issuers and service providers. If the Keycloak realm, its hostnames or the APIs it protects sit in that environment or can affect it, the identity layer falls within the assessment. The PCI SSC does not enforce compliance itself. Confirm with your acquirer or payment brands whether you must validate, and which route applies: a Report on Compliance from a Qualified Security Assessor, or a Self-Assessment Questionnaire, each with an Attestation of Compliance.

DORA, Regulation (EU) 2022/2554, has applied since 17 January 2025 to 20 types of financial entity and applies directly without national transposition. If you are in scope and Keycloak supports an ICT service that carries critical or important functions, two obligations reach the design. Article 28(3) requires a register of information covering all contractual arrangements for ICT services, so the Keycloak deployment, its hosting provider and any implementation partner should appear in that record. Article 28(8) requires documented, tested exit strategies and transition plans for those services. Article 30(2) requires each ICT contract to state where services are provided and data processed, to give advance notice of changes, and to cover data return on insolvency or termination. Check your provider and partner contracts against these terms before go-live.

The FTC Safeguards Rule (16 CFR Part 314) applies to non-bank financial institutions under FTC jurisdiction. Section 314.4(c)(5) requires multi-factor authentication for any individual accessing any information system, unless the Qualified Individual approves an equivalent control in writing. For Keycloak, this means mapping every realm, admin console login and user-facing client flow to a required second factor. Keycloak's OTP policies, W3C WebAuthn, passkeys and recovery codes can supply that factor, but the rule covers people, so staff access, administrator access and any service account a person can use need review too. Confirm which authentication steps each FAPI, DPoP and CIBA flow actually performs. A protocol profile does not automatically prove that an individual passed MFA, and any equivalent control needs written approval.

Keycloak configuration can produce evidence for controls in all three regimes, including client policy settings, realm authentication flows, administrator activity records and documented design decisions. DeployOpen prepares systems, controls and evidence for compliance assessments, but it does not issue audit reports, attestations or certifications. The assessor, the payment brand, the regulator or the Qualified Security Assessor decides the outcome. Assessment scope also depends on the entity, not the software: the same Keycloak version can be in scope for one organization and out of scope for another. Agree the boundary with your assessor early, and record which realms, clients, hostnames and flows are included, so the evidence matches what was actually assessed.

What does Keycloak FAPI 2.0 implementation cost and take?

What drives the cost and duration of a Keycloak FAPI 2.0 project?

The main drivers are the number of API clients and resource servers in scope, the FAPI profile you target, how much of the API surface uses DPoP and PAR, whether CIBA is needed and for which flows, how the hosting and database are designed, and how deeply the result is tested. Each client and resource server needs its own policy mapping, redirect and token settings, and verification, so a large inventory multiplies the work. A single API with one client is a small change. Dozens of clients owned by several business units is a program. Ask any partner to show how each driver maps to work items in the proposed scope and which assumptions would change the schedule. No duration is stated here because the effort depends on your inventory, which has not been reviewed yet.

Which costs are one-time and which recur after go-live?

One-time work usually covers the API inventory, profile and client policy design, realm configuration, DPoP and PAR changes in each client and resource server, CIBA flow design where it applies, hardening, and the test evidence your assessors will ask for. Recurring work covers keeping Keycloak current. The project plans four minor releases a year and a major release every two to three years, and it states that breaking changes in a minor release will be opt-in. Each upgrade still needs a review of client policies, a database migration plan, and regression tests for the FAPI paths. The Keycloak Operator documentation strongly recommends manual approval for operator updates, which keeps upgrade timing under your control. Ask whether the quote includes a set number of version reviews per year or bills each upgrade separately.

What does the buyer need to provide before work starts?

Plan to provide an API inventory listing every client and resource server, a named owner for each one, and a decision on which profile and sender-constraint behavior each must meet. You also need access to the environments where Keycloak runs, including the cluster, database, reverse proxy and secrets store, along with change windows for each stage. Security sign-off is needed for the target profile, token lifetimes and the CIBA notification path, and someone with authority must accept test results in writing. A late or incomplete inventory often slows these projects, so ask the partner to list what they need on day one and what they need before testing begins. Check with your internal owners how long approvals take in your organization, because those timelines depend on your governance and are yours to plan.

Can an internal team implement FAPI 2.0 on Keycloak without outside help?

Yes, an internal team can do this if it already runs Keycloak in production, has engineers who know OAuth 2.0 and OpenID Connect in depth, and can test sender-constrained tokens against real clients. The harder parts are the client-by-client analysis, coordination with application owners, and proving the result to assessors. FAPI 2.0 behavior depends on how each application handles tokens, and teams often need more time for that analysis than for the Keycloak configuration itself. Map your skills against four areas: Keycloak administration, protocol design, application changes for DPoP, and security testing. If one area is thin, a fixed-scope engagement can cover that gap while your team keeps ownership of the platform and its runbooks. Decide before starting and record the decision with the people who will carry the on-call responsibility.

What should a written quote for this work include?

A written quote should follow from a written scope, so agree on the scope first. It should list in-scope clients and resource servers by name, the FAPI profile and each sender-constraint requirement, the CIBA flows included or excluded, the hosting and database assumptions, and the testing depth with the tests named. It should separate one-time deliverables from recurring services such as upgrades, version reviews and continuous testing. It should also state what the buyer provides and by when. Ask for acceptance criteria for each deliverable, the change control process if the inventory grows, and a list of exclusions. Confirm who holds the documentation and runbooks after handover. DeployOpen does not publish a price list, so the written scope and quote are where cost becomes concrete for your environment.

How do DPoP and PAR coverage affect the effort?

DPoP and PAR change how each client sends requests and how each resource server validates tokens, so coverage is a major effort driver. PAR moves authorization parameters to a back-channel request before the browser redirect, which means each client must be updated and tested. DPoP binds tokens to a key the client holds, so each client needs key handling and each resource server needs proof validation. Partial coverage matters. If some APIs still accept bearer tokens during a transition, the risk picture changes and the exceptions need documented approval. Ask the partner which clients will enforce DPoP at go-live, which need a transition period, and how they will show that unbound tokens are rejected where the profile requires it. Confirm which code changes your application teams must make, since that work often sits outside the platform budget.

How much does CIBA scope change the implementation effort?

CIBA adds work when a flow needs a decoupled authentication step, such as a user approving an action on a separate device. The effort depends on how many flows use it, which notification channel and device model you choose, how the backchannel authentication endpoint is secured, and how approval results are handled and logged. Each additional flow needs its own design, test cases and user experience review. If only one or two flows need CIBA, scope it separately from the core FAPI work so the schedule for the main platform does not depend on it. Ask whether the quote treats CIBA as a separate option with its own deliverables and acceptance criteria. Confirm with your product owners which flows truly need decoupled authentication before design begins, because removing a flow from scope early is cheaper than redesigning it later.

What testing evidence should we expect at handover?

Expect a documented test plan, test results for each client and resource server, configuration exports from the realm, and runbooks for operating and upgrading the platform. The evidence should show which FAPI requirements were tested, how DPoP and PAR behave in each flow, and how failures were handled and retested. DeployOpen prepares systems, controls and evidence for compliance assessments, but it does not issue audit reports, attestations or certifications. Independent auditors and certification bodies make those determinations, so ask early which artifacts your assessor expects and in what format. Agree on who retains the evidence, where it is stored, and how it is updated after each Keycloak upgrade, so the record stays current after the project closes.

How DeployOpen scopes and delivers Keycloak FAPI work

DeployOpen plans, implements, hardens, documents and supports self-hosted Keycloak inside your own cloud accounts, data centers or air-gapped networks. For FAPI 2.0, DPoP and CIBA, that means scoping which client policies, sender-constrained tokens and authentication flows your APIs need, then building and testing them against your environment. Engagements are fixed-scope, with scope and deliverables agreed in writing before work starts.

How we scope

  • The written scope names which FAPI 2.0 security profile requirements apply to each client, API and grant type.
  • It records where DPoP sender-constrained tokens are required, and which resource servers validate them.
  • Scope also covers pushed authorization requests, CIBA authentication requests, notification channels and the identity sources involved.

How we build

  • Client policies enforce the chosen profile on matching clients, so settings stay consistent across each realm.
  • Pushed authorization requests, DPoP and CIBA are built as separate, testable increments with their own acceptance checks.
  • Integration with your resource servers, gateway and client applications is tested against the agreed scope before handover.

How we hand over

  • Deliverables include configuration exports, client policy definitions and a written record of each control decision.
  • Test evidence covers positive and negative token flows, including requests that omit DPoP proofs or use unregistered clients.
  • Runbooks explain how to rotate signing keys, review client policies and verify DPoP and CIBA behavior after changes.

How we support

  • Ongoing support, upgrades and continuous testing are available as a retainer after handover.
  • Upgrades are planned against Keycloak release notes, including changes made opt-in for minor releases.
  • Support scope and change handling are written into the agreement before retainer work begins.

Sources and further reading

Talk to our team.

Tell us what you're working on, whether it's a deployment, an audit, a security test or a cyber range. You'll speak with an engineer who can help you scope it.

  • 30-minute call: free, with no obligation.
  • NDA on request: we can sign before you share details.
  • Clear next steps: a scope and plan after the call.