@@ -54,14 +54,32 @@ An authorized registry client can create an offer after it evaluates the
5454authoritative record through ` POST /v1/evaluations ` . This path does not use the
5555citizen browser or identity-provider callback.
5656
57- The machine credential must be an external configured API key or OpenID
58- Connect (OIDC) token. A Notary-issued wallet access token is not accepted. The
59- credential needs ` registry_notary:credential_offer_create ` , the selected
60- credential configuration's scope, and access to the evaluation's exact
61- service, purpose, claims, and target. It must carry Registry Notary
62- ` authorization_details ` that permit ` create_credential_offer ` for the exact
63- target, complete claim set, value disclosure, claim-result format, purpose,
64- service, and machine access mode.
57+ Generated projects admit registrar OIDC clients explicitly:
58+
59+ ``` yaml
60+ oid4vci :
61+ public_base_url : https://notary.example.gov
62+ registrar_clients : [opencrvs-registrar]
63+ ` ` `
64+
65+ Registryctl keeps these clients on the same pinned authorization server and
66+ JWKS as the citizen client, but requires the Notary ` public_base_url` as the
67+ machine resource audience. The signed `JWT` access token needs a stable `sub`
68+ that matches the evaluation owner, an admitted `azp` or `client_id`,
69+ ` registry_notary:credential_offer_create` , the selected credential
70+ configuration's scope, and exact Registry Notary `authorization_details`.
71+ Those details must permit `create_credential_offer` for the target, complete
72+ claim set, value disclosure, claim-result format, purpose, service, and
73+ machine access mode. Identify the target with the evaluated primary
74+ identifier's scheme and value. When an entity has only a top-level
75+ ` target.id` , use the reserved authorization `id_type` value `id`; this keeps
76+ typed identifiers distinct from the untyped top-level ID.
77+
78+ An admitted registrar client with the machine resource audience needs only
79+ the access token; citizen userinfo and ID-token assurance are not required.
80+ Any citizen client or citizen audience signal still selects the citizen path,
81+ so mixed client/audience tokens cannot retain machine authority. A
82+ Notary-issued wallet access token is not accepted.
6583
6684Send only the stored evaluation identifier and configured credential type :
6785
@@ -112,6 +130,9 @@ transaction. Reusing the key for another request, using another key for an
112130evaluation already reserved for issuance, or racing two requests returns
113131` 409` . A client-scoped quota can return `429`. Retry a lost response with the
114132original key; do not start another evaluation or invent a second key.
133+ Exact replays, known idempotency conflicts, and consumed-evaluation preflights
134+ do not call the signer. A genuinely new attempt consumes client quota before
135+ signer work, so signer failures still count toward abuse protection.
115136
116137The wallet then redeems the offer through `/oid4vci/token` and
117138` /oid4vci/credential` . The pre-authorized code, access token, proof nonce,
0 commit comments