All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
build.clj now writes the v-prefixed git tag (e.g. v0.7.1) to the pom's <scm><tag>, so cljdoc can locate the release revision on GitHuboffline_access scope in addition to the client having refresh_token in grant-types, per OIDC Core §11scopes_supported when the client omits the scope field, per RFC 7591 §2oidcc-test-plan) via clojure -M:conformance-comprehensive — exercises PKCE, dynamic client registration, refresh tokens, request objects, and strict redirect URI validation beyond the Basic OP certification profile:scopes-supported option in handle-registration-request opts for setting default scopes on dynamically registered clientsoffline_access in the default scopes_supported discovery metadataprompt parameter parsing and validation per OIDC Core §3.1.2.1 — uses Nimbus Prompt/parse to reject invalid combinations (e.g., none with other values) and exposes parsed values as :prompt-values keyword set in the validated request mapvalidate-prompt-none helper for host applications to enforce prompt=none semantics — returns a login_required error redirect when the user is not authenticated, per OIDC Core §3.1.2.6max_age parameter parsing to integer with :max-age in the validated request map per OIDC Core §3.1.2.1 — host applications use this to check authentication freshnessvalidate-max-age helper to check whether the user's authentication is still within the requested max_age windowauth_time claim propagation through authorization code store to ID tokens — when auth-time is supplied to handle-authorization-approval, it flows through code exchange to the auth_time JWT claim per OIDC Core §2invalid_request, unsupported_response_type, invalid_scope sourced from Nimbus OAuth2Error constantsredirect_uri mismatch, unknown client_id, schema failures) include {:redirect false} in ex-data so Ring handlers can display an error page instead of redirectingauthorization-error-response Ring handler that dispatches on the oidc-provider.error type hierarchy — returns 400 for non-redirectable errors, 302 error redirect otherwise::error/unsupported-response-type and ::error/invalid-scope error types in the error hierarchymark-code-exchanged and get-code-tokens methods on AuthorizationCodeStore protocol for consumed-code tracking:additional-audiences opt in generate-id-token — azp claim is set automatically when multiple audiences are present per OIDC Core §2:default-resource client config field for audience binding when RFC 8707 resource indicators are not used — tokens issued for the client are scoped to the default resource URIs unless overridden by an explicit resource parameterat_hash (access token hash) claim in ID tokens via :access-token opt, per OIDC Core §3.1.3.6azp (authorized party) claim in ID tokens via :azp opt, per OIDC Core §2iss, sub, aud, exp, iat, nonce, auth_time, azp, at_hash) in ID tokenshandle-client-update for RFC 7592 §2.2 client metadata update via PUThandle-client-delete for RFC 7592 §2.3 client deregistration via DELETEdelete-client method on ClientStore protocolregistration-response now dispatches PUT and DELETE in addition to POST and GETuserinfo-response for the UserInfo endpoint (OIDC Core §5.3) with Bearer token authenticationtoken-response for the token endpoint with RFC 6749 §5.1 compliant Cache-Control: no-store and Pragma: no-cache headers on all success and error responsesregistration-response for dynamic client registration (RFC 7591) and client read (RFC 7592)revocation-response for token revocation (RFC 7009)oidc-provider.error namespace with keyword hierarchy for structured error dispatch via isa?RingRequest and RingResponse malli schemas in oidc-provider.coreClientRegistration schema in register-client before delegating to the store:allow-http-issuer option for development use with HTTP issuersgrant-types-supported enforcement in token endpoint — grant types not in the provider's allowed list are rejected with unsupported_grant_type error per RFC 6749 §5.2unsupported_grant_type error code in ex-data for unknown or disabled grant typestoken_endpoint_auth_method for dynamic registration is now client_secret_basic per RFC 7591 §2 (was incorrectly none)handle-registration-request accepts an optional opts map with :clock and :registration-endpointoidc-provider.ring namespace deleted — all Ring response functions now live in oidc-provider.core (token-response, registration-response, revocation-response, userinfo-response):body values are now plain Clojure maps (keyword keys), not JSON strings — integrators must add wrap-json-response middleware for JSON serializationregistration-response expects :body to be a pre-parsed map (via wrap-json-body middleware), not a raw input streamdynamic-read-client and handle-client-read now return the client config map directly on success and throw ex-info on failure, instead of returning Ring-style {:status :body} mapsregistration-handler, revocation-handler, userinfo-handler) replaced by direct response functions that take [provider request] and return a Ring response maphandle-revocation-request now returns :ok on success and throws ex-info on failure, instead of returning Ring response mapstoken-error-response, token-success-response, registration-error-response) removed from domain namespacesex-info throws now include a :type keyword from the oidc-provider.error hierarchy, enabling structured dispatch via isa?m/=> schemas added to all public functions in oidc-provider.corevalid-web-redirect-uri?, valid-native-redirect-uri?, valid-redirect-uri-https-only?)client_secret_expires_at (value 0 for non-expiring) when a client_secret is issued, per RFC 7591 §3.2.1client_id_issued_at with epoch seconds timestamp per RFC 7591 §3.2.1registration_client_uri when registration endpoint is configured, per RFC 7592grant_types_supported now includes client_credentials in the default setrequest_uri_parameter_supported, request_parameter_supported, and claims_parameter_supported boolean flags per OIDC Discovery §3WWW-Authenticate: Bearer header per RFC 6750 §3:state and :redirect_uri in ex-data per RFC 6749 §4.1.2.1jwks-uri are now optional — the provider can be used as a plain OAuth2 server without OpenID Connectapplication_type field in client registration (web or native, defaults to web) per OpenID Connect Dynamic Client Registration 1.0cursor://, com.example.app://) accepted as redirect URIs for native clients per RFC 8252 Section 7.1application_type) no longer accept HTTP loopback redirect URIs. Set application_type to native for loopback redirects.client_credentials grant (RFC 6749 §4.4)token_endpoint_auth_method is now enforced during client authentication, including clients without the field (defaults to client_secret_basic for confidential, none for public)client_secret_post clients now reject requests missing client_secret in POST bodyclient_secret_basic clients now ignore redundant client_secret in POST params instead of rejectingverify-client-secret returns false on any exception from malformed hash input[::1]) for HTTPtoken_endpoint_auth_method values now fail with invalid_client instead of silently bypassing authenticationclient_credentials grant typedeps.edn/Leiningen coordinatesedpaget instead of edwardpaget):client-secret-hash; plaintext :client-secret field removed from ClientConfig schemahandle-registration-request and handle-client-read now expect and return keyword keys (e.g., :redirect_uris, :client_id) instead of string keys. Callers passing parsed JSON must use (json/parse-string body true) or equivalent to produce keyword maps.parse-authorization-request now accepts a pre-parsed keyword params map instead of a raw query string. Callers should use Ring's wrap-params/wrap-keyword-params middleware or equivalent to parse query parameters before passing them in. The :resource parameter accepts a string or vector and is normalized to a vector.initial-access-token option from registration-handler; use application-level middleware to gate registration accessfetch-metadata-document blocks requests to private, loopback, and link-local addressesfetch-metadata-document now enforces body size limits during streaming read, preventing memory exhaustion from oversized responsestoken_type_hint to optimize token lookup per RFC 7009 §2.1client_id_metadata_document_supported discovery metadata fieldiss parameter when provider config lacks an issuerCache-Control: no-store and Pragma: no-cache headers per RFC 6749 §5.1Content-Type: application/x-www-form-urlencoded to mitigate cross-origin request forgeryiss (issuer) parameter to authorization responses per RFC 9207 to prevent mix-up attacksgrant-types include "refresh_token"validate-id-token uses injected clock instead of Date. for testable time handlingCache-Control: no-store and Pragma: no-cache headers per RFC 6749 §5.1parse-basic-auth returns nil instead of throwing NPE on malformed Base64 credentials without a colon separatorclient-config->response no longer includes hashed registration_access_token in its output:signing-keys configuration for graceful JWKS key rotation:rotate-refresh-tokens, defaults to true):client-type field ("confidential" / "public") on client model, derived from token_endpoint_auth_method during registration:refresh-token-ttl-seconds provider config optionjava.time.Clock via :clock provider config option for testable time handlingresource parameters (RFC 8707) should be passed in the params map as a string or vector, as produced by Ring's wrap-params middleware:client-type instead of probing for :client-secret, fixing false-positive public detection when secrets are hashedid_token when openid scope is presentredirect_uri matching per RFC 6749 §4.1.3TokenStore/save-refresh-token protocol method now takes an expiry parameter (milliseconds epoch or nil)ProviderConfig now requires a :clock key (java.time.Clock instance)Can you improve this documentation? These fine people already did:
Edward Paget, github-actions[bot] & Chris TruterEdit on GitHub
cljdoc builds & hosts documentation for Clojure/Script libraries
| Ctrl+k | Jump to recent docs |
| ← | Move to previous article |
| → | Move to next article |
| Ctrl+/ | Jump to the search field |