OpenID Connect Dynamic Client Registration: Specs Explained
Every application that authenticates through OpenID Connect needs to be registered as a client with an identity provider first. Traditionally, that means filling out forms, copying credentials, and manually configuring each connection. OpenID Connect Dynamic Client Registration (defined in RFC 7591) replaces that manual process with an API call, letting applications register themselves programmatically without human intervention.
For healthcare developers building SMART on FHIR applications, this matters more than most realize. Connecting to EHR systems like Epic or Cerner requires OAuth-based client registration at each site, and doing that manually across dozens or hundreds of health systems doesn't scale. At SoFaaS™, we handle the authorization and token management layer so teams can skip the infrastructure headaches, but understanding how Dynamic Client Registration works under the hood gives you a real advantage when architecting integrations that need to scale.
This article breaks down the full specification, what Dynamic Client Registration is, how RFC 7591 defines the protocol, what the registration endpoint expects, and how the metadata flows between client and server. Whether you're implementing DCR in your own identity platform or evaluating how it fits into a managed integration workflow, you'll walk away with a clear, practical understanding of the spec and where it applies. Let's get into the details.
What dynamic client registration solves
Before DCR existed, every client application had to be registered manually. A developer would log into an identity provider's admin console, fill out the client details, copy the generated client ID and secret, paste those credentials into their application, and repeat that entire process for every environment and every provider. That sequence works fine when you're registering one application with one identity provider once. It breaks down quickly when your architecture requires dozens of registrations across different systems.
The manual registration problem at scale
Manual registration creates two concrete problems: it doesn't scale, and it introduces human error. When you manage client credentials by hand, someone has to track expiration dates, rotate secrets, update configurations, and keep records synchronized across development, staging, and production environments. A misconfigured redirect URI or an expired secret brings down an OAuth flow silently in ways that are difficult to debug. More critically, manual registration blocks automation entirely because you cannot script a human clicking through a web console.
Automating client lifecycle management isn't just a convenience improvement. It's a prerequisite for any system that needs to provision integrations dynamically without operator intervention.
OpenID Connect Dynamic Client Registration solves this by exposing a standardized registration endpoint. Your application sends a POST request with the metadata it needs registered, the server validates the request, creates the client record, and returns credentials in the response. No console logins. No copy-pasting. No tickets to an admin team. The entire registration happens through a documented, repeatable API, which means you can integrate it directly into your deployment pipelines or onboarding workflows.
Why healthcare integrations feel this pain hardest
Healthcare development amplifies this problem considerably. When you build a SMART on FHIR application and want to deploy it across multiple health systems, each EHR instance, whether that's an Epic installation at one hospital network or a Cerner deployment at another, requires its own client registration. Each site runs its own authorization server, and each authorization server maintains its own client registry. If you're onboarding ten health systems, you're managing ten separate sets of credentials, ten separate redirect URI configurations, and ten separate token lifetimes.
That operational overhead multiplies further when you account for multi-tenant architectures, where a single platform serves many different healthcare organizations simultaneously. Without dynamic registration, your engineering team spends significant time on registration logistics instead of building product. DCR shifts that work from a manual, per-site process to an automated, API-driven one, which is exactly what large-scale healthcare integrations require.
Even outside healthcare, any platform that allows third-party developers to build integrations benefits from dynamic registration. API marketplaces, identity federation services, and enterprise SSO deployments all face the same scaling challenge: client populations grow faster than manual processes can accommodate. DCR gives you a repeatable, auditable, and automatable path for managing that growth without adding operational overhead proportional to the number of clients you need to register.
Which specs define OIDC dynamic registration
OpenID Connect Dynamic Client Registration sits at the intersection of two separate but complementary IETF specifications. Understanding which document covers what helps you implement the feature correctly and know where to look when you hit a question the code doesn't answer.

RFC 7591: The core registration spec
RFC 7591, titled "OAuth 2.0 Dynamic Client Registration Protocol," is the foundational document. It defines the registration endpoint, the required and optional metadata fields a client can submit, the HTTP methods involved, and the response structure the server returns. The spec is technically scoped to OAuth 2.0, but OpenID Connect builds directly on top of it and extends it with additional OIDC-specific metadata fields, such as id_token_signed_response_alg and userinfo_encrypted_response_enc. When you're implementing dynamic registration for an OIDC context, RFC 7591 is your starting point for the protocol mechanics.
The OpenID Foundation publishes a separate "OpenID Connect Dynamic Client Registration 1.0" specification that layers OIDC-specific metadata on top of RFC 7591, and you should read both documents together rather than treating either as self-contained.
RFC 7592: Managing clients after registration
RFC 7592 handles what happens after the initial registration. Where RFC 7591 covers the creation of a client record, RFC 7592 defines the client configuration endpoint, which lets your application read, update, or delete its own registration using a registration access token the server issues during the initial response. If your system needs to rotate credentials, update redirect URIs, or decommission clients programmatically, RFC 7592 is the spec that governs that lifecycle. Not every authorization server implements RFC 7592 alongside RFC 7591, so confirming support before you rely on it in production is worth doing early.
How discovery ties into DCR
The OpenID Connect Discovery specification (defined at openid.net) connects directly to dynamic registration by publishing the registration_endpoint URL in the provider's metadata document. When your client fetches the discovery document at /.well-known/openid-configuration, the registration_endpoint field tells your code exactly where to send registration requests without hardcoding URLs. This makes discovery a practical dependency for any fully automated DCR flow, because it lets your application locate and use the registration endpoint dynamically rather than requiring a static configuration value per environment.
How the DCR flow works end to end
The OpenID Connect Dynamic Client Registration flow follows a predictable sequence of HTTP calls. Your application locates the registration endpoint, sends a POST request with its metadata, and receives credentials in the response. Understanding each step helps you implement the flow correctly and debug it when something goes wrong.

Fetching the discovery document
Your first call goes to the authorization server's OpenID Connect Discovery document, typically located at /.well-known/openid-configuration. That document returns a JSON object containing metadata about the provider, including its supported scopes, signing algorithms, and the registration_endpoint URL. Pulling this document first rather than hardcoding the registration URL means your client adapts automatically when a provider changes its configuration, which makes your integration more resilient across environments.
Sending the registration request
Once you have the registration_endpoint, you send an HTTP POST request with a JSON body containing the client metadata you want registered. At minimum, that means a redirect_uris array and the grant_types your application needs. Most servers also expect client_name, token_endpoint_auth_method, and any response types your flows require. Some authorization servers protect the registration endpoint with an initial access token, which you include as a Bearer token in the Authorization header. If the endpoint is open, no Authorization header is required, though open endpoints are uncommon in production systems.
An initial access token is a short-lived credential the authorization server issues out-of-band to control who can register new clients. Treat it like a provisioning secret and never expose it in client-side code.
Processing the server response
A successful registration returns HTTP 201 Created with a JSON body that includes the client_id the server assigned, a client_secret if the authentication method requires one, and a registration_access_token paired with a registration_client_uri. That last pair is what RFC 7592 uses for subsequent management operations. Your application should store these values securely at registration time because the server does not guarantee you can retrieve the client_secret again after the initial response. From this point forward, your client uses the issued client_id and secret in standard OAuth token requests just as any statically registered client would.
Client metadata: what to send and what you get back
The metadata you include in your registration request determines how the authorization server configures your client record. OpenID Connect Dynamic Client Registration defines both required and optional fields through RFC 7591, and choosing the right values upfront saves you from updating the registration later. Sending accurate, complete metadata on the first request keeps your integration clean and your credentials valid from day one.
Required and commonly used request fields
RFC 7591 technically requires only one field: redirect_uris, which must be an array containing at least one URI. In practice, authorization servers enforce additional fields beyond the minimum, so your request should include client_name, grant_types, response_types, and token_endpoint_auth_method. Setting token_endpoint_auth_method to client_secret_basic or private_key_jwt tells the server how your client will authenticate at the token endpoint, which directly affects what credentials the server issues in the response.
| Field | Type | Purpose |
|---|---|---|
redirect_uris |
Array | Required. Allowed redirect destinations. |
grant_types |
Array | e.g., authorization_code, client_credentials |
response_types |
Array | e.g., code, token |
token_endpoint_auth_method |
String | How the client authenticates |
client_name |
String | Human-readable label for the client |
scope |
String | Space-separated list of requested scopes |
Submitting a scope value the authorization server doesn't support won't necessarily fail the registration, but the server may silently narrow the approved scopes, so always verify the returned scope value against what you submitted.
What the server response contains
A successful registration returns a JSON response body that mirrors your submitted metadata and adds server-generated fields. The most critical fields are client_id, client_secret (when applicable), client_id_issued_at, and client_secret_expires_at. Your application must capture and store these values immediately because the server issues the secret once and does not expose a retrieval endpoint for it afterward.
Beyond credentials, the response includes registration_access_token and registration_client_uri, which you use for management operations under RFC 7592. Confirm that the scope and grant_types values in the response match what you requested, rather than a restricted subset the server applied without warning.
Managing clients after registration
Once RFC 7591 issues your client credentials, RFC 7592 takes over for the ongoing lifecycle. The registration access token the server returns in the initial response is what gives your application the right to read, modify, or delete its own client record later, without requiring admin access to the authorization server's console. In OpenID Connect Dynamic Client Registration workflows, this token acts as a bearer credential scoped exclusively to your client's configuration endpoint, which the server also returns as registration_client_uri in the initial response body.
Reading and updating your client record
Your application reads its current configuration by sending an HTTP GET request to the registration_client_uri with the registration access token in the Authorization header. The server responds with the full client metadata object it holds on file, which lets you verify that stored values match what your application expects. This is especially useful after environment migrations or partial configuration changes, where drift between what you think was registered and what the server actually holds can cause silent authentication failures.
Updating the record uses an HTTP PUT request to the same URI, with a complete JSON body representing the new desired metadata. RFC 7592 requires the full metadata payload on updates, not a partial patch, so your request must include all fields you want to keep, not just the ones you're changing. If you omit a previously registered field, the server treats that as an intentional removal and clears the value.
Always read the current record before sending a PUT request so you can merge your changes onto the existing metadata rather than accidentally dropping fields you didn't intend to modify.
Deleting a client registration
When a client reaches end of life, you decommission it by sending an HTTP DELETE request to the registration_client_uri. A successful deletion returns HTTP 204 with no body, and the server invalidates the client ID immediately. Any in-flight token requests using that client ID fail from that point forward. Automating deletion as part of your application teardown or tenant offboarding workflow keeps your authorization server's client registry clean and eliminates orphaned credentials that could pose a security risk if the registration access token were ever exposed.
Security and production hardening checklist
Deploying openid connect dynamic client registration in a production environment introduces real risks if you treat the registration endpoint as an afterthought. The same API convenience that lets applications register themselves automatically also gives an attacker a direct path to creating unauthorized clients on your authorization server if you leave the endpoint unprotected. Addressing security at the protocol layer, the credential layer, and the audit layer keeps your implementation safe without sacrificing the automation benefits DCR provides.
Protecting the registration endpoint
Your registration endpoint should never be open to anonymous requests in a production system. Require an initial access token for every new registration, issue those tokens out-of-band through a controlled provisioning process, and set short expiration times so that a leaked token has a limited window of usefulness. Restrict the endpoint to known IP ranges where your architecture allows it, and enforce TLS on every request without exception, because registration payloads carry client metadata that you don't want transmitted in plaintext.
Treat the initial access token the same way you treat a database provisioning credential: generate it programmatically, deliver it through a secure channel, and revoke it immediately after use.
Credential handling and rotation
Never store the client_secret the server returns in plaintext configuration files, environment variable dumps, or version control. Use a secrets manager such as AWS Secrets Manager or Azure Key Vault to store and retrieve registration credentials at runtime. Set a deliberate client_secret_expires_at policy on your authorization server and build automated rotation logic into your application so that expiring secrets trigger a credential refresh through RFC 7592 before the old secret fails in production.
Auditing and scoping client records
Every client you register should request only the scopes it actually needs, nothing broader. Over-provisioned clients expand your attack surface if credentials are ever compromised. Log every registration request and every RFC 7592 management operation, including reads, updates, and deletions, so your audit trail reflects the full lifecycle of each client record. Review your authorization server's client registry periodically to identify stale registrations from decommissioned services and delete them before they become orphaned credentials.

Key takeaways
OpenID Connect Dynamic Client Registration transforms what was once a manual, error-prone process into a repeatable, API-driven workflow. RFC 7591 defines the registration endpoint and metadata structure, RFC 7592 covers lifecycle management operations, and OIDC Discovery ties everything together by publishing the registration endpoint URL automatically. You send a POST request with your client metadata, get credentials back, and use the registration access token for any future updates or deletions.
For healthcare developers especially, DCR removes the per-site registration bottleneck that makes scaling SMART on FHIR integrations across multiple EHR systems so painful. Protecting the registration endpoint with initial access tokens, storing credentials in a secrets manager, and auditing every client lifecycle operation keeps your implementation production-ready. If you want to skip building this infrastructure entirely, launch your SMART on FHIR app and let a managed platform handle the authorization layer for you.
The Future of Patient Logistics
Exploring the future of all things related to patient logistics, technology and how AI is going to re-shape the way we deliver care.