Saltar al contenido principal

Presentar una credencial

La wallet presenta credenciales a verificadores mediante el protocolo OID4VP 1.0 (OpenID for Verifiable Presentations). La wallet usa DCQL (Digital Credentials Query Language) para interpretar los criterios de selección de credenciales que el verificador solicita.

DCQL, no DIF Presentation Exchange

La wallet ISBE implementa OID4VP con DCQL. Los verificadores que quieran interoperar deben emitir authorization_request con DCQL queries. El formato presentation_definition de DIF Presentation Exchange (PEv2) no está soportado.

Cómo inicia el verificador la solicitud

El verificador genera una solicitud de autorización (authorization request) y la entrega al holder de una de estas formas:

  • Código QR: el holder escanea el QR con la cámara de la wallet.
  • Deep link: el holder pulsa un enlace en el navegador o en una aplicación. El esquema del enlace es openid4vp://.

Flujo completo

Paso a paso en la wallet

  1. Escanea el QR — Abre la wallet y pulsa el icono de cámara, o abre el deep link desde el navegador o una aplicación del verificador.
  2. Revisa la solicitud — La wallet muestra qué verificador está solicitando la presentación y qué atributos o credenciales solicita.
  3. Selección de credenciales — Si tienes varias credenciales que cumplen los criterios DCQL, la wallet te permite elegir cuál presentar.
  4. Consentimiento de presentación — Pulsa "Compartir" para confirmar que autorizas el envío. La wallet no comparte nada sin confirmación explícita.
  5. Resultado — La wallet envía la VP al verificador y muestra una confirmación de envío.
La wallet presenta la credencial completa

La divulgación selectiva (compartir solo algunos atributos) no está disponible en la implementación actual. La wallet incluye la credencial completa en la presentación verificable.

Formato de la Verifiable Presentation

La wallet construye la VP como un JWT firmado con la clave privada del holder. La respuesta al verificador tiene la forma:

POST <response_uri>
Content-Type: application/x-www-form-urlencoded

vp_token=eyJhbGciOiJFUzI1NiIsImtpZCI6ImRpZDprZXk6...&
presentation_submission=...

El vp_token es un JWT con la siguiente estructura:

{
"iss": "did:key:z6MkszZtxCmA2Ce4vUV132PCuLQmwnaDD5mw2L23fGNnsiRn",
"aud": "https://verifier.ejemplo.com",
"nonce": "n-0S6_WzA2Mj",
"vp": {
"@context": ["https://www.w3.org/2018/credentials/v1"],
"type": ["VerifiablePresentation"],
"verifiableCredential": ["eyJhbGciOiJFUzI1NiIs..."]
}
}

El iss es el DID del holder (did:key o did:jwk). El campo aud es el identificador del verificador tal como aparece en el authorization_request. El nonce previene ataques de replay y lo proporciona el verificador en la solicitud.

El método de respuesta es siempre direct_post: la wallet envía la VP directamente al response_uri del verificador via HTTP POST.

Para integradores: estructura del authorization_request

El verificador debe emitir una solicitud de autorización con DCQL. Ejemplo de solicitud por referencia:

openid4vp://?request_uri=https%3A%2F%2Fverifier.ejemplo.com%2Frequest%2Fabc123

El objeto authorization_request al que apunta request_uri debe incluir:

{
"response_type": "vp_token",
"response_mode": "direct_post",
"response_uri": "https://verifier.ejemplo.com/response",
"nonce": "n-0S6_WzA2Mj",
"dcql_query": {
"credentials": [
{
"id": "credential_query_id",
"format": "jwt_vc_json",
"claims": [
{"path": ["$.vc.credentialSubject.nombre"]},
{"path": ["$.vc.credentialSubject.fechaNacimiento"]}
]
}
]
}
}

La wallet responde con vp_token y presentation_submission en el response_uri.

Consulta la Referencia OID4VCI/VP para la especificación detallada del protocolo OID4VP y el formato DCQL.