Security Considerations
The Verifier's security model covers transport, authentication, request binding, and credential integrity:
Transport Security: All communication occurs over HTTPS, safeguarding data in transit. OpenID4VP requires HTTPS in production; plain HTTP is only permitted in development when explicitly enabled.
Authentication & Authorization: Verifier endpoints require a valid OIDC bearer token, sent as
Authorization: Bearer <token>and validated against your identity provider's JWKS endpoint (OIDC_JWKS_URL). Authenticated principals are derived from the token's claims, and administrative routes additionally enforce theadminrole fromrealm_access.roles(client roles inresource_access.<client>.rolesare also accepted). Store and transmit tokens securely; never expose them client-side. A small set of endpoints is public by design: the health and version routes (GET /,GET /version), hosteddid:webdocuments (GET /:uuid/did.json, also served at/:uuid/.well-known/did.json), the Swagger docs (GET /api-docs,GET /api-docs-json), and the wallet-facing OpenID4VP protocol endpoints mounted by the underlying Credo agent (public by protocol design).Nonce and State Binding: Authorization requests and presentation responses are bound together by unique, time-bound values defined by the OpenID4VP protocol. This binding prevents replay attacks and ensures a presentation can only be accepted for the request it was issued against.
Signed Authorization Requests: Each authorization request is signed with the verifier's DID, so wallets can authenticate the relying party before disclosing any data. The signing DID is taken from the
verifierIdwhen it is itself a DID, or from the optionalsigningDidfield in the request body.Credential Integrity: The Verifier validates credential signatures and resolves the issuer's DID document to confirm authenticity, rejecting credentials that fail authenticity or integrity checks. SD-JWT selective disclosure is honored so only the claims the holder chooses to reveal are processed.
Minimal Data Exposure: The Verifier only processes the claims required by your authorization request (expressed via DCQL or a Presentation Exchange definition). It does not request or retain unnecessary information, preserving holder privacy.
Rate Limiting: The service applies a global request rate limit (60 requests per 60 seconds) to mitigate abuse and brute-force attempts. Account for this limit when designing high-volume verification flows and retry logic.
Monitoring and Logging: Maintain logs and monitor for suspicious activity, such as repeated failed verifications or token validation errors.
Error Handling: Avoid exposing sensitive details in error responses. The service returns a consistent error shape (
statusCode,message,path,timestamp); surface generic user-facing messages and keep technical details in your internal logs.
For local development without tokens, see the development bypass in Authentication.
Last updated