React / Vite
Browser application starter
CIMD lets an OAuth client identify itself with a URL instead of a pre-registered client ID. The URL points to a JSON document containing the client's metadata.
A Client ID Metadata Document is a JSON document served at a stable HTTPS URL. It contains familiar OAuth registration metadata such as client_name, client_uri, and redirect_uris.
The URL is the client_id. An authorization server can fetch and validate the document when needed, removing the need to register the same client separately with every server.
The metadata document is the registration.
Serve a JSON document at an HTTPS URL. Its client_id must exactly match that URL.
Pass the metadata URL as client_id in the OAuth authorization request.
The authorization server fetches the JSON, checks its fields, and can display the client identity during consent.
{
"client_id": "https://example.com/oauth/client-metadata.json",
"client_name": "My OAuth app",
"redirect_uris": ["https://example.com/oauth/callback"],
"token_endpoint_auth_method": "none"
}
https://cimd.cerberauth.com lists reusable templates for common OAuth clients. Start with one locally, then update its values for your application.
Browser application starter
Server-side application starter
No framework or build step
From local development to production
Copy a template and replace the example metadata, especially client_id, redirect URIs, and application details. For production, serve the updated document from a permanent HTTPS URL on a domain you control. Development templates and expiring service URLs are not production client identities.
The CIMD service can provision a temporary document for development, including localhost redirect URIs. Provisioned documents expire and are for development and testing only.
curl -X POST https://cimd.cerberauth.com/api/clients \
-H "Authorization: Bearer $CIMD_API_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"client_name":"My Dev App","redirect_uris":["http://localhost:5173/callback"],"token_endpoint_auth_method":"none"}'