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 RDgenera e invoca una llamada de autorización aCuenta Ú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 Únicaredirige de vuelta a la appSoy Yo RDa través de laredirect_uricon un código de autorización. -
Intercambio del Código por Tokens (Backend-a-Backend): La wallet envía el
codea 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 deCuenta Ú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):
-
Endpoint:
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
-
Endpoint:
-
Respuesta de la API de Token:
Cuenta Úunicaresponde 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_tokenes 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 RDrealiza una llamada HTTPS a la API deInji-Certify.-
Endpoint:
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:
- El
access_tokenen el header autoriza la operación y permite aInji-Certifyidentificar al solicitante (consultando el endpoint/userinfode Cuenta Única o validando elid_token). - El
holderDides el Identificador Descentralizado del ciudadano, generado por la wallet. Será eliddel sujeto (credentialSubject) en la VC.
- El
-
Endpoint:
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-Certifyvalida elaccess_tokenconCuenta Ú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.
-
Mecanismo: Conexión de base de datos segura (ej. sobre un túnel VPN) con una consulta tipo
SELECT * FROM licencias WHERE cedula = ?.
-
Mecanismo: Conexión de base de datos segura (ej. sobre un túnel VPN) con una consulta tipo
-
Construcción de la VC: Si se encuentran datos válidos,
Inji-Certifyensambla 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 elproofValue.
Paso 4: Devolución de la Credencial
El servidor responde a la llamada API del Paso 2.
-
Respuesta de la API de Emisión (Código 200 OK):
- Body (JSON): El cuerpo de la respuesta es directamente la Credencial Verificable completa, en formato JSON-LD, tal como se describió arriba.
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) a1(revocado).-
Endpoint (interno):
https://api.intrant.gob.do/v1/statuslist/main -
Body (JSON):
{ "credentialId": "urn:uuid:3978344f-8596-4c3a-a978-8fcaba3903c5", "status": "revoked" }
-
Endpoint (interno):
-
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):
-
Endpoint:
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.
-
Endpoint:
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.