Present a Digital Credential (W3C, SD-JWT VC) via OID4VP using External Signatures
There are several methods by which a user can present a credential to a verifier, and all are supported by the wallet API:
- User may receive a direct link, which opens the wallet and prompts credential sharing.
- A website may display a QR code for the user to scan and share the credential.
- The user may manually input a credential presentation request URL string into a text field.
Irrespective of the chosen method, these are just different ways of receiving, parsing and fulfilling a credential presenting request URL.
Credential Presentation Request URL
A credential presentation URL is a standardised method, as per the OID4VP specification, to communicate the needed
credentials and claims from verifier to the wallet. The URL can take various forms, such as QR code or a link, and
generally begins with openid4vp://
or haip://
.
Example Presentation Request
openid4vp://authorize
?response_type=vp_token
&client_id=<client_id>
&response_mode=direct_post
&state=<state>
&presentation_definition=<presentation_definition>
&client_id_scheme=redirect_uri
&response_uri=<response_uri>
The most important parameter for us will be the presentation_definition
. The others are more important for internal
behaviour of the wallet, response types, formats and secure communication between wallet and verifier, which we don't
need to worry about for the moment as the wallet-api will manage all of this for us. In a more advanced guide we will
also dive into the other parameters.
The Presentation Definition
The presentation definition specifies the criteria for the wallet to know what credentials and claims should be requested from the user and shard with the verifier.
Example
{
"input_descriptors": [
{
"id": "VerifiableId",
"format": {
"jwt_vc_json": {
"alg": [
"EdDSA"
]
}
},
"constraints": {
"fields": [
{
"path": [
"$.type"
],
"filter": {
"type": "string",
"pattern": "VerifiableId"
}
}
]
}
}
]
}
The definition says that one credential is requested in the JWT format, specifically with the algorithm "EdDSA" and it must be of type "VerifiableId", as indicated by the constraint that filters for this specific string pattern in the credential's type field. You can find more info about definition documents here.
Fulfilling A Presentation Request
In order to fulfill the presentation request received by the verifier, we need to go through the following steps:
- Extract Presentation Definition from OID4VC presentation request
- Find credentials matching the presentation definition in the user wallet
- Request consent from the end-user of the wallet to share the credentials
- Wrapping the credentials in a Verifiable Presentation and signing it using the holder key
- (optional) Redirect the user to the verification result page returned from the verifier
1. Extract Presentation Definition
A simple example for the JavaScript browser environment would look like the following:
async function decodePresentationURL(offerURL) {
// Create URL object
const url = new URL(offerURL);
// Get `presentation_definition_uri` query parameter
const offerParam = url.searchParams.get("presentation_definition_uri");
// Resolve the URL and get the result
const response = await fetch(offerParam);
if (!response.ok) {
throw new Error('Network response was not ok');
}
// Convert result to text
const resultText = await response.text();
// Decode and parse resultText to an Object
const offerObject = JSON.parse(resultText);
return offerObject;
}
The output of the function would look as follows and will be used in the next step. It's identical to the one example we already saw of a presentation definition.
{
"input_descriptors": [
{
"id": "VerifiableId",
"format": {
"jwt_vc_json": {
"alg": [
"EdDSA"
]
}
},
"constraints": {
"fields": [
{
"path": [
"$.type"
],
"filter": {
"type": "string",
"pattern": "VerifiableId"
}
}
]
}
}
]
}
Optionally decode the presentation request URL with a site like this, then extract
and resolve presentation_definition
by pasting it into your browser search bar.
2. Find Credential(s) Matching Presentation Definition
Use the matchCredentialsForPresentationDefinition
endpoint in the wallet API to find all user credentials matching the
presentation request constraints.
Endpoint:/wallet-api/wallet/{wallet}/exchange/matchCredentialsForPresentationDefinition
| API Reference
Example Request
curl -X 'POST' \
'https://wallet.walt.id/wallet-api/wallet/{wallet_id}/exchange/matchCredentialsForPresentationDefinition' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"input_descriptors": [
{
"id": "VerifiableId",
"format": {
"jwt_vc_json": {
"alg": [
"EdDSA"
]
}
},
"constraints": {
"fields": [
{
"path": [
"$.type"
],
"filter": {
"type": "string",
"pattern": "VerifiableId"
}
}
]
}
}
]
}'
Path Parameters
- wallet_id - Extract needed wallet id parameter via the
/wallet-api/wallet/accounts/wallets
endpoint.
Body
The extracted presentation definition as JSON, as explained here.
{
"input_descriptors": [
{
"id": "VerifiableId",
"format": {
"jwt_vc_json": {
"alg": [
"EdDSA"
]
}
},
"constraints": {
"fields": [
{
"path": [
"$.type"
],
"filter": {
"type": "string",
"pattern": "VerifiableId"
}
}
]
}
}
]
}
Body Parameters
The body takes the extracted presentation definition as JSON, as explained here.
Example Response
If credentials matching the presentation definition are found, a list of these credentials will be returned. If no match is found, an empty list will be returned. Take a note of the credential id(s) returned as we will be needing them in a later step.
[
{
"wallet": "5f2eb7d7-7d04-461c-b93d-28d95efbf15b",
"id": "urn:uuid:fb09ba3d-b73d-49ad-9d88-3d018878ea83",
"document": "eyJraWQiOiJkaWQ6andrOmV5SnJkSGtpT2lKRlF5SXNJbU55ZGlJNklsQXRNalUySWl3aWEybGtJam9pTTFsT1pEbEdibmc1U214NVVGWlpkMmRYUmtVek4wVXpSM2RKTUdWSGJFTkxPSGRHYkZkNFIyWndUU0lzSW5naU9pSkdiM1paTWpGTVFVRlBWR3huTFcwdFRtVkxWMmhhUlV3MVlVWnlibEl3ZFdOS2FrUTFWRXR3UjNWbklpd2llU0k2SWtOeVJrcG1SMVJrVURJNVNrcGpZM0JSV0hWNVRVOHpiMmgwZW5KVWNWQjZRbEJDU1ZSWmFqQnZaMEVpZlEiLCJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiJ9.eyJpc3MiOiJkaWQ6andrOmV5SnJkSGtpT2lKRlF5SXNJbU55ZGlJNklsQXRNalUySWl3aWEybGtJam9pTTFsT1pEbEdibmc1U214NVVGWlpkMmRYUmtVek4wVXpSM2RKTUdWSGJFTkxPSGRHYkZkNFIyWndUU0lzSW5naU9pSkdiM1paTWpGTVFVRlBWR3huTFcwdFRtVkxWMmhhUlV3MVlVWnlibEl3ZFdOS2FrUTFWRXR3UjNWbklpd2llU0k2SWtOeVJrcG1SMVJrVURJNVNrcGpZM0JSV0hWNVRVOHpiMmgwZW5KVWNWQjZRbEJDU1ZSWmFqQnZaMEVpZlEiLCJzdWIiOiJkaWQ6andrOmV5SnJkSGtpT2lKUFMxQWlMQ0pqY25ZaU9pSkZaREkxTlRFNUlpd2lhMmxrSWpvaVEyVTVNbGczUVhVMVRuQlRWV0ZoWlU5VFl6TkpSMjlDTFVacFNUTmtaMjFYT1Y5c2NGTldja3hrYXlJc0luZ2lPaUpIY1VabWRqbFNjemh1TlRrMk4wSXlVR3g0TW1wbFduRnlOWFZxVkRoM2RYWk5XbEpIYlZoeGVFSkZJbjAiLCJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiVmVyaWZpYWJsZUF0dGVzdGF0aW9uIiwiVmVyaWZpYWJsZUlkIl0sImNyZWRlbnRpYWxTY2hlbWEiOnsiaWQiOiJodHRwczovL2FwaS5wcmVwcm9kLmVic2kuZXUvdHJ1c3RlZC1zY2hlbWFzLXJlZ2lzdHJ5L3YxL3NjaGVtYXMvMHhiNzdmODUxNmE5NjU2MzFiNGYxOTdhZDU0YzY1YTllMmY5OTM2ZWJmYjc2YmFlNDkwNmQzMzc0NGRiY2M2MGJhIiwidHlwZSI6IkZ1bGxKc29uU2NoZW1hVmFsaWRhdG9yMjAyMSJ9LCJjcmVkZW50aWFsU3ViamVjdCI6eyJjdXJyZW50QWRkcmVzcyI6WyIxIEJvdWxldmFyZCBkZSBsYSBMaWJlcnTDqSwgNTk4MDAgTGlsbGUiXSwiZGF0ZU9mQmlydGgiOiIxOTkzLTA0LTA4IiwiZmFtaWx5TmFtZSI6IkRPRSIsImZpcnN0TmFtZSI6IkphbmUiLCJnZW5kZXIiOiJGRU1BTEUiLCJpZCI6ImRpZDpqd2s6ZXlKcmRIa2lPaUpQUzFBaUxDSmpjbllpT2lKRlpESTFOVEU1SWl3aWEybGtJam9pUTJVNU1sZzNRWFUxVG5CVFZXRmhaVTlUWXpOSlIyOUNMVVpwU1ROa1oyMVhPVjlzY0ZOV2NreGtheUlzSW5naU9pSkhjVVptZGpsU2N6aHVOVGsyTjBJeVVHeDRNbXBsV25GeU5YVnFWRGgzZFhaTldsSkhiVmh4ZUVKRkluMCIsIm5hbWVBbmRGYW1pbHlOYW1lQXRCaXJ0aCI6IkphbmUgRE9FIiwicGVyc29uYWxJZGVudGlmaWVyIjoiMDkwNDAwODA4NEgiLCJwbGFjZU9mQmlydGgiOiJMSUxMRSwgRlJBTkNFIn0sImV2aWRlbmNlIjpbeyJkb2N1bWVudFByZXNlbmNlIjpbIlBoeXNpY2FsIl0sImV2aWRlbmNlRG9jdW1lbnQiOlsiUGFzc3BvcnQiXSwic3ViamVjdFByZXNlbmNlIjoiUGh5c2ljYWwiLCJ0eXBlIjpbIkRvY3VtZW50VmVyaWZpY2F0aW9uIl0sInZlcmlmaWVyIjoiZGlkOmVic2k6MkE5Qlo5U1VlNkJhdGFjU3B2czFWNUNkakh2THBRN2JFc2kySmI2TGRIS25ReGFOIn1dLCJpZCI6InVybjp1dWlkOmZiMDliYTNkLWI3M2QtNDlhZC05ZDg4LTNkMDE4ODc4ZWE4MyIsImlzc3VlZCI6IjIwMjEtMDgtMzFUMDA6MDA6MDBaIiwiaXNzdWVyIjoiZGlkOmp3azpleUpyZEhraU9pSkZReUlzSW1OeWRpSTZJbEF0TWpVMklpd2lhMmxrSWpvaU0xbE9aRGxHYm5nNVNteDVVRlpaZDJkWFJrVXpOMFV6UjNkSk1HVkhiRU5MT0hkR2JGZDRSMlp3VFNJc0luZ2lPaUpHYjNaWk1qRk1RVUZQVkd4bkxXMHRUbVZMVjJoYVJVdzFZVVp5YmxJd2RXTktha1ExVkV0d1IzVm5JaXdpZVNJNklrTnlSa3BtUjFSa1VESTVTa3BqWTNCUldIVjVUVTh6YjJoMGVuSlVjVkI2UWxCQ1NWUlphakJ2WjBFaWZRIiwidmFsaWRGcm9tIjoiMjAyMS0wOC0zMVQwMDowMDowMFoiLCJpc3N1YW5jZURhdGUiOiIyMDI0LTA4LTIxVDA5OjExOjMzLjI0NjM4OTA0MVoifSwianRpIjoidXJuOnV1aWQ6ZmIwOWJhM2QtYjczZC00OWFkLTlkODgtM2QwMTg4NzhlYTgzIiwiaWF0IjoxNzI0MjMxNDkzLCJuYmYiOjE3MjQyMzE0OTN9.OsPTKQC6tvD6TtxeoCd8FtaIThYrYeYRjCHzDXkmgTUjRw78faT9R2bljT03ncrb0YstK0EmjM9D5lwqMZ9ZIA",
"addedOn": "2024-08-21T09:11:33.284Z",
"format": "jwt_vc"
}
]
3. Get User Consent
Using the result of the previous request, we can now display the credential(s) to the user (owner of the wallet) for confirming the exchange with the verifier.
4. Share Credential(s) with Verifier
To share requested credentials with the verifier, the wallet must sign a VP token. In the regular Wallet API setup, the API also manages the keys and can therefore generate the signatures for the presentation in the background. However, when using external signatures this signature must be created in the system managing the keys.
This is why, the regular
usePresentationRequest endpoint is split into two steps. The first step /prepare
is for the Wallet API to gather all
required information and then respond with structured data that should be either singed or passed to the next
step /submit
. This step finalizes the exchange between wallet and verifier.
Please note that the external signatures are an optional feature of the Wallet API.
It needs to be enabled via the feature.conf by providing
external-signature-endpoints
in the enabledFeatures
array.
Learn more here.
1. Preparation
Using the /prepare
endpoint we will send to the wallet API: The DID owning the credentials, the request from the
verifier
and the credential IDs matching the request from the verifier which we got in the last step.
Endpoint: wallet-api/{wallet}/exchange/external_signatures/presentation/prepare
curl -X 'POST' \
'http://0.0.0.0:7001/wallet-api/{wallet}/exchange/external_signatures/presentation/prepare' \
-H 'accept: */*' \
-H 'Content-Type: application/json' \
-d '{
"did": "did:jwk:eyJrdHkiOiJFQyIsImNydiI6IlAtMjU2Iiwia2lkIjoiWWlkYnltc2loVThaUFEwZ1B3cE1YWmNYM2RIaGxkaldwaEl6clRQaHh4RSIsIngiOiJ6cnVMdHprT2NjYWhNTk5MZjFiTkJVN3AxM254a19CQjU5d1VXelFWVG1jIiwieSI6Inp4UUV1NFF4bmVlQnNGYXNTYkptVjNoUUhJYXVGb3FsNWR6Z1VyTzJ0UjgifQ",
"presentationRequest": "openid4vp://authorize?response_type=vp_token&client_id=http%3A%2F%2Flocalhost%3A22222%2Fopenid4vc%2Fverify&response_mode=direct_post&state=RVgQIBRCUy0J&presentation_definition_uri=http%3A%2F%2Flocalhost%3A22222%2Fopenid4vc%2Fpd%2FRVgQIBRCUy0J&client_id_scheme=redirect_uri&client_metadata=%7B%22authorization_encrypted_response_alg%22%3A%22ECDH-ES%22%2C%22authorization_encrypted_response_enc%22%3A%22A256GCM%22%7D&nonce=15c72cd0-8c84-45dc-aae2-a310f6075a8f&response_uri=http%3A%2F%2Flocalhost%3A22222%2Fopenid4vc%2Fverify%2FRVgQIBRCUy0J",
"selectedCredentialIdList": [
"urn:uuid:a072cdef-4912-4cdf-99cb-63c0ad7eeed1"
]
}'
Path Parameters
wallet
: - You can receive the needed wallet id parameter via the/wallet-api/wallet/accounts/wallets
endpoint.
Body Parameters
did
- DID to owning credential(s) to be presented.presentationRequest
- the presentation request from the verifier.selectedCredentialIdList
- IDs of the credential(s) which should be presented. Response from/matchCredentialForPresentationDefinition
endpoint.
Example Response
{
"did": "did:jwk:eyJrdHkiOiJFQyIsImNydiI6IlAtMjU2Iiwia2lkIjoiWWlkYnltc2loVThaUFEwZ1B3cE1YWmNYM2RIaGxkaldwaEl6clRQaHh4RSIsIngiOiJ6cnVMdHprT2NjYWhNTk5MZjFiTkJVN3AxM254a19CQjU5d1VXelFWVG1jIiwieSI6Inp4UUV1NFF4bmVlQnNGYXNTYkptVjNoUUhJYXVGb3FsNWR6Z1VyTzJ0UjgifQ",
"presentationRequest": "openid4vp://authorize?response_type=vp_token&client_id=http%3A%2F%2Flocalhost%3A22222%2Fopenid4vc%2Fverify&response_mode=direct_post&state=RVgQIBRCUy0J&presentation_definition_uri=http%3A%2F%2Flocalhost%3A22222%2Fopenid4vc%2Fpd%2FRVgQIBRCUy0J&client_id_scheme=redirect_uri&client_metadata=%7B%22authorization_encrypted_response_alg%22%3A%22ECDH-ES%22%2C%22authorization_encrypted_response_enc%22%3A%22A256GCM%22%7D&nonce=15c72cd0-8c84-45dc-aae2-a310f6075a8f&response_uri=http%3A%2F%2Flocalhost%3A22222%2Fopenid4vc%2Fverify%2FRVgQIBRCUy0J",
"selectedCredentialIdList": [
"urn:uuid:a072cdef-4912-4cdf-99cb-63c0ad7eeed1"
],
"presentationSubmission": {
"id": "urn:uuid:c85e079e-d194-44cd-8268-85f4ee819fef",
"definition_id": "urn:uuid:c85e079e-d194-44cd-8268-85f4ee819fef",
"descriptor_map": [
{
"id": "OpenBadgeCredential",
"format": "jwt_vp",
"path": "$",
"path_nested": {
"id": "OpenBadgeCredential",
"format": "jwt_vc_json",
"path": "$.verifiableCredential[0]",
"customParameters": {}
}
}
],
"customParameters": {}
},
"w3CJwtVpProofParameters": {
"header": {
"kid": "did:jwk:eyJrdHkiOiJFQyIsImNydiI6IlAtMjU2Iiwia2lkIjoiWWlkYnltc2loVThaUFEwZ1B3cE1YWmNYM2RIaGxkaldwaEl6clRQaHh4RSIsIngiOiJ6cnVMdHprT2NjYWhNTk5MZjFiTkJVN3AxM254a19CQjU5d1VXelFWVG1jIiwieSI6Inp4UUV1NFF4bmVlQnNGYXNTYkptVjNoUUhJYXVGb3FsNWR6Z1VyTzJ0UjgifQ#0",
"typ": "JWT"
},
"payload": {
"sub": "did:jwk:eyJrdHkiOiJFQyIsImNydiI6IlAtMjU2Iiwia2lkIjoiWWlkYnltc2loVThaUFEwZ1B3cE1YWmNYM2RIaGxkaldwaEl6clRQaHh4RSIsIngiOiJ6cnVMdHprT2NjYWhNTk5MZjFiTkJVN3AxM254a19CQjU5d1VXelFWVG1jIiwieSI6Inp4UUV1NFF4bmVlQnNGYXNTYkptVjNoUUhJYXVGb3FsNWR6Z1VyTzJ0UjgifQ",
"nbf": 1727428853,
"iat": 1727428913,
"jti": "urn:uuid:c85e079e-d194-44cd-8268-85f4ee819fef",
"iss": "did:jwk:eyJrdHkiOiJFQyIsImNydiI6IlAtMjU2Iiwia2lkIjoiWWlkYnltc2loVThaUFEwZ1B3cE1YWmNYM2RIaGxkaldwaEl6clRQaHh4RSIsIngiOiJ6cnVMdHprT2NjYWhNTk5MZjFiTkJVN3AxM254a19CQjU5d1VXelFWVG1jIiwieSI6Inp4UUV1NFF4bmVlQnNGYXNTYkptVjNoUUhJYXVGb3FsNWR6Z1VyTzJ0UjgifQ",
"aud": "http://localhost:22222/openid4vc/verify",
"nonce": "15c72cd0-8c84-45dc-aae2-a310f6075a8f",
"vp": {
"@context": [
"https://www.w3.org/2018/credentials/v1"
],
"type": [
"VerifiablePresentation"
],
"id": "urn:uuid:c85e079e-d194-44cd-8268-85f4ee819fef",
"holder": "did:jwk:eyJrdHkiOiJFQyIsImNydiI6IlAtMjU2Iiwia2lkIjoiWWlkYnltc2loVThaUFEwZ1B3cE1YWmNYM2RIaGxkaldwaEl6clRQaHh4RSIsIngiOiJ6cnVMdHprT2NjYWhNTk5MZjFiTkJVN3AxM254a19CQjU5d1VXelFWVG1jIiwieSI6Inp4UUV1NFF4bmVlQnNGYXNTYkptVjNoUUhJYXVGb3FsNWR6Z1VyTzJ0UjgifQ",
"verifiableCredential": [
"eyJraWQiOiJkaWQ6a2V5Ono2TWtqb1JocTFqU05KZExpcnVTWHJGRnhhZ3FyenRaYVhIcUhHVVRLSmJjTnl3cCIsInR5cCI6IkpXVCIsImFsZyI6IkVkRFNBIn0.eyJpc3MiOiJkaWQ6a2V5Ono2TWtqb1JocTFqU05KZExpcnVTWHJGRnhhZ3FyenRaYVhIcUhHVVRLSmJjTnl3cCIsInN1YiI6ImRpZDpqd2s6ZXlKcmRIa2lPaUpGUXlJc0ltTnlkaUk2SWxBdE1qVTJJaXdpYTJsa0lqb2lXV2xrWW5sdGMybG9WVGhhVUZFd1oxQjNjRTFZV21OWU0yUklhR3hrYWxkd2FFbDZjbFJRYUhoNFJTSXNJbmdpT2lKNmNuVk1kSHByVDJOallXaE5UazVNWmpGaVRrSlZOM0F4TTI1NGExOUNRalU1ZDFWWGVsRldWRzFqSWl3aWVTSTZJbnA0VVVWMU5GRjRibVZsUW5OR1lYTlRZa3B0VmpOb1VVaEpZWFZHYjNGc05XUjZaMVZ5VHpKMFVqZ2lmUSIsInZjIjp7IkBjb250ZXh0IjpbImh0dHBzOi8vd3d3LnczLm9yZy8yMDE4L2NyZWRlbnRpYWxzL3YxIiwiaHR0cHM6Ly9wdXJsLmltc2dsb2JhbC5vcmcvc3BlYy9vYi92M3AwL2NvbnRleHQuanNvbiJdLCJpZCI6InVybjp1dWlkOmEwNzJjZGVmLTQ5MTItNGNkZi05OWNiLTYzYzBhZDdlZWVkMSIsInR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJPcGVuQmFkZ2VDcmVkZW50aWFsIl0sIm5hbWUiOiJKRkYgeCB2Yy1lZHUgUGx1Z0Zlc3QgMyBJbnRlcm9wZXJhYmlsaXR5IiwiaXNzdWVyIjp7InR5cGUiOlsiUHJvZmlsZSJdLCJpZCI6ImRpZDprZXk6ejZNa2pvUmhxMWpTTkpkTGlydVNYckZGeGFncXJ6dFphWEhxSEdVVEtKYmNOeXdwIiwibmFtZSI6IkpvYnMgZm9yIHRoZSBGdXR1cmUgKEpGRikiLCJ1cmwiOiJodHRwczovL3d3dy5qZmYub3JnLyIsImltYWdlIjoiaHR0cHM6Ly93M2MtY2NnLmdpdGh1Yi5pby92Yy1lZC9wbHVnZmVzdC0xLTIwMjIvaW1hZ2VzL0pGRl9Mb2dvTG9ja3VwLnBuZyJ9LCJpc3N1YW5jZURhdGUiOiIyMDI0LTA5LTI3VDA5OjIxOjUzLjE0NTQxNTQzM1oiLCJleHBpcmF0aW9uRGF0ZSI6IjIwMjUtMDktMjdUMDk6MjE6NTMuMTQ1NTMwMDcyWiIsImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImlkIjoiZGlkOmp3azpleUpyZEhraU9pSkZReUlzSW1OeWRpSTZJbEF0TWpVMklpd2lhMmxrSWpvaVdXbGtZbmx0YzJsb1ZUaGFVRkV3WjFCM2NFMVlXbU5ZTTJSSWFHeGthbGR3YUVsNmNsUlFhSGg0UlNJc0luZ2lPaUo2Y25WTWRIcHJUMk5qWVdoTlRrNU1aakZpVGtKVk4zQXhNMjU0YTE5Q1FqVTVkMVZYZWxGV1ZHMWpJaXdpZVNJNklucDRVVVYxTkZGNGJtVmxRbk5HWVhOVFlrcHRWak5vVVVoSllYVkdiM0ZzTldSNloxVnlUekowVWpnaWZRIiwidHlwZSI6WyJBY2hpZXZlbWVudFN1YmplY3QiXSwiYWNoaWV2ZW1lbnQiOnsiaWQiOiJ1cm46dXVpZDphYzI1NGJkNS04ZmFkLTRiYjEtOWQyOS1lZmQ5Mzg1MzY5MjYiLCJ0eXBlIjpbIkFjaGlldmVtZW50Il0sIm5hbWUiOiJKRkYgeCB2Yy1lZHUgUGx1Z0Zlc3QgMyBJbnRlcm9wZXJhYmlsaXR5IiwiZGVzY3JpcHRpb24iOiJUaGlzIHdhbGxldCBzdXBwb3J0cyB0aGUgdXNlIG9mIFczQyBWZXJpZmlhYmxlIENyZWRlbnRpYWxzIGFuZCBoYXMgZGVtb25zdHJhdGVkIGludGVyb3BlcmFiaWxpdHkgZHVyaW5nIHRoZSBwcmVzZW50YXRpb24gcmVxdWVzdCB3b3JrZmxvdyBkdXJpbmcgSkZGIHggVkMtRURVIFBsdWdGZXN0IDMuIiwiY3JpdGVyaWEiOnsidHlwZSI6IkNyaXRlcmlhIiwibmFycmF0aXZlIjoiV2FsbGV0IHNvbHV0aW9ucyBwcm92aWRlcnMgZWFybmVkIHRoaXMgYmFkZ2UgYnkgZGVtb25zdHJhdGluZyBpbnRlcm9wZXJhYmlsaXR5IGR1cmluZyB0aGUgcHJlc2VudGF0aW9uIHJlcXVlc3Qgd29ya2Zsb3cuIFRoaXMgaW5jbHVkZXMgc3VjY2Vzc2Z1bGx5IHJlY2VpdmluZyBhIHByZXNlbnRhdGlvbiByZXF1ZXN0LCBhbGxvd2luZyB0aGUgaG9sZGVyIHRvIHNlbGVjdCBhdCBsZWFzdCB0d28gdHlwZXMgb2YgdmVyaWZpYWJsZSBjcmVkZW50aWFscyB0byBjcmVhdGUgYSB2ZXJpZmlhYmxlIHByZXNlbnRhdGlvbiwgcmV0dXJuaW5nIHRoZSBwcmVzZW50YXRpb24gdG8gdGhlIHJlcXVlc3RvciwgYW5kIHBhc3NpbmcgdmVyaWZpY2F0aW9uIG9mIHRoZSBwcmVzZW50YXRpb24gYW5kIHRoZSBpbmNsdWRlZCBjcmVkZW50aWFscy4ifSwiaW1hZ2UiOnsiaWQiOiJodHRwczovL3czYy1jY2cuZ2l0aHViLmlvL3ZjLWVkL3BsdWdmZXN0LTMtMjAyMy9pbWFnZXMvSkZGLVZDLUVEVS1QTFVHRkVTVDMtYmFkZ2UtaW1hZ2UucG5nIiwidHlwZSI6IkltYWdlIn19fX0sImp0aSI6InVybjp1dWlkOmEwNzJjZGVmLTQ5MTItNGNkZi05OWNiLTYzYzBhZDdlZWVkMSIsImV4cCI6MTc1ODk2NDkxMywiaWF0IjoxNzI3NDI4OTEzLCJuYmYiOjE3Mjc0Mjg5MTN9.KHRO2M2EewjvmEN8Y3HyhJtLQUEay2HOg4Axfu-ON-dYGFlpX635dvQj1pW0iuv9uy-XCbcVWH9MbDxfoKu3Bg"
]
}
}
}
}
In the response we will find a w3CJwtVpProofParameters
key, which represents the header and payload info that we need to put
into a
JWT. This JWT then needs to be signed with the key of the holder which is stored in an external system. All the other
information
we simply pass on to the /submit
endpoint next to the signed JWT in the step after next.
2. Signing the VP
Now you need to create a jwt
with the header and payload described
in w3CJwtVpProofParameters
received by the response to /prepare
and sign it with the key of the holder.
3. Submit
With the /submit
endpoint we will send most of the information returned by the /prepare
endpoint next to the
created and signed VP token from step 2.
Preparing the body of the request
1. We add the signed VP token as w3cJwtVpProof
{
"w3cJwtVpProof": "eyJraWQiOiJkaWQ6andrOmV5SnJkSGtpT2lKRlF5SXNJbU55ZGlJNklsQXRNalUySWl3aWEybGtJam9pV1dsa1lubHRjMmxvVlRoYVVGRXdaMUIzY0UxWVdtTllNMlJJYUd4a2FsZHdhRWw2Y2xSUWFIaDRSU0lzSW5naU9pSjZjblZNZEhwclQyTmpZV2hOVGs1TVpqRmlUa0pWTjNBeE0yNTRhMTlDUWpVNWQxVlhlbEZXVkcxaklpd2llU0k2SW5wNFVVVjFORkY0Ym1WbFFuTkdZWE5UWWtwdFZqTm9VVWhKWVhWR2IzRnNOV1I2WjFWeVR6SjBVamdpZlEjMCIsInR5cCI6IkpXVCIsImFsZyI6IkVTMjU2In0.eyJzdWIiOiJkaWQ6andrOmV5SnJkSGtpT2lKRlF5SXNJbU55ZGlJNklsQXRNalUySWl3aWEybGtJam9pV1dsa1lubHRjMmxvVlRoYVVGRXdaMUIzY0UxWVdtTllNMlJJYUd4a2FsZHdhRWw2Y2xSUWFIaDRSU0lzSW5naU9pSjZjblZNZEhwclQyTmpZV2hOVGs1TVpqRmlUa0pWTjNBeE0yNTRhMTlDUWpVNWQxVlhlbEZXVkcxaklpd2llU0k2SW5wNFVVVjFORkY0Ym1WbFFuTkdZWE5UWWtwdFZqTm9VVWhKWVhWR2IzRnNOV1I2WjFWeVR6SjBVamdpZlEiLCJuYmYiOjE3Mjc0Mjg4NTMsImlhdCI6MTcyNzQyODkxMywianRpIjoidXJuOnV1aWQ6Yzg1ZTA3OWUtZDE5NC00NGNkLTgyNjgtODVmNGVlODE5ZmVmIiwiaXNzIjoiZGlkOmp3azpleUpyZEhraU9pSkZReUlzSW1OeWRpSTZJbEF0TWpVMklpd2lhMmxrSWpvaVdXbGtZbmx0YzJsb1ZUaGFVRkV3WjFCM2NFMVlXbU5ZTTJSSWFHeGthbGR3YUVsNmNsUlFhSGg0UlNJc0luZ2lPaUo2Y25WTWRIcHJUMk5qWVdoTlRrNU1aakZpVGtKVk4zQXhNMjU0YTE5Q1FqVTVkMVZYZWxGV1ZHMWpJaXdpZVNJNklucDRVVVYxTkZGNGJtVmxRbk5HWVhOVFlrcHRWak5vVVVoSllYVkdiM0ZzTldSNloxVnlUekowVWpnaWZRIiwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDoyMjIyMi9vcGVuaWQ0dmMvdmVyaWZ5Iiwibm9uY2UiOiIxNWM3MmNkMC04Yzg0LTQ1ZGMtYWFlMi1hMzEwZjYwNzVhOGYiLCJ2cCI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVQcmVzZW50YXRpb24iXSwiaWQiOiJ1cm46dXVpZDpjODVlMDc5ZS1kMTk0LTQ0Y2QtODI2OC04NWY0ZWU4MTlmZWYiLCJob2xkZXIiOiJkaWQ6andrOmV5SnJkSGtpT2lKRlF5SXNJbU55ZGlJNklsQXRNalUySWl3aWEybGtJam9pV1dsa1lubHRjMmxvVlRoYVVGRXdaMUIzY0UxWVdtTllNMlJJYUd4a2FsZHdhRWw2Y2xSUWFIaDRSU0lzSW5naU9pSjZjblZNZEhwclQyTmpZV2hOVGs1TVpqRmlUa0pWTjNBeE0yNTRhMTlDUWpVNWQxVlhlbEZXVkcxaklpd2llU0k2SW5wNFVVVjFORkY0Ym1WbFFuTkdZWE5UWWtwdFZqTm9VVWhKWVhWR2IzRnNOV1I2WjFWeVR6SjBVamdpZlEiLCJ2ZXJpZmlhYmxlQ3JlZGVudGlhbCI6WyJleUpyYVdRaU9pSmthV1E2YTJWNU9ubzJUV3RxYjFKb2NURnFVMDVLWkV4cGNuVlRXSEpHUm5oaFozRnllblJhWVZoSWNVaEhWVlJMU21KalRubDNjQ0lzSW5SNWNDSTZJa3BYVkNJc0ltRnNaeUk2SWtWa1JGTkJJbjAuZXlKcGMzTWlPaUprYVdRNmEyVjVPbm8yVFd0cWIxSm9jVEZxVTA1S1pFeHBjblZUV0hKR1JuaGhaM0Z5ZW5SYVlWaEljVWhIVlZSTFNtSmpUbmwzY0NJc0luTjFZaUk2SW1ScFpEcHFkMnM2WlhsS2NtUklhMmxQYVVwR1VYbEpjMGx0VG5sa2FVazJTV3hCZEUxcVZUSkphWGRwWVRKc2EwbHFiMmxYVjJ4cldXNXNkR015Ykc5V1ZHaGhWVVpGZDFveFFqTmpSVEZaVjIxT1dVMHlVa2xoUjNocllXeGtkMkZGYkRaamJGSlJZVWhvTkZKVFNYTkpibWRwVDJsS05tTnVWazFrU0hCeVZESk9hbGxYYUU1VWF6Vk5XbXBHYVZSclNsWk9NMEY0VFRJMU5HRXhPVU5SYWxVMVpERldXR1ZzUmxkV1J6RnFTV2wzYVdWVFNUWkpibkEwVlZWV01VNUdSalJpYlZac1VXNU9SMWxZVGxSWmEzQjBWbXBPYjFWVmFFcFpXRlpIWWpOR2MwNVhValphTVZaNVZIcEtNRlZxWjJsbVVTSXNJblpqSWpwN0lrQmpiMjUwWlhoMElqcGJJbWgwZEhCek9pOHZkM2QzTG5jekxtOXlaeTh5TURFNEwyTnlaV1JsYm5ScFlXeHpMM1l4SWl3aWFIUjBjSE02THk5d2RYSnNMbWx0YzJkc2IySmhiQzV2Y21jdmMzQmxZeTl2WWk5Mk0zQXdMMk52Ym5SbGVIUXVhbk52YmlKZExDSnBaQ0k2SW5WeWJqcDFkV2xrT21Fd056SmpaR1ZtTFRRNU1USXROR05rWmkwNU9XTmlMVFl6WXpCaFpEZGxaV1ZrTVNJc0luUjVjR1VpT2xzaVZtVnlhV1pwWVdKc1pVTnlaV1JsYm5ScFlXd2lMQ0pQY0dWdVFtRmtaMlZEY21Wa1pXNTBhV0ZzSWwwc0ltNWhiV1VpT2lKS1JrWWdlQ0IyWXkxbFpIVWdVR3gxWjBabGMzUWdNeUJKYm5SbGNtOXdaWEpoWW1sc2FYUjVJaXdpYVhOemRXVnlJanA3SW5SNWNHVWlPbHNpVUhKdlptbHNaU0pkTENKcFpDSTZJbVJwWkRwclpYazZlalpOYTJwdlVtaHhNV3BUVGtwa1RHbHlkVk5ZY2taR2VHRm5jWEo2ZEZwaFdFaHhTRWRWVkV0S1ltTk9lWGR3SWl3aWJtRnRaU0k2SWtwdlluTWdabTl5SUhSb1pTQkdkWFIxY21VZ0tFcEdSaWtpTENKMWNtd2lPaUpvZEhSd2N6b3ZMM2QzZHk1cVptWXViM0puTHlJc0ltbHRZV2RsSWpvaWFIUjBjSE02THk5M00yTXRZMk5uTG1kcGRHaDFZaTVwYnk5Mll5MWxaQzl3YkhWblptVnpkQzB4TFRJd01qSXZhVzFoWjJWekwwcEdSbDlNYjJkdlRHOWphM1Z3TG5CdVp5SjlMQ0pwYzNOMVlXNWpaVVJoZEdVaU9pSXlNREkwTFRBNUxUSTNWREE1T2pJeE9qVXpMakUwTlRReE5UUXpNMW9pTENKbGVIQnBjbUYwYVc5dVJHRjBaU0k2SWpJd01qVXRNRGt0TWpkVU1EazZNakU2TlRNdU1UUTFOVE13TURjeVdpSXNJbU55WldSbGJuUnBZV3hUZFdKcVpXTjBJanA3SW1sa0lqb2laR2xrT21wM2F6cGxlVXB5WkVocmFVOXBTa1pSZVVselNXMU9lV1JwU1RaSmJFRjBUV3BWTWtscGQybGhNbXhyU1dwdmFWZFhiR3RaYm14MFl6SnNiMVpVYUdGVlJrVjNXakZDTTJORk1WbFhiVTVaVFRKU1NXRkhlR3RoYkdSM1lVVnNObU5zVWxGaFNHZzBVbE5KYzBsdVoybFBhVW8yWTI1V1RXUkljSEpVTWs1cVdWZG9UbFJyTlUxYWFrWnBWR3RLVms0elFYaE5NalUwWVRFNVExRnFWVFZrTVZaWVpXeEdWMVpITVdwSmFYZHBaVk5KTmtsdWNEUlZWVll4VGtaR05HSnRWbXhSYms1SFdWaE9WRmxyY0hSV2FrNXZWVlZvU2xsWVZrZGlNMFp6VGxkU05sb3hWbmxVZWtvd1ZXcG5hV1pSSWl3aWRIbHdaU0k2V3lKQlkyaHBaWFpsYldWdWRGTjFZbXBsWTNRaVhTd2lZV05vYVdWMlpXMWxiblFpT25zaWFXUWlPaUoxY200NmRYVnBaRHBoWXpJMU5HSmtOUzA0Wm1Ga0xUUmlZakV0T1dReU9TMWxabVE1TXpnMU16WTVNallpTENKMGVYQmxJanBiSWtGamFHbGxkbVZ0Wlc1MElsMHNJbTVoYldVaU9pSktSa1lnZUNCMll5MWxaSFVnVUd4MVowWmxjM1FnTXlCSmJuUmxjbTl3WlhKaFltbHNhWFI1SWl3aVpHVnpZM0pwY0hScGIyNGlPaUpVYUdseklIZGhiR3hsZENCemRYQndiM0owY3lCMGFHVWdkWE5sSUc5bUlGY3pReUJXWlhKcFptbGhZbXhsSUVOeVpXUmxiblJwWVd4eklHRnVaQ0JvWVhNZ1pHVnRiMjV6ZEhKaGRHVmtJR2x1ZEdWeWIzQmxjbUZpYVd4cGRIa2daSFZ5YVc1bklIUm9aU0J3Y21WelpXNTBZWFJwYjI0Z2NtVnhkV1Z6ZENCM2IzSnJabXh2ZHlCa2RYSnBibWNnU2taR0lIZ2dWa010UlVSVklGQnNkV2RHWlhOMElETXVJaXdpWTNKcGRHVnlhV0VpT25zaWRIbHdaU0k2SWtOeWFYUmxjbWxoSWl3aWJtRnljbUYwYVhabElqb2lWMkZzYkdWMElITnZiSFYwYVc5dWN5QndjbTkyYVdSbGNuTWdaV0Z5Ym1Wa0lIUm9hWE1nWW1Ga1oyVWdZbmtnWkdWdGIyNXpkSEpoZEdsdVp5QnBiblJsY205d1pYSmhZbWxzYVhSNUlHUjFjbWx1WnlCMGFHVWdjSEpsYzJWdWRHRjBhVzl1SUhKbGNYVmxjM1FnZDI5eWEyWnNiM2N1SUZSb2FYTWdhVzVqYkhWa1pYTWdjM1ZqWTJWemMyWjFiR3g1SUhKbFkyVnBkbWx1WnlCaElIQnlaWE5sYm5SaGRHbHZiaUJ5WlhGMVpYTjBMQ0JoYkd4dmQybHVaeUIwYUdVZ2FHOXNaR1Z5SUhSdklITmxiR1ZqZENCaGRDQnNaV0Z6ZENCMGQyOGdkSGx3WlhNZ2IyWWdkbVZ5YVdacFlXSnNaU0JqY21Wa1pXNTBhV0ZzY3lCMGJ5QmpjbVZoZEdVZ1lTQjJaWEpwWm1saFlteGxJSEJ5WlhObGJuUmhkR2x2Yml3Z2NtVjBkWEp1YVc1bklIUm9aU0J3Y21WelpXNTBZWFJwYjI0Z2RHOGdkR2hsSUhKbGNYVmxjM1J2Y2l3Z1lXNWtJSEJoYzNOcGJtY2dkbVZ5YVdacFkyRjBhVzl1SUc5bUlIUm9aU0J3Y21WelpXNTBZWFJwYjI0Z1lXNWtJSFJvWlNCcGJtTnNkV1JsWkNCamNtVmtaVzUwYVdGc2N5NGlmU3dpYVcxaFoyVWlPbnNpYVdRaU9pSm9kSFJ3Y3pvdkwzY3pZeTFqWTJjdVoybDBhSFZpTG1sdkwzWmpMV1ZrTDNCc2RXZG1aWE4wTFRNdE1qQXlNeTlwYldGblpYTXZTa1pHTFZaRExVVkVWUzFRVEZWSFJrVlRWRE10WW1Ga1oyVXRhVzFoWjJVdWNHNW5JaXdpZEhsd1pTSTZJa2x0WVdkbEluMTlmWDBzSW1wMGFTSTZJblZ5YmpwMWRXbGtPbUV3TnpKalpHVm1MVFE1TVRJdE5HTmtaaTA1T1dOaUxUWXpZekJoWkRkbFpXVmtNU0lzSW1WNGNDSTZNVGMxT0RrMk5Ea3hNeXdpYVdGMElqb3hOekkzTkRJNE9URXpMQ0p1WW1ZaU9qRTNNamMwTWpnNU1UTjkuS0hSTzJNMkVld2p2bUVOOFkzSHloSnRMUVVFYXkySE9nNEF4ZnUtT04tZFlHRmxwWDYzNWR2UWoxcFcwaXV2OXV5LVhDYmNWV0g5TWJEeGZvS3UzQmciXX19.pAQDUnGESJRhACTyok-ICREUbQ9fCuJvwIAVwyuBInhM2EogJK29Jp4eWwDZ1pRJMyB0NubyjcU3CzFrAzUvhw"
}
2. We copy over the value did
, presentationRequest
, presentationSubmission
,
and selectedCredentialIdList
from the response to /prepare
.
{
"did": "did:jwk:eyJrdHkiOiJFQyIsImNydiI6IlAtMjU2Iiwia2lkIjoiWWlkYnltc2loVThaUFEwZ1B3cE1YWmNYM2RIaGxkaldwaEl6clRQaHh4RSIsIngiOiJ6cnVMdHprT2NjYWhNTk5MZjFiTkJVN3AxM254a19CQjU5d1VXelFWVG1jIiwieSI6Inp4UUV1NFF4bmVlQnNGYXNTYkptVjNoUUhJYXVGb3FsNWR6Z1VyTzJ0UjgifQ",
"presentationRequest": "openid4vp://authorize?response_type=vp_token&client_id=http%3A%2F%2Flocalhost%3A22222%2Fopenid4vc%2Fverify&response_mode=direct_post&state=RVgQIBRCUy0J&presentation_definition_uri=http%3A%2F%2Flocalhost%3A22222%2Fopenid4vc%2Fpd%2FRVgQIBRCUy0J&client_id_scheme=redirect_uri&client_metadata=%7B%22authorization_encrypted_response_alg%22%3A%22ECDH-ES%22%2C%22authorization_encrypted_response_enc%22%3A%22A256GCM%22%7D&nonce=15c72cd0-8c84-45dc-aae2-a310f6075a8f&response_uri=http%3A%2F%2Flocalhost%3A22222%2Fopenid4vc%2Fverify%2FRVgQIBRCUy0J",
"presentationSubmission": {
"id": "urn:uuid:c85e079e-d194-44cd-8268-85f4ee819fef",
"definition_id": "urn:uuid:c85e079e-d194-44cd-8268-85f4ee819fef",
"descriptor_map": [
{
"id": "OpenBadgeCredential",
"format": "jwt_vp",
"path": "$",
"path_nested": {
"id": "OpenBadgeCredential",
"format": "jwt_vc_json",
"path": "$.verifiableCredential[0]",
"customParameters": {}
}
}
],
"customParameters": {}
},
"selectedCredentialIdList": [
"urn:uuid:a072cdef-4912-4cdf-99cb-63c0ad7eeed1"
],
}
3. Final Body
{
"did": "did:jwk:eyJrdHkiOiJFQyIsImNydiI6IlAtMjU2Iiwia2lkIjoiWWlkYnltc2loVThaUFEwZ1B3cE1YWmNYM2RIaGxkaldwaEl6clRQaHh4RSIsIngiOiJ6cnVMdHprT2NjYWhNTk5MZjFiTkJVN3AxM254a19CQjU5d1VXelFWVG1jIiwieSI6Inp4UUV1NFF4bmVlQnNGYXNTYkptVjNoUUhJYXVGb3FsNWR6Z1VyTzJ0UjgifQ",
"presentationRequest": "openid4vp://authorize?response_type=vp_token&client_id=http%3A%2F%2Flocalhost%3A22222%2Fopenid4vc%2Fverify&response_mode=direct_post&state=RVgQIBRCUy0J&presentation_definition_uri=http%3A%2F%2Flocalhost%3A22222%2Fopenid4vc%2Fpd%2FRVgQIBRCUy0J&client_id_scheme=redirect_uri&client_metadata=%7B%22authorization_encrypted_response_alg%22%3A%22ECDH-ES%22%2C%22authorization_encrypted_response_enc%22%3A%22A256GCM%22%7D&nonce=15c72cd0-8c84-45dc-aae2-a310f6075a8f&response_uri=http%3A%2F%2Flocalhost%3A22222%2Fopenid4vc%2Fverify%2FRVgQIBRCUy0J",
"presentationSubmission": {
"id": "urn:uuid:c85e079e-d194-44cd-8268-85f4ee819fef",
"definition_id": "urn:uuid:c85e079e-d194-44cd-8268-85f4ee819fef",
"descriptor_map": [
{
"id": "OpenBadgeCredential",
"format": "jwt_vp",
"path": "$",
"path_nested": {
"id": "OpenBadgeCredential",
"format": "jwt_vc_json",
"path": "$.verifiableCredential[0]",
"customParameters": {}
}
}
],
"customParameters": {}
},
"selectedCredentialIdList": [
"urn:uuid:a072cdef-4912-4cdf-99cb-63c0ad7eeed1"
],
"w3cJwtVpProof": "eyJraWQiOiJkaWQ6andrOmV5SnJkSGtpT2lKRlF5SXNJbU55ZGlJNklsQXRNalUySWl3aWEybGtJam9pV1dsa1lubHRjMmxvVlRoYVVGRXdaMUIzY0UxWVdtTllNMlJJYUd4a2FsZHdhRWw2Y2xSUWFIaDRSU0lzSW5naU9pSjZjblZNZEhwclQyTmpZV2hOVGs1TVpqRmlUa0pWTjNBeE0yNTRhMTlDUWpVNWQxVlhlbEZXVkcxaklpd2llU0k2SW5wNFVVVjFORkY0Ym1WbFFuTkdZWE5UWWtwdFZqTm9VVWhKWVhWR2IzRnNOV1I2WjFWeVR6SjBVamdpZlEjMCIsInR5cCI6IkpXVCIsImFsZyI6IkVTMjU2In0.eyJzdWIiOiJkaWQ6andrOmV5SnJkSGtpT2lKRlF5SXNJbU55ZGlJNklsQXRNalUySWl3aWEybGtJam9pV1dsa1lubHRjMmxvVlRoYVVGRXdaMUIzY0UxWVdtTllNMlJJYUd4a2FsZHdhRWw2Y2xSUWFIaDRSU0lzSW5naU9pSjZjblZNZEhwclQyTmpZV2hOVGs1TVpqRmlUa0pWTjNBeE0yNTRhMTlDUWpVNWQxVlhlbEZXVkcxaklpd2llU0k2SW5wNFVVVjFORkY0Ym1WbFFuTkdZWE5UWWtwdFZqTm9VVWhKWVhWR2IzRnNOV1I2WjFWeVR6SjBVamdpZlEiLCJuYmYiOjE3Mjc0Mjg4NTMsImlhdCI6MTcyNzQyODkxMywianRpIjoidXJuOnV1aWQ6Yzg1ZTA3OWUtZDE5NC00NGNkLTgyNjgtODVmNGVlODE5ZmVmIiwiaXNzIjoiZGlkOmp3azpleUpyZEhraU9pSkZReUlzSW1OeWRpSTZJbEF0TWpVMklpd2lhMmxrSWpvaVdXbGtZbmx0YzJsb1ZUaGFVRkV3WjFCM2NFMVlXbU5ZTTJSSWFHeGthbGR3YUVsNmNsUlFhSGg0UlNJc0luZ2lPaUo2Y25WTWRIcHJUMk5qWVdoTlRrNU1aakZpVGtKVk4zQXhNMjU0YTE5Q1FqVTVkMVZYZWxGV1ZHMWpJaXdpZVNJNklucDRVVVYxTkZGNGJtVmxRbk5HWVhOVFlrcHRWak5vVVVoSllYVkdiM0ZzTldSNloxVnlUekowVWpnaWZRIiwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDoyMjIyMi9vcGVuaWQ0dmMvdmVyaWZ5Iiwibm9uY2UiOiIxNWM3MmNkMC04Yzg0LTQ1ZGMtYWFlMi1hMzEwZjYwNzVhOGYiLCJ2cCI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVQcmVzZW50YXRpb24iXSwiaWQiOiJ1cm46dXVpZDpjODVlMDc5ZS1kMTk0LTQ0Y2QtODI2OC04NWY0ZWU4MTlmZWYiLCJob2xkZXIiOiJkaWQ6andrOmV5SnJkSGtpT2lKRlF5SXNJbU55ZGlJNklsQXRNalUySWl3aWEybGtJam9pV1dsa1lubHRjMmxvVlRoYVVGRXdaMUIzY0UxWVdtTllNMlJJYUd4a2FsZHdhRWw2Y2xSUWFIaDRSU0lzSW5naU9pSjZjblZNZEhwclQyTmpZV2hOVGs1TVpqRmlUa0pWTjNBeE0yNTRhMTlDUWpVNWQxVlhlbEZXVkcxaklpd2llU0k2SW5wNFVVVjFORkY0Ym1WbFFuTkdZWE5UWWtwdFZqTm9VVWhKWVhWR2IzRnNOV1I2WjFWeVR6SjBVamdpZlEiLCJ2ZXJpZmlhYmxlQ3JlZGVudGlhbCI6WyJleUpyYVdRaU9pSmthV1E2YTJWNU9ubzJUV3RxYjFKb2NURnFVMDVLWkV4cGNuVlRXSEpHUm5oaFozRnllblJhWVZoSWNVaEhWVlJMU21KalRubDNjQ0lzSW5SNWNDSTZJa3BYVkNJc0ltRnNaeUk2SWtWa1JGTkJJbjAuZXlKcGMzTWlPaUprYVdRNmEyVjVPbm8yVFd0cWIxSm9jVEZxVTA1S1pFeHBjblZUV0hKR1JuaGhaM0Z5ZW5SYVlWaEljVWhIVlZSTFNtSmpUbmwzY0NJc0luTjFZaUk2SW1ScFpEcHFkMnM2WlhsS2NtUklhMmxQYVVwR1VYbEpjMGx0VG5sa2FVazJTV3hCZEUxcVZUSkphWGRwWVRKc2EwbHFiMmxYVjJ4cldXNXNkR015Ykc5V1ZHaGhWVVpGZDFveFFqTmpSVEZaVjIxT1dVMHlVa2xoUjNocllXeGtkMkZGYkRaamJGSlJZVWhvTkZKVFNYTkpibWRwVDJsS05tTnVWazFrU0hCeVZESk9hbGxYYUU1VWF6Vk5XbXBHYVZSclNsWk9NMEY0VFRJMU5HRXhPVU5SYWxVMVpERldXR1ZzUmxkV1J6RnFTV2wzYVdWVFNUWkpibkEwVlZWV01VNUdSalJpYlZac1VXNU9SMWxZVGxSWmEzQjBWbXBPYjFWVmFFcFpXRlpIWWpOR2MwNVhValphTVZaNVZIcEtNRlZxWjJsbVVTSXNJblpqSWpwN0lrQmpiMjUwWlhoMElqcGJJbWgwZEhCek9pOHZkM2QzTG5jekxtOXlaeTh5TURFNEwyTnlaV1JsYm5ScFlXeHpMM1l4SWl3aWFIUjBjSE02THk5d2RYSnNMbWx0YzJkc2IySmhiQzV2Y21jdmMzQmxZeTl2WWk5Mk0zQXdMMk52Ym5SbGVIUXVhbk52YmlKZExDSnBaQ0k2SW5WeWJqcDFkV2xrT21Fd056SmpaR1ZtTFRRNU1USXROR05rWmkwNU9XTmlMVFl6WXpCaFpEZGxaV1ZrTVNJc0luUjVjR1VpT2xzaVZtVnlhV1pwWVdKc1pVTnlaV1JsYm5ScFlXd2lMQ0pQY0dWdVFtRmtaMlZEY21Wa1pXNTBhV0ZzSWwwc0ltNWhiV1VpT2lKS1JrWWdlQ0IyWXkxbFpIVWdVR3gxWjBabGMzUWdNeUJKYm5SbGNtOXdaWEpoWW1sc2FYUjVJaXdpYVhOemRXVnlJanA3SW5SNWNHVWlPbHNpVUhKdlptbHNaU0pkTENKcFpDSTZJbVJwWkRwclpYazZlalpOYTJwdlVtaHhNV3BUVGtwa1RHbHlkVk5ZY2taR2VHRm5jWEo2ZEZwaFdFaHhTRWRWVkV0S1ltTk9lWGR3SWl3aWJtRnRaU0k2SWtwdlluTWdabTl5SUhSb1pTQkdkWFIxY21VZ0tFcEdSaWtpTENKMWNtd2lPaUpvZEhSd2N6b3ZMM2QzZHk1cVptWXViM0puTHlJc0ltbHRZV2RsSWpvaWFIUjBjSE02THk5M00yTXRZMk5uTG1kcGRHaDFZaTVwYnk5Mll5MWxaQzl3YkhWblptVnpkQzB4TFRJd01qSXZhVzFoWjJWekwwcEdSbDlNYjJkdlRHOWphM1Z3TG5CdVp5SjlMQ0pwYzNOMVlXNWpaVVJoZEdVaU9pSXlNREkwTFRBNUxUSTNWREE1T2pJeE9qVXpMakUwTlRReE5UUXpNMW9pTENKbGVIQnBjbUYwYVc5dVJHRjBaU0k2SWpJd01qVXRNRGt0TWpkVU1EazZNakU2TlRNdU1UUTFOVE13TURjeVdpSXNJbU55WldSbGJuUnBZV3hUZFdKcVpXTjBJanA3SW1sa0lqb2laR2xrT21wM2F6cGxlVXB5WkVocmFVOXBTa1pSZVVselNXMU9lV1JwU1RaSmJFRjBUV3BWTWtscGQybGhNbXhyU1dwdmFWZFhiR3RaYm14MFl6SnNiMVpVYUdGVlJrVjNXakZDTTJORk1WbFhiVTVaVFRKU1NXRkhlR3RoYkdSM1lVVnNObU5zVWxGaFNHZzBVbE5KYzBsdVoybFBhVW8yWTI1V1RXUkljSEpVTWs1cVdWZG9UbFJyTlUxYWFrWnBWR3RLVms0elFYaE5NalUwWVRFNVExRnFWVFZrTVZaWVpXeEdWMVpITVdwSmFYZHBaVk5KTmtsdWNEUlZWVll4VGtaR05HSnRWbXhSYms1SFdWaE9WRmxyY0hSV2FrNXZWVlZvU2xsWVZrZGlNMFp6VGxkU05sb3hWbmxVZWtvd1ZXcG5hV1pSSWl3aWRIbHdaU0k2V3lKQlkyaHBaWFpsYldWdWRGTjFZbXBsWTNRaVhTd2lZV05vYVdWMlpXMWxiblFpT25zaWFXUWlPaUoxY200NmRYVnBaRHBoWXpJMU5HSmtOUzA0Wm1Ga0xUUmlZakV0T1dReU9TMWxabVE1TXpnMU16WTVNallpTENKMGVYQmxJanBiSWtGamFHbGxkbVZ0Wlc1MElsMHNJbTVoYldVaU9pSktSa1lnZUNCMll5MWxaSFVnVUd4MVowWmxjM1FnTXlCSmJuUmxjbTl3WlhKaFltbHNhWFI1SWl3aVpHVnpZM0pwY0hScGIyNGlPaUpVYUdseklIZGhiR3hsZENCemRYQndiM0owY3lCMGFHVWdkWE5sSUc5bUlGY3pReUJXWlhKcFptbGhZbXhsSUVOeVpXUmxiblJwWVd4eklHRnVaQ0JvWVhNZ1pHVnRiMjV6ZEhKaGRHVmtJR2x1ZEdWeWIzQmxjbUZpYVd4cGRIa2daSFZ5YVc1bklIUm9aU0J3Y21WelpXNTBZWFJwYjI0Z2NtVnhkV1Z6ZENCM2IzSnJabXh2ZHlCa2RYSnBibWNnU2taR0lIZ2dWa010UlVSVklGQnNkV2RHWlhOMElETXVJaXdpWTNKcGRHVnlhV0VpT25zaWRIbHdaU0k2SWtOeWFYUmxjbWxoSWl3aWJtRnljbUYwYVhabElqb2lWMkZzYkdWMElITnZiSFYwYVc5dWN5QndjbTkyYVdSbGNuTWdaV0Z5Ym1Wa0lIUm9hWE1nWW1Ga1oyVWdZbmtnWkdWdGIyNXpkSEpoZEdsdVp5QnBiblJsY205d1pYSmhZbWxzYVhSNUlHUjFjbWx1WnlCMGFHVWdjSEpsYzJWdWRHRjBhVzl1SUhKbGNYVmxjM1FnZDI5eWEyWnNiM2N1SUZSb2FYTWdhVzVqYkhWa1pYTWdjM1ZqWTJWemMyWjFiR3g1SUhKbFkyVnBkbWx1WnlCaElIQnlaWE5sYm5SaGRHbHZiaUJ5WlhGMVpYTjBMQ0JoYkd4dmQybHVaeUIwYUdVZ2FHOXNaR1Z5SUhSdklITmxiR1ZqZENCaGRDQnNaV0Z6ZENCMGQyOGdkSGx3WlhNZ2IyWWdkbVZ5YVdacFlXSnNaU0JqY21Wa1pXNTBhV0ZzY3lCMGJ5QmpjbVZoZEdVZ1lTQjJaWEpwWm1saFlteGxJSEJ5WlhObGJuUmhkR2x2Yml3Z2NtVjBkWEp1YVc1bklIUm9aU0J3Y21WelpXNTBZWFJwYjI0Z2RHOGdkR2hsSUhKbGNYVmxjM1J2Y2l3Z1lXNWtJSEJoYzNOcGJtY2dkbVZ5YVdacFkyRjBhVzl1SUc5bUlIUm9aU0J3Y21WelpXNTBZWFJwYjI0Z1lXNWtJSFJvWlNCcGJtTnNkV1JsWkNCamNtVmtaVzUwYVdGc2N5NGlmU3dpYVcxaFoyVWlPbnNpYVdRaU9pSm9kSFJ3Y3pvdkwzY3pZeTFqWTJjdVoybDBhSFZpTG1sdkwzWmpMV1ZrTDNCc2RXZG1aWE4wTFRNdE1qQXlNeTlwYldGblpYTXZTa1pHTFZaRExVVkVWUzFRVEZWSFJrVlRWRE10WW1Ga1oyVXRhVzFoWjJVdWNHNW5JaXdpZEhsd1pTSTZJa2x0WVdkbEluMTlmWDBzSW1wMGFTSTZJblZ5YmpwMWRXbGtPbUV3TnpKalpHVm1MVFE1TVRJdE5HTmtaaTA1T1dOaUxUWXpZekJoWkRkbFpXVmtNU0lzSW1WNGNDSTZNVGMxT0RrMk5Ea3hNeXdpYVdGMElqb3hOekkzTkRJNE9URXpMQ0p1WW1ZaU9qRTNNamMwTWpnNU1UTjkuS0hSTzJNMkVld2p2bUVOOFkzSHloSnRMUVVFYXkySE9nNEF4ZnUtT04tZFlHRmxwWDYzNWR2UWoxcFcwaXV2OXV5LVhDYmNWV0g5TWJEeGZvS3UzQmciXX19.pAQDUnGESJRhACTyok-ICREUbQ9fCuJvwIAVwyuBInhM2EogJK29Jp4eWwDZ1pRJMyB0NubyjcU3CzFrAzUvhw"
}
Making the Request
We will now pass the body to the /submit
endpoint. This endpoint will then share all credentials with the verifier and
respond with a redirect URI if provided by the verifier.
Endpoint: /wallet-api/{wallet}/exchange/external_signatures/presentation/submit
curl -X 'POST' \
'http://0.0.0.0:7001/wallet-api/{wallet}/exchange/external_signatures/presentation/submit' \
-H 'accept: */*' \
-H 'Content-Type: application/json' \
-d '{
"did": "did:jwk:eyJrdHkiOiJFQyIsImNydiI6IlAtMjU2Iiwia2lkIjoiWWlkYnltc2loVThaUFEwZ1B3cE1YWmNYM2RIaGxkaldwaEl6clRQaHh4RSIsIngiOiJ6cnVMdHprT2NjYWhNTk5MZjFiTkJVN3AxM254a19CQjU5d1VXelFWVG1jIiwieSI6Inp4UUV1NFF4bmVlQnNGYXNTYkptVjNoUUhJYXVGb3FsNWR6Z1VyTzJ0UjgifQ",
"presentationRequest": "openid4vp://authorize?response_type=vp_token&client_id=http%3A%2F%2Flocalhost%3A22222%2Fopenid4vc%2Fverify&response_mode=direct_post&state=RVgQIBRCUy0J&presentation_definition_uri=http%3A%2F%2Flocalhost%3A22222%2Fopenid4vc%2Fpd%2FRVgQIBRCUy0J&client_id_scheme=redirect_uri&client_metadata=%7B%22authorization_encrypted_response_alg%22%3A%22ECDH-ES%22%2C%22authorization_encrypted_response_enc%22%3A%22A256GCM%22%7D&nonce=15c72cd0-8c84-45dc-aae2-a310f6075a8f&response_uri=http%3A%2F%2Flocalhost%3A22222%2Fopenid4vc%2Fverify%2FRVgQIBRCUy0J",
"presentationSubmission": {
"id": "urn:uuid:c85e079e-d194-44cd-8268-85f4ee819fef",
"definition_id": "urn:uuid:c85e079e-d194-44cd-8268-85f4ee819fef",
"descriptor_map": [
{
"id": "OpenBadgeCredential",
"format": "jwt_vp",
"path": "$",
"path_nested": {
"id": "OpenBadgeCredential",
"format": "jwt_vc_json",
"path": "$.verifiableCredential[0]",
"customParameters": {}
}
}
],
"customParameters": {}
},
"selectedCredentialIdList": [
"urn:uuid:a072cdef-4912-4cdf-99cb-63c0ad7eeed1"
],
"w3cJwtVpProof": "eyJraWQiOiJkaWQ6andrOmV5SnJkSGtpT2lKRlF5SXNJbU55ZGlJNklsQXRNalUySWl3aWEybGtJam9pV1dsa1lubHRjMmxvVlRoYVVGRXdaMUIzY0UxWVdtTllNMlJJYUd4a2FsZHdhRWw2Y2xSUWFIaDRSU0lzSW5naU9pSjZjblZNZEhwclQyTmpZV2hOVGs1TVpqRmlUa0pWTjNBeE0yNTRhMTlDUWpVNWQxVlhlbEZXVkcxaklpd2llU0k2SW5wNFVVVjFORkY0Ym1WbFFuTkdZWE5UWWtwdFZqTm9VVWhKWVhWR2IzRnNOV1I2WjFWeVR6SjBVamdpZlEjMCIsInR5cCI6IkpXVCIsImFsZyI6IkVTMjU2In0.eyJzdWIiOiJkaWQ6andrOmV5SnJkSGtpT2lKRlF5SXNJbU55ZGlJNklsQXRNalUySWl3aWEybGtJam9pV1dsa1lubHRjMmxvVlRoYVVGRXdaMUIzY0UxWVdtTllNMlJJYUd4a2FsZHdhRWw2Y2xSUWFIaDRSU0lzSW5naU9pSjZjblZNZEhwclQyTmpZV2hOVGs1TVpqRmlUa0pWTjNBeE0yNTRhMTlDUWpVNWQxVlhlbEZXVkcxaklpd2llU0k2SW5wNFVVVjFORkY0Ym1WbFFuTkdZWE5UWWtwdFZqTm9VVWhKWVhWR2IzRnNOV1I2WjFWeVR6SjBVamdpZlEiLCJuYmYiOjE3Mjc0Mjg4NTMsImlhdCI6MTcyNzQyODkxMywianRpIjoidXJuOnV1aWQ6Yzg1ZTA3OWUtZDE5NC00NGNkLTgyNjgtODVmNGVlODE5ZmVmIiwiaXNzIjoiZGlkOmp3azpleUpyZEhraU9pSkZReUlzSW1OeWRpSTZJbEF0TWpVMklpd2lhMmxrSWpvaVdXbGtZbmx0YzJsb1ZUaGFVRkV3WjFCM2NFMVlXbU5ZTTJSSWFHeGthbGR3YUVsNmNsUlFhSGg0UlNJc0luZ2lPaUo2Y25WTWRIcHJUMk5qWVdoTlRrNU1aakZpVGtKVk4zQXhNMjU0YTE5Q1FqVTVkMVZYZWxGV1ZHMWpJaXdpZVNJNklucDRVVVYxTkZGNGJtVmxRbk5HWVhOVFlrcHRWak5vVVVoSllYVkdiM0ZzTldSNloxVnlUekowVWpnaWZRIiwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDoyMjIyMi9vcGVuaWQ0dmMvdmVyaWZ5Iiwibm9uY2UiOiIxNWM3MmNkMC04Yzg0LTQ1ZGMtYWFlMi1hMzEwZjYwNzVhOGYiLCJ2cCI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVQcmVzZW50YXRpb24iXSwiaWQiOiJ1cm46dXVpZDpjODVlMDc5ZS1kMTk0LTQ0Y2QtODI2OC04NWY0ZWU4MTlmZWYiLCJob2xkZXIiOiJkaWQ6andrOmV5SnJkSGtpT2lKRlF5SXNJbU55ZGlJNklsQXRNalUySWl3aWEybGtJam9pV1dsa1lubHRjMmxvVlRoYVVGRXdaMUIzY0UxWVdtTllNMlJJYUd4a2FsZHdhRWw2Y2xSUWFIaDRSU0lzSW5naU9pSjZjblZNZEhwclQyTmpZV2hOVGs1TVpqRmlUa0pWTjNBeE0yNTRhMTlDUWpVNWQxVlhlbEZXVkcxaklpd2llU0k2SW5wNFVVVjFORkY0Ym1WbFFuTkdZWE5UWWtwdFZqTm9VVWhKWVhWR2IzRnNOV1I2WjFWeVR6SjBVamdpZlEiLCJ2ZXJpZmlhYmxlQ3JlZGVudGlhbCI6WyJleUpyYVdRaU9pSmthV1E2YTJWNU9ubzJUV3RxYjFKb2NURnFVMDVLWkV4cGNuVlRXSEpHUm5oaFozRnllblJhWVZoSWNVaEhWVlJMU21KalRubDNjQ0lzSW5SNWNDSTZJa3BYVkNJc0ltRnNaeUk2SWtWa1JGTkJJbjAuZXlKcGMzTWlPaUprYVdRNmEyVjVPbm8yVFd0cWIxSm9jVEZxVTA1S1pFeHBjblZUV0hKR1JuaGhaM0Z5ZW5SYVlWaEljVWhIVlZSTFNtSmpUbmwzY0NJc0luTjFZaUk2SW1ScFpEcHFkMnM2WlhsS2NtUklhMmxQYVVwR1VYbEpjMGx0VG5sa2FVazJTV3hCZEUxcVZUSkphWGRwWVRKc2EwbHFiMmxYVjJ4cldXNXNkR015Ykc5V1ZHaGhWVVpGZDFveFFqTmpSVEZaVjIxT1dVMHlVa2xoUjNocllXeGtkMkZGYkRaamJGSlJZVWhvTkZKVFNYTkpibWRwVDJsS05tTnVWazFrU0hCeVZESk9hbGxYYUU1VWF6Vk5XbXBHYVZSclNsWk9NMEY0VFRJMU5HRXhPVU5SYWxVMVpERldXR1ZzUmxkV1J6RnFTV2wzYVdWVFNUWkpibkEwVlZWV01VNUdSalJpYlZac1VXNU9SMWxZVGxSWmEzQjBWbXBPYjFWVmFFcFpXRlpIWWpOR2MwNVhValphTVZaNVZIcEtNRlZxWjJsbVVTSXNJblpqSWpwN0lrQmpiMjUwWlhoMElqcGJJbWgwZEhCek9pOHZkM2QzTG5jekxtOXlaeTh5TURFNEwyTnlaV1JsYm5ScFlXeHpMM1l4SWl3aWFIUjBjSE02THk5d2RYSnNMbWx0YzJkc2IySmhiQzV2Y21jdmMzQmxZeTl2WWk5Mk0zQXdMMk52Ym5SbGVIUXVhbk52YmlKZExDSnBaQ0k2SW5WeWJqcDFkV2xrT21Fd056SmpaR1ZtTFRRNU1USXROR05rWmkwNU9XTmlMVFl6WXpCaFpEZGxaV1ZrTVNJc0luUjVjR1VpT2xzaVZtVnlhV1pwWVdKc1pVTnlaV1JsYm5ScFlXd2lMQ0pQY0dWdVFtRmtaMlZEY21Wa1pXNTBhV0ZzSWwwc0ltNWhiV1VpT2lKS1JrWWdlQ0IyWXkxbFpIVWdVR3gxWjBabGMzUWdNeUJKYm5SbGNtOXdaWEpoWW1sc2FYUjVJaXdpYVhOemRXVnlJanA3SW5SNWNHVWlPbHNpVUhKdlptbHNaU0pkTENKcFpDSTZJbVJwWkRwclpYazZlalpOYTJwdlVtaHhNV3BUVGtwa1RHbHlkVk5ZY2taR2VHRm5jWEo2ZEZwaFdFaHhTRWRWVkV0S1ltTk9lWGR3SWl3aWJtRnRaU0k2SWtwdlluTWdabTl5SUhSb1pTQkdkWFIxY21VZ0tFcEdSaWtpTENKMWNtd2lPaUpvZEhSd2N6b3ZMM2QzZHk1cVptWXViM0puTHlJc0ltbHRZV2RsSWpvaWFIUjBjSE02THk5M00yTXRZMk5uTG1kcGRHaDFZaTVwYnk5Mll5MWxaQzl3YkhWblptVnpkQzB4TFRJd01qSXZhVzFoWjJWekwwcEdSbDlNYjJkdlRHOWphM1Z3TG5CdVp5SjlMQ0pwYzNOMVlXNWpaVVJoZEdVaU9pSXlNREkwTFRBNUxUSTNWREE1T2pJeE9qVXpMakUwTlRReE5UUXpNMW9pTENKbGVIQnBjbUYwYVc5dVJHRjBaU0k2SWpJd01qVXRNRGt0TWpkVU1EazZNakU2TlRNdU1UUTFOVE13TURjeVdpSXNJbU55WldSbGJuUnBZV3hUZFdKcVpXTjBJanA3SW1sa0lqb2laR2xrT21wM2F6cGxlVXB5WkVocmFVOXBTa1pSZVVselNXMU9lV1JwU1RaSmJFRjBUV3BWTWtscGQybGhNbXhyU1dwdmFWZFhiR3RaYm14MFl6SnNiMVpVYUdGVlJrVjNXakZDTTJORk1WbFhiVTVaVFRKU1NXRkhlR3RoYkdSM1lVVnNObU5zVWxGaFNHZzBVbE5KYzBsdVoybFBhVW8yWTI1V1RXUkljSEpVTWs1cVdWZG9UbFJyTlUxYWFrWnBWR3RLVms0elFYaE5NalUwWVRFNVExRnFWVFZrTVZaWVpXeEdWMVpITVdwSmFYZHBaVk5KTmtsdWNEUlZWVll4VGtaR05HSnRWbXhSYms1SFdWaE9WRmxyY0hSV2FrNXZWVlZvU2xsWVZrZGlNMFp6VGxkU05sb3hWbmxVZWtvd1ZXcG5hV1pSSWl3aWRIbHdaU0k2V3lKQlkyaHBaWFpsYldWdWRGTjFZbXBsWTNRaVhTd2lZV05vYVdWMlpXMWxiblFpT25zaWFXUWlPaUoxY200NmRYVnBaRHBoWXpJMU5HSmtOUzA0Wm1Ga0xUUmlZakV0T1dReU9TMWxabVE1TXpnMU16WTVNallpTENKMGVYQmxJanBiSWtGamFHbGxkbVZ0Wlc1MElsMHNJbTVoYldVaU9pSktSa1lnZUNCMll5MWxaSFVnVUd4MVowWmxjM1FnTXlCSmJuUmxjbTl3WlhKaFltbHNhWFI1SWl3aVpHVnpZM0pwY0hScGIyNGlPaUpVYUdseklIZGhiR3hsZENCemRYQndiM0owY3lCMGFHVWdkWE5sSUc5bUlGY3pReUJXWlhKcFptbGhZbXhsSUVOeVpXUmxiblJwWVd4eklHRnVaQ0JvWVhNZ1pHVnRiMjV6ZEhKaGRHVmtJR2x1ZEdWeWIzQmxjbUZpYVd4cGRIa2daSFZ5YVc1bklIUm9aU0J3Y21WelpXNTBZWFJwYjI0Z2NtVnhkV1Z6ZENCM2IzSnJabXh2ZHlCa2RYSnBibWNnU2taR0lIZ2dWa010UlVSVklGQnNkV2RHWlhOMElETXVJaXdpWTNKcGRHVnlhV0VpT25zaWRIbHdaU0k2SWtOeWFYUmxjbWxoSWl3aWJtRnljbUYwYVhabElqb2lWMkZzYkdWMElITnZiSFYwYVc5dWN5QndjbTkyYVdSbGNuTWdaV0Z5Ym1Wa0lIUm9hWE1nWW1Ga1oyVWdZbmtnWkdWdGIyNXpkSEpoZEdsdVp5QnBiblJsY205d1pYSmhZbWxzYVhSNUlHUjFjbWx1WnlCMGFHVWdjSEpsYzJWdWRHRjBhVzl1SUhKbGNYVmxjM1FnZDI5eWEyWnNiM2N1SUZSb2FYTWdhVzVqYkhWa1pYTWdjM1ZqWTJWemMyWjFiR3g1SUhKbFkyVnBkbWx1WnlCaElIQnlaWE5sYm5SaGRHbHZiaUJ5WlhGMVpYTjBMQ0JoYkd4dmQybHVaeUIwYUdVZ2FHOXNaR1Z5SUhSdklITmxiR1ZqZENCaGRDQnNaV0Z6ZENCMGQyOGdkSGx3WlhNZ2IyWWdkbVZ5YVdacFlXSnNaU0JqY21Wa1pXNTBhV0ZzY3lCMGJ5QmpjbVZoZEdVZ1lTQjJaWEpwWm1saFlteGxJSEJ5WlhObGJuUmhkR2x2Yml3Z2NtVjBkWEp1YVc1bklIUm9aU0J3Y21WelpXNTBZWFJwYjI0Z2RHOGdkR2hsSUhKbGNYVmxjM1J2Y2l3Z1lXNWtJSEJoYzNOcGJtY2dkbVZ5YVdacFkyRjBhVzl1SUc5bUlIUm9aU0J3Y21WelpXNTBZWFJwYjI0Z1lXNWtJSFJvWlNCcGJtTnNkV1JsWkNCamNtVmtaVzUwYVdGc2N5NGlmU3dpYVcxaFoyVWlPbnNpYVdRaU9pSm9kSFJ3Y3pvdkwzY3pZeTFqWTJjdVoybDBhSFZpTG1sdkwzWmpMV1ZrTDNCc2RXZG1aWE4wTFRNdE1qQXlNeTlwYldGblpYTXZTa1pHTFZaRExVVkVWUzFRVEZWSFJrVlRWRE10WW1Ga1oyVXRhVzFoWjJVdWNHNW5JaXdpZEhsd1pTSTZJa2x0WVdkbEluMTlmWDBzSW1wMGFTSTZJblZ5YmpwMWRXbGtPbUV3TnpKalpHVm1MVFE1TVRJdE5HTmtaaTA1T1dOaUxUWXpZekJoWkRkbFpXVmtNU0lzSW1WNGNDSTZNVGMxT0RrMk5Ea3hNeXdpYVdGMElqb3hOekkzTkRJNE9URXpMQ0p1WW1ZaU9qRTNNamMwTWpnNU1UTjkuS0hSTzJNMkVld2p2bUVOOFkzSHloSnRMUVVFYXkySE9nNEF4ZnUtT04tZFlHRmxwWDYzNWR2UWoxcFcwaXV2OXV5LVhDYmNWV0g5TWJEeGZvS3UzQmciXX19.pAQDUnGESJRhACTyok-ICREUbQ9fCuJvwIAVwyuBInhM2EogJK29Jp4eWwDZ1pRJMyB0NubyjcU3CzFrAzUvhw"
}'
Path Parameters
wallet
: - You can receive the needed wallet id parameter via the/wallet-api/wallet/accounts/wallets
endpoint.
Body Parameters
did
- value copied from response to/prepare
w3cJwtVpProof
- signed JWT from step 2 "Signing the VP".presentationRequest
- value copied from response to/prepare
presentationSubmission
- value copied from response to/prepare
selectedCredentialIdList
- value copied from response to/prepare
Example Response
If the verifier provided a redirect URI we will receive it as a response.
{
"redirectUri": null
}