Gestión y Emisión de la Credencial
Emisión de una Nueva Credencial
Este es el proceso completo, paso a paso, que ocurre desde que el ciudadano inicia la solicitud hasta que recibe su credencial.
Paso 1: Inicio de Sesión y Autenticación Fuerte
El ciudadano necesita probar su identidad al sistema de emisión. Esto se logra mediante el flujo de Código de Autorización de OIDC.
Acción del Usuario: El usuario presiona "Solicitar Licencia Digital" en la wallet Soy Yo RD.
Llamada Inicial (Frontend): La wallet Soy Yo RD genera e invoca una llamada de autorización a Cuenta Única. No es una API REST directa, sino una redirección del navegador en la app (o un Custom Chrome Tab / ASWebAuthenticationSession).
Ejemplo de URL de Autorización (GET):
https://auth.cuentaunica.gob.do/auth?
response_type=code
&client_id=SOYYO_RD_WALLET_CLIENT_ID
&scope=openid profile cedula
&redirect_uri=soyyord://callback
&state=STATE_STRING_ALEATORIO
&nonce=NONCE_STRING_ALEATORIO
&code_challenge=S256_CHALLENGE
&code_challenge_method=S256
Autenticación del Usuario: El usuario se autentica en la interfaz web de Cuenta Única (usuario, contraseña, 2FA).
Redirección con Código: Cuenta Única redirige de vuelta a la app Soy Yo RD a través de la redirect_uri con un código de autorización.
Intercambio del Código por Tokens (Backend-a-Backend): La wallet envía el code a su propio backend de soporte (o lo hace directamente si es una app confidencial), el cual realiza una llamada API REST (POST) al endpoint de token de Cuenta Única. Esta comunicación es segura (backend a backend) y evita exponer los tokens en el lado del cliente.
Llamada a la API de Token (POST):
https://auth.cuentaunica.gob.do/token
Headers: Content-Type: application/x-www-form-urlencoded
Body:
grant_type=authorization_code
&code=CODIGO_RECIBIDO
&redirect_uri=soyyord://callback
&client_id=SOYYO_RD_WALLET_CLIENT_ID
&client_secret=CLIENT_SECRET_DE_LA_APP
&code_verifier=VERIFIER_ORIGINAL
Respuesta de la API de Token: Cuenta Úunica responde con un objeto JSON que contiene los tokens de acceso e identidad.
Formato de Respuesta (JSON):
{
"access_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6...",
"token_type": "Bearer",
"expires_in": 3600,
"id_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6..."
}
El id_token es un JSON Web Token (JWT) que, al ser decodificado, contiene la información verificada del ciudadano, como su número de Cédula.
Paso 2: Solicitud Formal de la Credencial
Con la prueba de identidad (el id_token o access_token), la wallet ahora puede solicitar la credencial al servidor de emisión del INTRANT.
Llamada a la API de Emisión (POST): La wallet Soy Yo RD realiza una llamada HTTPS a la API de Inji-Certify.
https://api.intrant.gob.do/v1/issue/driving-license
Headers: Authorization: Bearer <access_token_de_cuenta_unica>
Body (JSON):
{
"holderDid": "did:key:z6Mkt...H73tias"
}
Información Relevante:
access_token en el header autoriza la operación y permite a Inji-Certify identificar al solicitante (consultando el endpoint /userinfo de Cuenta Única o validando el id_token).
El holderDid es el Identificador Descentralizado del ciudadano, generado por la wallet. Será el id del sujeto (credentialSubject) en la VC.
Paso 3: Verificación Interna y Construcción de la VC
El servidor de emisión ahora tiene todo lo necesario para procesar la solicitud.
Validación de Identidad: El backend de Inji-Certify valida el access_token con Cuenta Única.
Consulta a la Base de Datos: Utilizando el número de Cédula extraído del token, el sistema realiza una consulta a la base de datos interna del INTRANT para obtener los datos de la licencia del ciudadano.
SELECT * FROM licencias WHERE cedula = ?.
Construcción de la VC: Si se encuentran datos válidos, Inji-Certify ensambla la Credencial Verificable.
Formato de la VC (JSON-LD):
{
"@context": [
"https://www.w3.org/2018/credentials/v1",
"https://w3id.org/vdl/v1" // Contexto específico para licencias de conducir
],
"id": "urn:uuid:3978344f-8596-4c3a-a978-8fcaba3903c5",
"type": ["VerifiableCredential", "Iso18013DriversLicense"],
"issuer": "did:web:intrant.gob.do", // DID del INTRANT
"issuanceDate": "2025-10-26T14:23:14Z",
"expirationDate": "2029-10-26T14:23:14Z",
"credentialSubject": {
"id": "did:key:z6Mkt...H73tias", // DID del ciudadano
"familyName": "Perez",
"givenName": "Juan",
"birthDate": "1990-01-15",
"issuingCountry": "DO",
"drivingPrivileges": [
{
"vehicleCategory": "B",
"issueDate": "2021-10-26",
"expiryDate": "2025-10-26"
}
]
},
"proof": { // Este bloque se añade después de firmar
"type": "Ed25519Signature2020",
"created": "2025-10-26T14:23:14Z",
"verificationMethod": "did:web:intrant.gob.do#key-1",
"proofPurpose": "assertionMethod",
"proofValue": "z58D3...2k9fV" // La firma digital
}
}
Firma Criptográfica: El servidor firma el objeto JSON-LD (excluyendo el bloque proof) utilizando la clave privada del INTRANT, almacenada en un Hardware Security Module (HSM) para máxima seguridad. El resultado es el proofValue.
Paso 4: Devolución de la Credencial
El servidor responde a la llamada API del Paso 2.
La wallet Soy Yo RD recibe este objeto JSON, valida la firma del emisor (resolviendo el did:web:intrant.gob.do para obtener la clave pública) y lo almacena de forma segura en el almacenamiento cifrado del dispositivo.
Gestión del Ciclo de Vida: Revocación
La revocación es crítica. No es suficiente con que una credencial tenga una firma válida; debe estar activa.
Mecanismo: Status List 2021. El INTRANT mantiene un endpoint público que expone un bitmap (una larga cadena de bits, 0s y 1s). Cada credencial emitida está asociada a un índice en esta lista.
Acción de Revocación: Cuando un oficial del INTRANT revoca una licencia en el sistema, la acción interna es una llamada API (PUT o PATCH) al servicio que gestiona la lista de estado para cambiar el bit en el índice correspondiente de 0 (válido) a 1 (revocado).
https://api.intrant.gob.do/v1/statuslist/main
Body (JSON):
{
"credentialId": "urn:uuid:3978344f-8596-4c3a-a978-8fcaba3903c5",
"status": "revoked"
}
API Pública de la Lista de Estado: Los verificadores acceden a esta lista a través de un endpoint público definido en la propia VC (propiedad credentialStatus).
Llamada del Verificador (GET):
https://api.intrant.gob.do/v1/status/1 (ejemplo)
Respuesta: Un objeto JSON que contiene el bitmap comprimido. El software del verificador lo usa para comprobar el estado de la credencial que está validando.
Esta arquitectura asegura un flujo de emisión robusto, seguro y estandarizado, donde cada componente se comunica a través de APIs bien definidas, utilizando formatos de datos interoperables como JSON, JWT y JSON-LD.