Sesión Embebida¶
Invocación¶
Si se invoca al SIP+ con parámetros de URL embedSystem
y embedToken
, el SIP+ buscará en su configuración una sección embed.<embedSystem>
y, de encontrarla, invocará a URL especificada en la propiedad getSession.url
de esa sección, sustituyendo $token
por el valor recibido en embedToken
.
Ejemplo:
Si se invoca al SIP+ a:
http://sipplus.org:9000?embedSystem=DEMO&embedToken=4ce0d29c-ba74-4060-9018-a72beb599d51
y se tiene en sip-plus.conf
la siguiente sección:
embed { demo { getSession { url = "http://sipplus.org:9000/embed-demo/session/$token" } } }
Entonces el SIP+ invocará (mediante HTTP GET ) a:
http://sipplus.org:9000/embed-demo/session/4ce0d29c-ba74-4060-9018-a72beb599d51
para obtener los datos de la sesión. Esta URL es la especificada en embed.demo.getSession.url
, sustituyendo $token
por el valor pasado en embedToken
en la URL, mientras que demo
corresponde al valor pasado en embedSystem
(En la configuración el nombre del sistema debe estar con minúsculas. En la URL es indiferente).
Importante: El sistema externo debe generar un nuevo token único para cada nueva sesión embebida. Adicionalmente, debe implementar un mecanismo de expiración de dichos tokens. De no seguir con estos lineamientos se está incurriendo en una falla de seguidad.
Formato de respuesta¶
La respuesta debe incluir el header Content-Type: application/json
y contener la información de sesión en el body en formato JSON con la siguiente estructura:
{ "user": { "id": <STRING>(1), "userName": <STRING>, "fullName": <STRING>, "countryId": <STRING>(2), "roles": <ARRAY:ROLE>, "institutions": <ARRAY:INSTITUTION>(3), "readableInstitutions": <ARRAY:INSTITUTION>(4) }, "institution": <INSTITUTION>(5), "embedCoordinates": <EMBED_COORDINATES>(6) }
Con los siguientes formatos para los elementos:
<ROLE>: { "id": <STRING>(7), "name": <STRING>, "permissions": <ARRAY:STRING>(8) }
<INSTITUTION>: { "id": { "countryId": <STRING>, "divisionId": <STRING>, "subdivisionId": <STRING>, "code": <STRING> }, "name": <STRING> }
<EMBED_COORDINATES>: { "form": <STRING>, "section": <NUMBER>(9), "embedId": <STRING>(10), "motherIdentification": { "countryCode": <STRING>(11), "typeCode": <STRING>(12), "number": <STRING> }, "pregnancy": <NUMBER>(13), "child": <NUMBER>, "ignoreLocks": <BOOLEAN>(14) }
Comentarios :
(1) "id"
: El id de usuario debe ser un UUID en formato 8-4-4-4-12 que lo identifique de forma única. Si no se dispone de un id en este formato, ver sección «Sobre UUIDs» más adelante.
(2) "countryId"
: Código ISO-3166-1 alpha-2 del país (https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2).
(3) "institutions"
: Son todas las instituciones a las que el usuario pertenece. Puede ser una lista vacía si el usuario tiene el permiso AccessAllInstitutions.
(4) "readableInstitutions"
: Son todas las instituciones que el usuario puede consultar.
Para los combos de selección de institución, cada control especifica si se toma la lista de posibles valores de "institution"
o "readableInstitutions"
. (Si el usuario tiene el permiso AccessAllInstitutions y la lista «instituions» está vacía, se utilizará siembre «readableInstitutions».)
(5) "institution"
: Es la institución a la que está logueado el usuario. Se guarda junto con los datos del usuario en las trazas de auditoría. Si el usuario tiene el permiso AccessAllInstitutions , se puede omitir este elemento.
(6) "embedCoordinates"
: Si está presente, el SIP+ embebido quedará cautivo en el registro especificado, y en el formulario y sección especificadas. Si esta sección se omite, el SIP+ se comportará normalmente, comenzando por la pantalla de búsqueda de registros.
(7) "id"
: El id de rol debe ser un UUID en formato 8-4-4-4-12. Si no se dispone de un id en este formato, ver sección «Sobre UUIDs» más adelante.
(8) "permissions"
: La lista de posibles permisos se incluye más adelante.
Si el sistema externo no utiliza un mecanismo de agrupación de permisos en roles, simplemente pasar un rol ficticio y poner allí todos los permisos.
(9) "section"
: De omitirse la sección, se podrá navegar entre las secciones del formulario a las que se tenga acceso.
(10) "embedId"
: Identifiación única de la gesta en el sistema externo.
(11) "countryCode"
: ver (2).
(12) "typeCode"
: La lista de posibles tipos de documento se incluye más adelante.
(13) "pregnancy"
: El número de gesta se puede omitir. Si se omite, y aún no hay una gesta del SIP+ asociada a»embedId», se mostrará una pantalla previa de selección de gesta.
(14) "ignoreLocks"
: En caso de ser true, se ignorarán los bloqueos de campos de las firmas del registro. Se puede omitir, en cuyo caso tendrá valor false.
Sobre UUIDs¶
Los "id"
de usuario y roles sirven para identificar estas entidades de forma única. Es importante que haya una correspondencia única entre el "id"
y la entidad. En particular, el "id"
de usuario se guarda en la traza de auditoría.
En caso de no disponer de identificadores únicos en formato UUID, es posible convertir otros formatos a UUID:
- String → UUID : Es posible convertir cualquier string a un UUID de forma determinista utilizando la variante 3 o 5 de UUID. Estas variantes permiten combinar un UUID al azar (de tipo 1 o 4, el cual el sistema externo debería generar una única vez y guardar) con un string arbitrario para generar un nuevo UUID: https://en.wikipedia.org/wiki/Universally_unique_identifier#Versions_3_and_5_(namespace_name-based)
- Entero → UUID : Es posible convertir un entero a un UUID simplemente agregando ceros a la izquierda hasta tener un número de 32 dígitos, y luego forzando el formato 8-4-4-4-12. Alternativamente, se puede convetir el entero a un string y aplicar el método anterior.
Como última alternativa, si no se dispone de un identificador único de ningún tipo, se puede pasar el valor 00000000-0000-0000-0000-000000000000
. En particular, si el sistema externo no maneja el concepto de roles, se puede pasar un único rol con este "id"
. Se recomienda no utilizar este método para el "id"
de usuario: es mejor utilizar el método descripto para convertir string a UUID, aplicándolo al valor que se pasa en "userName"
.
Configuración adicional¶
En la configuración del sistema embebido en el archivo sip-plus.conf
es posible definir más de un sistema embebido. Para cada sistema embebidor, además de especificar getSession.url
, es posible definir:
language
: Determina el lenguaje en que se mostrará el SIP+. Los posibles valores sonSpanish
,English
,Portuguese
,French
yDutch
. Si este parámetro se omite, por defecto tendrá valorSpanish
.getSession.method
: Método HTTP a utilizar en la invocación agetSession.url
. Puede serGET
oPOST
. En caso de usarPOST
, los parámetros se enviarán en el cuerpo de la invocación, en un objeto JSON con propiedades"embedSystem"
y"embedToken"
. Si este parámetro se omite, por defecto tendrá valorGET
.getSession.username
: Nombre de usuario a utilizar en caso de que la invocación agetSession.url
requiera autenticación.getSession.password
: Contraseña a utilizar en caso de que la invocación agetSession.url
requiera autenticación.getSession.headers
: Headers adicionales a agregar a la invocación agetSession.url
. Es un objeto especificando cada header y su valor. Por ejemplo:getSession.headers {x-domain: "sip-plus"}
.shadowEdit
: Si tiene valortrue
, entonces todas las modificaciones realizadas a los registros con el SIP+ en este modo embebido (para esteembedId
específico) se mantendrán en un registro «sombra» y no serán visibles cuando se utilice el SIP+ en modo normal (o en otros sistemas embebidos) hasta que el registro sea firmado. Nótese que los cambios realizados en SIP+ en modo normal (o en otros sistemas embebidos conshadowEdit = false
), SÍ se verán cuando se utilice SIP+ en este sistema embebido. Al momento de firmar el registro, los cambios del registro «sombra» se impactarán sobre el registro principal. Si este parámetro se omite, por defecto tendrá valorfalse
.lockOnSign
: Si tiene valortrue
, entonces cuando un registro sea firmado, los campos firmados pasarán a ser de sólo lectura. Si este parámetro se omite, por defecto tendrá valorfalse
.services.username
: Si se especifica, las operaciones adicionales de modo cautivo requerirán de autenticación básica HTTP con este nombre de usuario. Si este parámetro se omite, o se omiteservices.password
, no se protegerán con autenticación los servicios adicionales de modo cautivo.services.password
: Si se especifica, las operaciones adicionales en modo cautivo requerirán de autenticación básica HTTP con esta contraseña. Si este parámetro se omite, o se omiteservices.username
, no se protegerán con autenticación los servicios adicionales de modo cautivo.
Ejemplo:
embed { demo { language = Spanish getSession { url = "http://sipplus.org:9000/embed-demo/session/$token" method = POST } shadowEdit = true lockOnSign = false } test { language = English getSession.url = "http://sipplus-english.org:9000/embed-demo/session/$token" shadowEdit = false lockOnSign = true services { username = "user" password = "password" } } }
Lista de posibles permisos¶
AccessFormSection(formulario, sección)
EditForms
PrintForms
DeleteForms
CloseForms
VerifyForms
ShowStatistics
ShowReports
ManageUsers
ManageSessions
ShowDBStatistics
ImportDB
ExportDB
ExportLocalDBToFile
ImportLocalDBFromFile
ExportRemoteDBToFile
ImportRemoteDBFromFile
DestroyLocalDB
AccessAllInstitutions
NavigatePregnancies
ShowFormHistories
Lista de posibles tipos de documento¶
PSP
: PasaporteCI
: Cédula de Identidad (UY
,BO
,BR
,CL
,CR
,EC
,NI
,PA
,PY
,VE
)CIE
: Cédula de Identidad y Electoral (DO
)DNI
: Documento Nacional de Identidad (AR
,PE
)DUI
: Documento Único de Identidad (SV
)DPI
: Documento Personal de Identificación (GT
)TDI
: Tarjeta de Identidad (HN
)CPF
: Registro de Personas Físicas (BR
)RG
: Registro General (BR
)CC
: Cédula de Ciudadanía (CO
)CURP
: Clave Única de Registro de Población (MX
)CRED
: Credencial CívicaDRV
: Licencia de ConducirEXP
: Número de ExpedienteOTR
: Otro
Lista de posibles formularios¶
SIPNM
(33 secciones): Historia Clínica Perinatal con Near Miss con secciones pequeñas.SIPNM2
(9 secciones): Historia Clínica Perinatal con Near Miss con secciones grandes.SIPNMArg
(33 secciones): Historia Clínica Perinatal con Near Miss de Argentina con secciones pequeñas.SIPNM2Arg
(9 secciones): Historia Clínica Perinatal con Near Miss de Argentina con secciones grandes.SIPNMUy
(33 secciones): Historia Clínica Perinatal con Near Miss de Uruguay con secciones pequeñas.SIPNM2Uy
(9 secciones): Historia Clínica Perinatal con Near Miss de Uruguay con secciones grandes.Aborto
(15 secciones).Neonatal
(11 secciones).Comunitario
(6 secciones).Zika
(1 sección).CNVUY
(2 secciones): Certificado de Nacido Vivo de Uruguay.SIPNMBol
(10 secciones): Historia Clínica Perinatal con Near Miss de Bolivia.SIPCar
(6 secciones): Historia Clínica Perinatal del Caribe.SIPStK
(6 secciones): Historia Clínica Perinatal de St Kitts & Navis.SIPBah
(6 secciones): Historia Clínica Perinatal de Bahamas.SIPTYT
(6 secciones): Historia Clínica Perinatal de Trinidad & Tobago.SIPMalf
(2 secciones): Anomalías congénitas.SIPNotas
(1 sección): Anotaciones.
En general los formularios con secciones pequeñas se ajustan bien a dispositivos móviles, mientras lo que tienen secciones grandes pueden mostrar más información a la vez en clientes web.
Ejemplo¶
La instalación del SIP+ incluye un web service de ejemplo donde se puede ver una respuesta esperada válida para la resolución de un token en parámetros de sesión embebida.
Dicho ejemplo está accesible en
http://sipplus.org:9000/embed-demo/session/$token
Esta demo se comporta de tal forma de que simula resolver el token dependiendo de sus últimos 11 dígitos de la siguiente forma:
Si los últimos 11 dígitos son AAAAABBBXYZ
, entonces:
- Si
Z == 0
, SIP+ se ejecuta en modo embebido normal, con todas sus funcionalidades. Se utiliza un usuario ficticio, permiso para acceder a todas las instituciones y edición de todas las secciones deSIPNM2
(únicamente este formulario). - Si
Z >= 1
yZ <= 9
, SIP+ se ejeuta en modo cautivo (sólo se puede ver una sección de un formulario en un registro dado). En este caso, el formulario seráSIPNM2
y además:Z
será el número de sección.- Si
Y == 0
, no se especificará gesta y SIP+ preguntará cuál se debe utilizar. - Si
Y >= 1
yY <= 9
, será el número de gesta. X
será el número de recién nacido.AAAAA
será el número de cédula de identidad uruguaya de la madre.BBB
será el identificador externo de la gesta.
Importante: Cabe mencionar que toda esta lógica es utilizada solamente a modo de simulación por el web service de ejemplo. En una integración real, el sistema externo deberá generar un UUID único al azar como forma de token y guardar su propia base de datos el vínculo entre dicho token y los parámetros de sesión.
Ejemplos:
- Con el token
00000000-0000-0000-0000-044762129211
:- El número de cédula será 44762.
- El identificador externo será 129.
- La gesta será 2.
- El recién nacido será 1.
- Se mostrará el SIP+ cautivo con esos datos en la primera sección de
SIPNM2
.
- Con el token
00000000-0000-0000-0000-000000000000
:- SIP+ se ejecuta en modo normal (con usuario ficticio y permisos determinados como se explica arriba).
- Al ser el último dígito 0 se ignoran el resto de los dígitos.
Nota: Es posible habilitar el modo embebido de demo si se descomenta la sección específica en sip-plus.conf
. Esto puede ser útil para ver en funcionamiento el ciclo completo pero bajo ninguna circunstancia se debe poner en producción un sistema con esta sección descomentada, ya que sería una severa falla de seguridad.