Overview
Instead of passing all authorization parameters directly in the URL (which can create very large QR codes), the verifier can provide a reference URI. The wallet then retrieves the full request object from this endpoint.Request Modes
The VCVerifier supports three modes for requesting authentication:- urlEncoded - Parameters passed directly in URL
- byValue - Signed JWT passed as value in URL
- byReference - Reference URI provided, request retrieved via this endpoint (recommended)
Recommended Mode: “byReference” is recommended because request objects can become large, especially with complex presentation definitions. This mode keeps QR codes small and manageable.
GET /api/v1/request/
Retrieve a JWT-encoded request object by its reference ID.Request
The unique identifier for the request object. This is typically provided in the
request_uri parameter during the authentication flow initialization.Format: UUID or URNExample: urn:uuid:274e7465-cc9d-4cad-b75f-190db927e56aResponse
Content-Type:text/html (note: despite the content type, the response is a JWT string)
Body: JWT-encoded signed request object
Status Codes:
200- Request object retrieved successfully400- Invalid request ID or request not found
Example Flow
Step 1: Initial Authorization Request
The authentication flow starts with a connection string containing arequest_uri:
client_id- The DID of the verifierrequest_uri- URL to retrieve the full request objectrequest_uri_method- HTTP method to use (alwaysget)
Step 2: Retrieve Request Object
The wallet makes a GET request to therequest_uri:
Request Object Structure
The retrieved JWT contains the full authorization request parameters.JWT Header
The signing algorithm used to sign the request object. Configured via
requestKeyAlgorithm in the verifier settings.Example: ES256, RS256JWT Payload
Request Object Fields
The identifier of the verifier. Can be a DID or other identifier type (e.g.,
x509_san_dns).Example: did:key:z6MkigCEnopwujz8Ten2dzq91nvMjqbKQYcifuZhqBsEkH7gThe issuer of the request object. Typically matches
client_id.Expiration time of the request object in seconds from issuance. Configured via
sessionExpiry setting.Default: 30 secondsRandom value to prevent replay attacks. Generated uniquely for each authentication session.Example:
BfEte4DFdlmdO7a_fBiXTwSession identifier used to correlate the response with this request.Format: UUIDExample:
274e7465-cc9d-4cad-b75f-190db927e56aThe type of response expected. Always
vp_token for OIDC4VP flows.How the response should be returned. Typically
direct_post for OIDC4VP.The URI where the wallet should submit the authentication response.Example:
https://verifier.example.org/api/v1/authentication_responseThe requested scope. Configured based on the service/client configuration.Example:
openid, dsba.credentials.presentation.PacketDeliveryServiceThe DIF Presentation Exchange definition specifying what credentials are requested.See detailed structure below.
Presentation Definition Structure
Unique identifier for this presentation definition.Example:
my-presentationArray of descriptors defining the required credentials.
Unique identifier for this input descriptor.Example:
my-descriptorConstraints that the submitted credentials must satisfy.
Acceptable credential formats.Supported formats:
ldp_vc- JSON-LD Verifiable Credentialsjwt_vc- JWT Verifiable Credentialssd+jwt-vc- Selective Disclosure JWT VCs
Configuration
To enable request by reference mode, the verifier must be properly configured:Required Configuration
Supported Identifier Types
Decentralized Identifier. The verifier’s DID document must be resolvable and contain the public key.Example:
did:key:z6MkigCEnopwujz8Ten2dzq91nvMjqbKQYcifuZhqBsEkH7gX.509 certificate-based identification. Requires
certificatePath to be configured with the full certificate chain.Example: verifier.example.orgSecurity Considerations
Request Object Signing
The request object is signed using the verifier’s private key. Wallets should:- Verify the signature using the public key from the verifier’s DID document or certificate
- Validate the issuer matches the expected verifier
- Check expiration to ensure the request hasn’t expired
- Validate the nonce to prevent replay attacks
Request Expiry
Request objects have a short expiry time (default 30 seconds) to minimize the window for replay attacks. Theexp claim specifies the expiration time in seconds from issuance.
If a wallet receives an expired request object, it should request a new authentication flow. The expiry time can be configured via the
sessionExpiry setting.HTTPS Required
Therequest_uri must use HTTPS in production to prevent man-in-the-middle attacks. The verifier should reject non-HTTPS request URIs unless in a development environment.
Comparison of Request Modes
| Feature | urlEncoded | byValue | byReference |
|---|---|---|---|
| QR Code Size | Large | Very Large | Small |
| Requires Signing | No | Yes | Yes |
| Dynamic Updates | No | No | Possible |
| Network Request | No | No | Yes |
| Recommended For | Simple requests | N/A | Production use |
urlEncoded Example
byValue Example
byReference Example (Recommended)
Error Responses
Brief error description.
Detailed error information.
Common Errors
400 - Request Not Found
400 - Invalid Request ID
Related Endpoints
- Authentication Response - Submit the VP token after retrieving the request
- Authorization Endpoint - Start the authentication flow
- Same Device Flow - Initiate same-device authentication