Computing">
Doc. Integración Appcrue v7.6
Doc. Integración Appcrue v7.6
Doc. Integración Appcrue v7.6
DE LA UNIVERSIDAD
Impulsado por:
1 INTRODUCCIÓN ....................................................................................................................... 5
1.1 Propósito ............................................................................................................................... 5
1.2 Alcance .................................................................................................................................. 5
2 COMUNICACIONES ................................................................................................................. 6
3 SEGURIDAD............................................................................................................................... 8
4 ARQUITECTURA....................................................................................................................... 9
5 LISTADO DE SERVICIOS ....................................................................................................... 10
6 Servicios básicos ........................................................................................................................ 11
6.1 Oferta académica ................................................................................................................. 11
6.2 Login de usuario .................................................................................................................. 13
6.2.1 Login interno ................................................................................................................ 13
6.2.2 Login externo ............................................................................................................... 14
6.2.3 Refresco del token ........................................................................................................ 14
6.2.3.1 Caducidad del token ............................................................................................. 15
6.2.3.2 Refresco del token para login interno ................................................................... 15
6.3 Datos de usuario .................................................................................................................. 16
6.3.1 Datos identificativos y personales del usuario. ............................................................ 18
6.3.2 Etiquetas. ...................................................................................................................... 20
6.3.3 Listado de asignaturas. ................................................................................................. 24
6.3.4 JSONs de Ejemplo. ...................................................................................................... 25
6.4 vTUI .................................................................................................................................... 26
6.5 Nota explicativa del proceso de login y actualización de datos: ......................................... 26
6.6 Logout para login externo ................................................................................................... 26
7 EXPEDIENTE ACADÉMICO A NIVEL USUARIO ............................................................... 27
7.1 Consulta de expediente ........................................................................................................ 27
7.2 Consulta de notas ................................................................................................................ 28
8 MIS EXÁMENES A NIVEL USUARIO ................................................................................... 31
9 MI HORARIO A NIVEL USUARIO ........................................................................................ 32
10 MENSAJE DOCENTE-ESTUDIANTE .................................................................................... 34
11 DIRECTORIO ........................................................................................................................... 37
12 CALENDARIO ÚNICO: Servicio calendario personal ............................................................ 43
13 LECTURA CÓDIGOS QR ........................................................................................................ 46
13.1 Creación de códigos QR desde el Gestor ........................................................................ 46
13.2 Widget “Presencia QR” ................................................................................................... 46
1.1 Propósito
El presente documento tiene como propósito principal, definir y explicar todos los
requerimientos técnicos necesarios para que una universidad pueda integrarse correctamente con
los diversos servicios y funcionalidades que brinda la plataforma appCRUE.
1.2 Alcance
La solución definida se encuadra dentro de la plataforma appCRUE. El ámbito de aplicación será
para todas aquellas universidades, que firmen el convenio de participación en el proyecto con la
CRUE.
Para realizar la integración con la universidad, es necesario que esta habilite las IPs
correspondientes a los entornos de desarrollo, preproducción y producción en el caso de que se
disponga de firewall/proxy de entrada a los servicios. Estas IPs son:
Entorno IP pública
Producción 1 34.248.235.252
Preproducción 52.212.141.67
Desarrollo (banco) 193.127.221.5
Desarrollo 2 (banco) 88.12.28.89
Producción 2 52.208.70.223
Producción 3 52.50.43.57
Tabla 1 IPS de entornos
Nota: Al hacer ping sobre la DNS de producción, devolverá la IP del balanceador, pero no es
necesario darla de alta puesto que no es la máquina que luego gestiona las peticiones.
Por parte de la universidad, será necesario que está disponga de dos entornos. Un entorno
de preproducción (utilizado para la realización de pruebas) y otro de producción. En ambos entornos
deben de estar habilitadas las IPs anteriormente mencionadas.
Es importante indicar, que el entorno de producción tiene que tener habilitados los accesos
al exterior, sobre todo en el caso de que el servicio de login utilice autenticación SSO (Single Sing-
On) como puede ser CAS, SAML o OAuth2. Ya que será el dispositivo móvil el que realice
directamente la invocación, sin pasar por los servidores de backend.
El cifrado o comunicaciones con la universidad se establece en función de las peculiaridades de
cada universidad, siendo recomendable cifrar o autenticar el usuario o la información en función de
si esta información es sensible (datos personales de usuario, notas…) o bien, es información de
carácter público (oferta académica, información relativa a la universidad,…).
Una vez dadas de alta las comunicaciones, es necesario especificar los métodos de petición
correspondiente para obtener la información de los distintos servicios de la universidad. Para ello,
se propone como aplicación de pruebas de llamadas a los servicios Postman
(https://www.postman.com/), que emula las llamadas que realizará el backend. Estas invocaciones se
realizarán a través de llamadas GET, POST o Bearer con las cabeceras correspondientes.
• GET: Si simplemente se quiere cargar el contenido con información de carácter público que no
necesita ningún tipo de autenticación. Se le pueden pasar parámetros en la propia cabecera.
• BEARER: Haciendo uso del esquema de autenticación HTTP que involucra tokens de seguridad
llamados bearer tokens. Este token es el generado por la universidad. Si por bearer se invoca
algún servicio, este tendrá que ser de tipo GET, para que sea reconocido por la App.
Respuesta Los parámetros de entrada son incorrectos. El token y/o el idioma están va-
ERROR 406 cíos, son nulos, o bien tienen un formato inadecuado. Este error es difícil
que se produzca con un servicio en producción.
o Como primera capa a nivel de sistemas, se propone autenticar los equipos origen y destino
por filtrado de las IP públicas indicadas en el apartado anterior. Con esto se logra que solo
los servidores de nuestro backend y los equipos conectados desde la IP de la oficina sean
los únicos que puedan acceder a los servicios expuestos por la universidad.
o Para la capa de transporte, se hace uso de TLS 1.2 (Transport Layer Security) para cifrar el
tráfico que entra y sale del backend.
o Uso de token propio AppCrue. Utilizamos un token propio que se va actualizando cada hora,
de manera que si se intercepta en alguna comunicación entre la app y el backend no podrá
usarse y los datos del usuario estarán a salvo.
o Restricción de uso del token de universidad exclusivo de backend. El token proporcionado
por la universidad para cada usuario es de uso exclusivo del backend. Sólo se le pasa a la
app en casos puntuales (uso de webviews, ciertos protocolos de single sign-on o integración
con terceros) pero jamás se almacena ni en la app ni en el dispositivo.
El token se usa para consultar los datos privados de los usuarios. Si se ha caducado, es el
backend el que avisa a la app. Esta puede pedir un refresco de token si dispone de este
servicio o lanzar la página de login, pero nunca tendrá almacenado el token.
o Limitación de las operaciones que se pueden realizar en nombre del usuario. Solo se
permiten acciones consultivas, aunque el token expuesto por la universidad permitiese
acciones de modificación o representación del usuario.
o La infraestructura de la AppCRUE, disponemos de redes separadas para PREPRODUCCIÓN
y para PRODUCCIÓN, cada una está en una VPC (Virtual Private Cloud) y sólo es accesible
por el equipo de AppCRUE a través de una VPN. El acceso a las máquinas se realiza me-
diante SSH y requiere una clave privada.
o El contenido que se visualiza en la app sólo es accesible (salvo que sea público) si el usua-
rio ha iniciado la sesión.
o Los datos que viajan desde los servicios expuestos por la universidad hasta la app, no se
guardan en ningún momento en la aplicación.
4 ARQUITECTURA
Se consideran servicios básicos a aquellos servicios que debe brindar la aplicación para poder
ser publicada en los Stores. Estos son:
o Oferta académica: Servicio que muestra la oferta académica existente por la universidad.
Se mostrará información similar a la mostrada en la página web de la universidad.
o Login: Servicio que autenticación del usuario.
o Datos de usuario: Servicio que retorna datos personales del usuario, etiquetas y
asignaturas. Información imprescindible para el correcto funcionamiento de otros
servicios y poder segmentar contenidos del gestor a los usuarios.
o TUI: Servicio necesario para mostrar la Tarjeta Universitaria Interactiva.
Aparte de estos servicios, se recomienda incluir el servicio de Notas. Ya que es el más utilizado
por los estudiantes, pero no es obligatorio para publicar la App. En los próximos apartados se
detallarán estos servicios y el formato de la respuesta esperado por AppCRUE.
Nota: Importante destacar que es necesario proporcionar usuarios de prueba, con todos los
roles disponibles (estudiante, PAS, PDI y usuarios mixtos), y que posean datos para mostrar la TUI.
Tanto para el entorno de Preproducción como el de Producción.
Estos servicios básicos (y el servicio de Notas), pueden ser implementados por la empresa
colaboradora Datio Software sin coste alguno para la universidad.
ofertaAcademica.js
on
El login completo del usuario en la App, se compone de dos partes: el servicio de login o
autenticación (que es muy dependiente de la universidad), y el servicio de información de usuario,
donde recuperamos la información necesaria para el funcionamiento de la aplicación.
El servicio de login será el encargado de realizar la autenticación. Esta autenticación puede ser
nativa, que es lo que llamamos login interno. O podría ser login externo, esto quiere decir que desde
la aplicación se levanta un navegador con la web de la universidad para autenticar, como puede ser
CAS, SAML o OAuth2.
En los dos casos se recupera un token, el cual denominamos token de universidad, y que será
el identificador único asociado al usuario. Será utilizado para recuperar la información de los
servicios nativos de la universidad, entre ellos el servicio que se comentará en el punto 5.3 “datos
de usuario”.
Este token está controlado por la universidad, que definirá su duración de validez y en todo
momento, y podrá revocarlos si lo estima oportuno.
Para incorporar el login interno se necesita un servicio REST al que llamando con el username
del usuario y la contraseña del usuario devuelve el token del usuario,
Request: AppCrue envía un username y password como parámetros de entrada en el body de la
llamada.
Parámetros entrada (POST):
Response: La universidad devuelve un Token, fecha de caducidad del mismo y un token de refresco.
Para logins externos, se especifica desde la pantalla de login propia de la universidad las
credenciales del usuario, teniendo que seguir el siguiente esquema de comunicación (en el diagrama
como ejemplo para OAuth2), incluyendo una redirección para devolver el control a las apps:
NOTA: El portal de autenticación tiene que estar abierto a tráfico, sin filtro ip, para que desde
cualquier sitio las aplicaciones nativas puedan acceder al login.
Callback URL
PREPRODUCCIÓN: https://pre.appuniversitaria.idsant.com/api/v7/external_login
PRODUCCIÓN: https://appuniversitaria.universia.net/api/v7/external_login
El parámetro donde tiene que venir el token que facilita la universidad como identificador del
usuario y la sesión se debe de llamar token.
Se recomienda que la Universidad exponga un servicio del refresco del token. Si el backend
AppCRUE detecta que ha caducado el token del usuario, invocaría a este servicio para renovar el
token y no deslogarle.
Aporta seguridad a los servicios sensibles de la universidad al estar rotando frecuentemente.
Se puede aplicar tanto a login interno como login externo.
Devuelve:
La plataforma AppCRUE invoca a un servicio REST de la universidad para recuperar los datos del
usuario que se acaba de logar en la aplicación.
El modelo esperado para la obtención de datos del usuario sería:
URL de ejemplo https://universidad.es/APIRestServices/api/AppCRUE/GetDatosUsuario
Método POST
Los parámetros de entrada son incorrectos. El token y/o el idioma están va-
ERROR 406 cíos, son nulos, o bien tienen un formato inadecuado. Este error es difícil
que se produzca con un servicio en producción.
El servicio de datos de usuario retorna una estructura de tipo JSON. La información que
contiene este JSON se divide en tres bloques. A continuación, se describen brevemente estos
bloques, posteriormente se pasará a explicar en detalle cada uno de ellos.
1. Datos identificativos y personales del usuario: Como pueden ser el nombre, apellidos,
rol, foto…. Estos datos son necesarios para identificar al usuario en todos los servicios y
son utilizado también, para poder personalizar contenidos de la App.
2. Etiquetas: Se utilizan para indicar los canales a los que está suscrito el usuario. Se utiliza
también para poder segmentar los contenidos de la aplicación (noticias, mensajes,
eventos, etc.), así como para el envío de notificaciones Push. Estas etiquetas pueden ser
vacías y no tienen por qué estar asociadas con la estructura académica, sino con aquellos
contenidos que realmente interesen al usuario.
3. Asignaturas: Para los usuarios con rol alumno, se le mostrarán las asignaturas a las cuales
está matriculado en el momento de la consulta. En el caso de usuario con rol profesor, se
mostrarán las asignaturas que actualmente está impartiendo. Para otros colectivos como
Alumni o PAS, seguramente no existan asignaturas asociadas.
EJEMPLO DE JSON:
Ejemplo de JSON de respuesta para un alumno (Ver: JSONrespuestaparaalumno.json)
VALIDADOR DE JSON:
La respuesta a la consulta de datos de usuario es un objeto con estructura JSON. A
continuación, adjuntamos un JSON Schema que puede utilizarse para comprobar la validez de
cualquier respuesta de datos de usuario.
JSON datos
esquema.txt
Esta parte del JSON de respuesta corresponde con datos que son necesarios para identificar
al usuario en todos los servicios y son utilizado también, para poder personalizar contenidos de la
App.
Todos los campos pertenecientes a esta parte son de carácter obligatorio. No disponer de
alguno de estos datos de usuario podría suponer el incorrecto funcionamiento de los servicios de
AppCRUE.
A continuación, se listan y explican estos campos:
Email
Correo electrónico del usuario en la universidad. Se utiliza como identificador del usuario y
Descripción
para contacto en la resolución de algunas incidencias.
Etiqueta email Tipo Email
Longitud Máximo de 100 caracteres Obligatorio SI
Restricción Formato email Ejemplo isabel.morgan@alumnos.uned.es
Nombre
Descripción Nombre del usuario.
Etiqueta firstname Tipo String
Longitud Máximo de 50 caracteres Obligatorio SI
Restricción Ninguna Ejemplo Isabel
Apellidos
Apellidos del usuario. El campo puede tener un solo apellido, que es habitual en alumnos ex-
Descripción
tranjeros donde sólo se utiliza uno de los apellidos de los progenitores.
Etiqueta lastname Tipo String
Longitud Máximo de 100 caracteres Obligatorio SI
Restricción Ninguna Ejemplo Morgan
Avatar
El “avatar” es la fotografía del usuario que se muestra en la App. La imagen debe retornarse en
formato JPG y a su vez codificada en Base64 (texto).
Descripción
La fotografía debe ser lo más actual posible y hay que evitar el uso de iconos o imágenes gené-
ricas. Esto mejora la sensación de personalización de AppCRUE para el usuario final.
Etiqueta avatar Tipo String
Longitud Imagen menor de 300k Obligatorio SI
Restricción Base 64 Ejemplo -
Perfil
Perfil del usuario, que debe tener uno de los siguientes valores (ESTUDIANTE, PAS, PROFESOR,
ALUMNI, PREUNIVERSITARIO, EXTERNO). El perfil puede contener varios de estos valores sepa-
rados por comas, cuando se trate de un multiperfil.
NIA
Descripción Número de identificación académico unívoco del usuario en la universidad.
Etiqueta nia Tipo String
Longitud Máximo de 30 caracteres Obligatorio SI
Restricción Ninguna Ejemplo ES46276
Cuenta de usuario
Descripción Nombre de la cuenta de usuario en la universidad.
Etiqueta username Tipo String
Longitud Máximo de 100 caracteres Obligatorio SI
Restricción Ninguna Ejemplo isabel.morgan
6.3.2 Etiquetas.
Por tanto, las etiquetas permiten enviar comunicados a diversos niveles. Por ejemplo, a algo tan
amplio como un campus completo. O algo más concreto, como el grupo B de estudiantes de Filología
Inglesa.
La etiqueta de un usuario tiene el siguiente formato:
CODIGO::NOMBRE
El sistema de etiquetas es muy flexible y permite llegar hasta el nivel de segmentación deseado
de cada universidad. A continuación, vemos un ejemplo de etiquetas para un usuario con un doble
grado en la UNED, llegando hasta el nivel de grupo:
✓ C100885::Campus 1 UNED
✓ D100047::Doble Grado en Dirección de Empresas y Marketing
✓ S100885::Estadística empresarial y financiera
✓ S100886::Microeconomía
✓ S100887::Macroeconomía
✓ S100888::Optimización Matemática
✓ G100885::Grupo 1 Mañana Estadística empresarial y financiera
✓ G100886::Grupo 2 Mañana Microeconomía
✓ G100887::Grupo 3 Tarde Macroeconomía
Las etiquetas se agrupan dentro de una estructura JSON . Todas las etiquetas están definidas
dentro de una propiedad (que pueden tener cualquier nombre), las propiedades están definidas
dentro del nodo “segments”. Ejemplo de JSON:
"segments": {
"degrees": [
"217::Graduado en Medicina"
],
"campus": [
"12::Campus de Miguel Delibes"
],
"subjects": [
"564A156::Derecho Romano I"
],
"groups": [
"011208V2C::Farmacología Grupo C (Tardes)"
]
"deportes": [
"psc::Piscina",
“01233::Futbol”,
“ten::Tenis”
],
La estructura de grupo de etiquetas es abierta y extensible. Podemos añadir cualquier otro grupo
según las necesidades de cada universidad (deportes, asociaciones, grupos, etc.).
"segments": {
"degrees": [
"217M::Máster en Profesor de Educación Secundaria Obligatoria"
],
"deportes": [
"D3482::Curso de Gimnasia para la espalda"
],
"asociaciones": [
"ASOC28::Asociación de Radioaficionados Universitarios",
"ASOC12::Asociación Cultural Universitaria"
],
"otros": [
"473793-X::Sindicato de estudiantes"
]
}
Para facilitar una mayor y mejor segmentación de los servicios de comunicaciones, también se
recomienda que los datos de usuario incluyan todas las etiquetas posibles. Es decir, todos los
elementos académicos relacionados con el usuario: asignaturas y planes de estudio que cursa,
grupos en los que se encuentra, facultades y campus con los que está relacionado, etc.
A continuación, mostramos una captura de ejemplo para el envío de un mensaje push al canal
[C100885::Campus 1 UNED]. Este mensaje push llegará a todos los usuarios con AppCRUE instalada
y suscritos a dicho canal.
Las etiquetas también pueden agruparse, para administrarlas fácilmente dentro de los gestores.
Puede utilizarse cualquier sistema de nombrado para la agrupación, pero recomendamos incluir los
siguientes grupos académicos:
✓ campus: Grupo de etiquetas con los campus con los cuales tiene relación el usuario.
Figura: Ejemplo de cómo usar la etiqueta y el grupo de etiqueta con Twin Push.
{
"subjects": [
{
"import_code": "A45942",
"name": "OPERACIONES BÁSICAS DE LABORATORIO II",
"url": "https://universidad.es/asignaturas/45942.html",
"group": "GRUPO 1 OPERACIONES BÁSICAS DE LABORATORIO II"
},
{
"import_code": "A45952",
"name": "QUÍMICA EXPERIMENTAL II",
"url": "https://universidad.es/asignaturas/45952.html",
"group": "GRUPO 2 QUÍMICA EXPERIMENTAL II"
}
],
"subjects_teacher": [
{
"import_code": "A45942",
"name": "OPERACIONES BÁSICAS DE LABORATORIO II",
En la estructura JSON de asignaturas hay que tener en cuenta las siguientes consideraciones:
✓ Las asignaturas deben separarse en dos arrays distintos y obligatorios: asignaturas que son
impartidas por un profesor (subjects_teacher), o bien asignaturas en las que actualmente
está matriculado un alumno (subjects). Sino es necesario indicar asignaturas de un rol, por
ejemplo subjects_teacher, por tratarse de un estudiantes, esté se enviará vacío.
✓ Ordenar las asignaturas por tipo y por código. Es recomendable que los tipos de asignatura
tengan siempre el mismo orden: subjects, subjects_teacher. Y que, dentro de cada tipo, las
asignaturas estén ordenadas alfabéticamente por código (import_code). Esto permite
optimizar el tratamiento de las asignaturas.
El import_code ha de ser único.
✓ Los textos, direcciones URL y metadatos en general se retornarán siempre en el idioma
solicitado por el usuario (parámetro idioma de la solicitud). Por ejemplo, podemos utilizar
URL distintas para el castellano y para el inglés, si la universidad dispone de ellas. En el caso
de tratarse de la primera vez que se integra el usuario, al no tener un idioma seleccionado,
se invocarán en el idioma que tenga por defecto la universidad.
Las Urls indicadas, han de ser de tipo https, en caso contrario no se mostrarán en la app. Si
se indica este campo, en la app se podrá pulsar sobre la asignatura indicada y este abrirá la
Url definida.
✓ Se puede incluir opcionalmente el nombre del grupo asociado con la asignatura.
6.4 vTUI
Actualmente, se integra la TUI virtual con la empresa colaboradora Datio Software. Se adjunta
documento de integración de Datio v1.2 con las especificaciones de integración:
Este servicio nativo se ofrece para mostrar el expediente académico del alumno, o bien sólo las notas
del año en curso.
Si se desea incorporar el expediente completo serán necesario exponer dos servicios: consulta de
expediente y consulta de notas por año.
Si se desea sólo incorporar las notas del año académico en curso, con el servicio de consulta de notas
por año sería suficiente.
A continuación, se detallan.
En el caso de que para la asignatura sea “NO PRESENTADO” el campo nota tiene que ser null
invalidando el resto de los campos a la hora de presentarlo.
En el caso de que para la asignatura sea “APROBADO” el campo nota tiene que tener notación
numérica y el campo info especificado en el JSON: true.
En el caso de que para la asignatura sea “SUSPENSO” el campo nota tiene que tener notación
numérica y el campo info especificado en el JSON: false.
El resto de los campos son de texto variable, pudiendo configurarlo la propia universidad (para
calificación se recomienda abreviaturas de SUSPENSO (SP), APROBADO (AP), NOTABLE (NT),
SOBRESALIENTE (SB), MATRICULA DE HONOR (MH).
NOTA: Los años académicos, las titulaciones y las notas se mostrarán en el orden que se
reciben del servicio de la universidad.
El servicio nativo de Mis exámenes muestra los exámenes que tiene el estudiante. El funcionamiento
sería como el que se detalla a continuación.
{
"alumnoExamen": [
{
"CURSO_ACADEMICO": "2017-18", /*String type */
"COD_PLAN": "2036", /*String type */
"PLAN": "GRADO EN FISIOTERAPIA (ALCORCON)", /*String type */
"COD_ASIGNATURA": "2036024", /*String type */
"ASIGNATURA": "FISIOTERAPIA EN ESPECIALIDADES CLINICAS: NEUROLOGICA, CARDIO-
RRESPIRATORIA Y VASCULAR", /*String type */
"CUATRIMESTRE": "Segundo semestre", /*String type */
"CURSO": "4", /*String type */
"COD_GRUPO": "4AT", /*String type */
"DESC_TURNO": "TURNO DE TARDE", /*String type */
"CAMPUS": "ALCORCÓN", /*String type */
"CONVOCATORIA": "S", /*String type */
"TIPO_EXAMEN": "Teórico", /*String type */
"FECHA": "21-09-2017", /*String type */
"HORA": "16:00-19:00", /*String type */
"AULAS": "107 Aulario II", /*String type */
"OBSERVACIONES": null /*String type */
},
{
"CURSO_ACADEMICO": "2017-18", /*String type */
"COD_PLAN": "2036", /*String type */
"PLAN": "GRADO EN FISIOTERAPIA (ALCORCON)", /*String type */
"COD_ASIGNATURA": "2036024", /*String type */
"ASIGNATURA": "FISIOTERAPIA EN ESPECIALIDADES TEORICAS", /*String type */
"CUATRIMESTRE": "Segundo semestre", /*String type */
"CURSO": "4", /*String type */
"COD_GRUPO": "4AT", /*String type */
"DESC_TURNO": "TURNO DE TARDE", /*String type */
"CAMPUS": "ALCORCÓN", /*String type */
"CONVOCATORIA": "S", /*String type */
"TIPO_EXAMEN": "Teórico", /*String type */
"FECHA": "24-01-2018", /*String type */
"HORA": "16:00-19:00", /*String type */
"AULAS": "107 Aulario II", /*String type */
"OBSERVACIONES": null /*String type */
}
]
}
Request: AppCrue envía el TOKEN del usuario, junto con el idioma y el día actual (formato
mm/dd/aaaa)
Param1 → token=A5HfVTE77eYaFLS4 /nSJ2Khw==
Param2 → lan=es
Param3 → fecha=01/30/2022
Response: Devolver mi horario en el formato JSON especificado a continuación (se mostrará en las
apps tal cual venga los valores para cada uno de los campos y en el orden devuelto). Se deberán
devolver las clases que el usuario tenga a partir del día actual (sin incluir clases de días anteriores).
Ejemplo:
{
"day": "20220112",
"schedule": []
},
{
"day": "20220113",
"schedule": [
{
"starts": "19:00",
"ends": "21:00",
"location": " (0016P2004) L22 - AULA DE INFORMÁTICA",
"subjectname": "FUNDAMENTOS DE LAS BASES DE DATOS",
"degreename": "GRADO EN INGENIERÍA INFORMÁTICA",
"groupname":"GRUPO 4 (PRÁCTICAS DE LABORATORIO)"
},
{
"starts": "15:00",
"ends": "16:00",
"location": " (0016P2004) L22 - AULA DE INFORMÁTICA",
"subjectname": "ASIGNATURA DE EJEMPLO",
"degreename": "GRADO EN INGENIERÍA INFORMÁTICA",
"groupname":"GRUPO 4 (PRÁCTICAS DE LABORATORIO)"
}
]
Esta funcionalidad es para disponer que los usuarios con rol PROFESOR puedan enviar
notificaciones a sus alumnos, para ello es necesario que la universidad que lo desee exponga un
servicio REST informando de las etiquetas que un profesor puede enviar estas notificaciones.
Funcionalidad destinada a las universidades con sistemas de etiquetas en el login, y se activará
bajo demanda.
Url:
https://<base_url>/notification_targets
Devuelve:
Notification_targets:
{
"notification_targets": {
"subjects": ["S100885::Estadística", "S100886::Microeconomía", "S100887::Ma-
croEconomía", "S100888::Optimización Matemática"],
"degrees": ["D100885::Doble Grado en Dirección de Empresas y Marketing"],
"groups": ["G100885::Grupo 1 Mañana Estadística Empresarial y Financiera"],
"campus": ["C100885::Campus 1"]
}
}
Códigos de respuesta:
Código Descripción
11 DIRECTORIO
En el listado de resultados de búsqueda se mostrará el nombre del contacto y su rol, teniendo que
pulsar el usuario sobre el contacto para acceder al detalle de la información.
Los detalles de correo electrónico y teléfono del contacto permitirán la apertura automática de las
aplicaciones gestor de correo y teléfono.
La información sobre el directorio se obtendrá mediante una petición POST recogiendo los datos en
formato JSON.
A continuación, se incluye el formato necesario JSON del servicio REST que debe de tener la
Universidad que devolverá la información necesaria.
Url:
https://<base_url>/directory_search
Devuelve:
contacts Array X Lista de contactos que coinciden con los parámetros de bús-
queda. Array de objetos de tipo Contact.
emails Array Lista de correos electrónicos que no estén asociados en las filia-
ciones. Array de objetos de tipo cadena. Por ejemplo: ["pa-
fli@uni.es", "pafli@gmail.com"]
phones Array Lista de teléfonos que no estén asociados en las filiaciones. Array
de objetos de tipo cadena. Por ejemplo: ["3425", "678123456"]
filiations Array Lista de filiaciones del contacto. Array de objetos de tipo Filia-
tion.
Esta funcionalidad es para disponer que los usuarios con puedan tener un calendario unificado en
la aplicación. Actualmente en el calendario se muestran los eventos de la universidad. Con este
servicio, se fusionará el calendario personal del usuario logado que disponga en la universidad con
el calendario de eventos. Y así de un vistazo poder ver lo que tiene en un día, los eventos de la
universidad y lo que tenga programado para ese día (Horario, exámenes, tutorías...).
Url:
https://<base_url>/user_calendar
No (si no se especifica se
Posibles valores “EXAMEN”, “HORARIO”, “REVI-
category String devuelve todos los eventos
SION_DE_EXAMEN”, “TUTORIA”
para ese usuario)
Devuelve:
events Array of SI Lista de eventos para ese día para ese usuario de
Strings tipo Event.
Event:
Ejemplo:
{
"calendar": [
{ // day item
"date": "2020-04-21"
"events": [
{ // event item
"id": 1033992237,
"title": "Tutoria",
"description": "Tutoria asignatura Matemáticas",
"url": "http://universidad.es/tuperfil/tutorias",
"nameAuthor": "Autor",
"imgDetail": "http://test.host/uploads/event/logo/1033992237/example.png",
"type": "TUTORIA",
“startsAt”: “1575990139”,
"nameAuthor": "Autor",
"imgDetail": "http://test.host/uploads/event/logo/1033992237/example.png",
"type": "HORARIO",
“startsAt”: “1575990139”,
“endsAt”: “1575990139”
}
]
},
{ // day item
"date": "2020-04-22"
"events": [
{ "id": 1033945237,
"title": "Tutoria",
"description": "Tutoria asignatura Matemáticas”,
"url": "http://universidad.es/tuperfil/tutorias",
"nameAuthor": "Autor",
"imgDetail": "http://test.host/uploads/event/logo/1033992237/example.png",
"type": "TUTORIA,
“startsAt”: “157593453”,
“endsAt”: “157593453”,
},
{ // event item
"id": 1033992449,
"title": "Clase",
"description": "Clase asignatura Inglés",
"url": "http://universidad.es/tuperfil/tutorias",
"nameAuthor": "Autor",
"imgDetail": "http://test.host/uploads/event/logo/1033992237/example.png",
"type": "HORARIO,
“startsAt”: “157593453”,
“endsAt”: “157593453”,
}
]
}
]
}
El endpoint de destino se configura se incluye en la configuración del widget. La URL debe ser https
y la invocación se realiza por POST.
Se pueden enviar respuestas personalizadas que se mostrarán en la pantalla del móvil una vez el
usuario realice la lectura del código QR. Los mensajes se podrán personalizar para los códigos de
La plataforma vTUI tiene algunos módulos adicionales (plugins o addons) que pueden activarse
para proporcionar la siguiente funcionalidad:
• Emulación NFC/HCE: Módulo que permite emular una TUI mediante NFC y que almacena los datos
de la tarjeta en el sistema HCE.
VTUI - AppCRUE -
Compatibilidad NFC-HCE.docx
VTUI - AppCRUE -
Servicio de códigos dinámicos v1.2.docx
• Activación de servicios con código QR: Permite escanear un QR de la universidad y activar un ser-
vicio JSON con la información del QR escaneado y del usuario que lo hizo.
VTUI - AppCRUE -
Activación de servicios con QR para universidades v1.0.docx
• Activación de servicios con lectores Elatec mediante BLE: Este módulo es capaz de comunicarse
de forma segura con un lector Elatec por BLE, usando un protocolo propietario de Elatec. La comu-
nicación consiste en el envío de un dato identificativo del titular de la vTUI. Y se usa para que el
lector Elatec pueda activar máquinas multifuncionales de impresión.
Testers AppCrue -
Manual.docx
Se permite integrar los contenidos propios de la Universidad a través de los siguientes modelos.
AppCrue permite poder abrir cualquier aplicación nativa tanto propia de la universidad como de
terceros y para ambas plataformas: IOS y Android.
Para el caso de Android solo será necesario indicar el paquete de la App. En el caso de IOS será
necesario indicar tanto el esquema como el paquete de la app.
Ambas plataformas tienen el mismo funcionamiento. En caso de no tener la app instalada en el
dispositivo móvil, se abre la página del store. En el caso de estar ya instalada en el dispositivo, abre
la aplicación correspondiente a ese paquete.
También se puede añadir el paso de parámetros, los valores contemplados son:
• Token de Appcrue
• Token de la universidad
• Import code
16.2 Webview
Se puede incluir en la app cualquier contenido https haciendo uso de los siguientes métodos.
Mantiene las cookies de las navegaciones anteriores del usuario por los webviews de la app. Se
borrarán las cookies al hacer logout o al volver a hacer login tras expirar el token de la sesión.
Haciendo uso del esquema de autenticación HTTP que involucra tokens de seguridad llamados
bearer tokens. Este token es el generado por la universidad. En el destino es donde se debe
identificar al usuario a partir del token. Los parámetros de identificación se deben añadir en la
URL.
El valor de parámetro contemplados es:
Comportamiento iOS:
Los webviews que sean por bearer se inician siempre sobre un webview limpio de cookies. La
gestión de la navegación entre páginas web con el token, así como de las cookies que necesiten los
enlaces o redirecciones entre éstas, recaen en el desarrollo web, por tanto, la app no mantendrá
estados ni sesiones que no hayan sido gestionadas por la propia web. Se recomienda, por tanto, el
uso del método bearer exclusivamente a páginas que autentiquen mediante bearer token en el
header de la petición y no dependan de cookies para evitar que el usuario esté continuamente
introduciendo sus credenciales.
Comportamiento Android:
Mantiene las cookies de las navegaciones anteriores del usuario por los webviews de la app. Se
borrarán las cookies al hacer logout o al volver a hacer login tras expirar el token de la sesión.
Para los tres métodos el uso de los parámetros se debe hacer de la siguiente forma:
nombreParametro=<valorParametro>
Además de la integración por Webview se puede incluir la apertura de una URL en navegador
externo. En este caso la app no gestionará cookies.
Permite incluir en la cabecera el parámetro del token de la aplicación.
Esta funcionalidad sólo se debe de usar en caso de que el webview no soporte algo de la página web
destino. Ya que es menos deseable, porque te provoca sacarte de la aplicación y no fomenta su uso
17 APIS EXTERNAS
Se dispone de APIs externas para gestionar las noticias, eventos, retos y promociones de la
aplicación, y poder automatizarlo desde las universidades. Está documentado en el APIDOC en
las urls que se muestran a continuación:
URL_prod: https://appuniversitaria.universia.net/apidocs/ext-3.2.html
URL_pre: https://pre.appuniversitaria.idsant.com/apidocs/ext-3.2.html
User: appcrue_ext
Pass: ujg754tj9$
Para poder hacer pruebas de llamada a la API de forma ágil se recomienda utilizar Postman o
SoapUI.
Los mensajes push se podrán enviar a usuarios individuales, a toda la universidad o a grupos
segmentados de usuarios.
La segmentación se puede hacer por una propiedad o por un segmento.
a) Propiedad
Las propiedades son pueden ser las siguientes:
-Las etiquetas que describen al usuario enviadas en el servicio de datos de usuario
(asignaturas, facultades, etiquetas personalizadas…)
-Roles de usuario: información que se envía en el servicio de datos de usuario.
-Alias del usuario (“user_name” enviado en el servicio de datos de usuario)
Las propiedades que provienen de etiquetas enviadas por la universidad estarán
disponibles a partir del momento en el que un usuario con esa etiqueta logue en la app.
Si no hay ningún usuario logado con una determinada propiedad/etiqueta, esta no estará
disponible ni en la plataforma de notificaciones ni en el Gestor de contenidos y si se
intenta hacer uso de ella vía API dará error de envío.
Una vez creado el segmento se mostrará el número de usuarios que cumplen con las
especificaciones del segmento:
Además de la creación de segmentos por las propiedades ya descritas, también se pueden crear
Como se mencionaba antes se puede realizar la segmentación por una propiedad o un segmento.
La segmentación por propiedad permite un valor de esta o una cadena de valores. La cadena de
valores no discrimina por el cumplimiento de todos los valores, sino que suma los destinatarios que
cumplan cada valor individualmente.
En el siguiente ejemplo se segmenta por la propiedad “subjects” y la cadena de valores Historia de
la filosofía y matemáticas.
POST / https://appcrue.twinpush.com/api/v2/apps/:application_id/notifications
{
"broadcast": false,
"devices_ids": [],
"devices_aliases": [],
"segments": [],
"target_property": {
"name": "subjects",
"values": ["29001-362::(2019-20) HISTORIA DE LA FILOSOFÍA","23301-400::(2019-20) MATEMÁTICAS
” ]
},
POST / https://appcrue.twinpush.com/api/v2/apps/:application_id/notifications
{
"broadcast": false,
"devices_ids": [],
"devices_aliases": [user1@universia.es, user2@universia.es, user3@universia.es],
"segments": [],
"target_property": {
"name": "subjects",
"values": []
},
La segmentación por segmentos permite el uso de una cadena de estos, incluyendo como destinatari
os a todos aquellos usuarios que cumplen por lo menos uno de los segmentos:
POST / https://appcrue.twinpush.com/api/v2/apps/:application_id/notifications
{
"broadcast": false,
"devices_ids": [],
"devices_aliases": [],
"segments": [“Target Estudiantes Arquitectura Campus Madrid”, “Target profesores”],
"target_property": {
"name": "",
"values": []
},
A continuación, se muestra cómo se tiene que hacer la llamada al API de TwinPush de una
notificación push
Application. Identifica-
:app_id dor único de la universi-
dad
Método POST
Content-
application/json
Type
Petición
“True” para enviar a todos los disposi-
broadcast Booleano
tivos registrados en la app.
Paráme-
tros del
title Dato necesario Texto
conte-
nido
402 No autorizado
POST / https://appcrue.twinpush.com/api/v2/apps/:application_id/notifications
{
"broadcast": true,
"title": "Este espacio para el título",
"alert": "Este espacio para el cuerpo del mensaje. Te lleva a google.prueba",
"url": "https://www.google.es/"
}
Respuesta:
200
{
"id": 912388313
}
Ejemplo con envío a dos segmentos. En este caso se enviará la notificación a todos los usuarios que
cumplan al menos uno de los segmentos.
POST / https://appcrue.twinpush.com/api/v2/apps/:application_id/notifications
{
"broadcast": false,
"devices_ids": [],
"devices_aliases": [],
"segments": ["LOGIN TRUE", "ESTUDIANTE"],
"target_property": {
"name": "",
"values": []
},
"title": "Push API TwinPush dos segmentos",
"alert": "Push via API LOGIN TRUE + ESTUDIANTE",
"url": ""
}
https://appcrue.twinpush.com/api/v2/apps/:application_id/notifications//${notif_id}/report
URL destino Id de la notificación. En la respuesta del servicio de crea-
:notif_id
ción de notificación se muestra este id.
Método GET
Content-
application/json
Petición Type
GET / https://appcrue.twinpush.com/api/v2/apps/:application_id/notifications//${notif_id}/report
{
"notification": {
"id": "bb1b31f5f206e7ca",
"sound": null,
"alert": "This is the message displayed in Notifications Center",
"title": "Welcome to TwinPush",
"badge": "+1",
"custom_properties": {},
"tp_rich_url": null,
"delivery_speed": "normal",
"name": null,
"group_name": null,
"protected_content": false,
"send_since": "2020-02-05 11:59:05 UTC",
"type": "Notification"
},
"status": "sent",
"delivery_count": 12,
"opening_count": 0,
"errors": [
{
"level": "error",
"platform": "ios",
"key": "send-error",
"message": "BadDeviceToken",
"created_at": "2020-02-05 11:59:06 UTC"
},
{
"level": "error",
"platform": "ios",
"key": "send-error",
"message": "BadDeviceToken",
"created_at": "2020-02-05 11:59:06 UTC"
},
{
https://appcrue.twinpush.com/api/v2/apps/:application_id /devices/${device_id}/notifica-
tions/${notification_id}
:app_id
Application. Identifivador único de la universidad
: application_id
URL destino
:device_id Identificador único del dispositivo
OK 200
Respuesta
NOK 404 No se encuentra la notificación
Recurso Descripción
A continuación, se muestra cómo se tiene que hacer la llamada al API externa de creación de una
noticia.
https://pre.appuniversitaria.idsant.com/api/external/v3_2/newses
URL destino
https://appuniversitaria.universia.net/api/external/v3_2/newses
Método POST
Tipo
application/json
MIME
0 para noticias, 1
news[section] Sección de la app donde aparecerá. actualidad, 2 am-
bas secciones.
news[highlighted_el
ement_attributes][s Fecha comienzo destacado String
tarts_at]
ews[highlighted_ele
ment_attributes][e Fecha fin destacado String
nds_at]
Tipo
application/json
MIME
Este es un ejemplo de envío de JSON con el formato correspondiente (en este caso se tienen que
proporcionar las credenciales de token e importcode emisor para cada universidad), devolviendo el
valor de ID unívoco de la noticia, necesario para poder borrar/actualizarla a posteriori.
POST /api/external/v3_2/newses
{
"news": {
"starts_at": "2020-02-06",
"category": "image",
"section": "2",
"title_es": "Noticia creada por API tag univertity.PRUEBA3.CON ROL ESTUDIANTE",
"title_en": "Some title in en",
"body": "Noticia creada por API",
"foto_url": "https://img.blogs.es/anexom/wp-content/uploads/2018/12/42707058715_61bbdc578f_k.jpg
",
"target_segments": ["degrees::DG01S::GRADO EN CIENCIAS DE LA ACTIVIDAD FÍSICA Y DEL DEPORTE (PLA
N 2015)"
],
"target_roles": [ "ESTUDIANTE" ]
},
"import_code": " univadmin_code_001",
"token": " univadmin_code_001"
}
Respuesta:
200
{
"id": 912388313
}
NOTA: En la descripción de la noticia hace reconocimiento de etiquetas html para darle un diseño
exclusivo. Las etiquetas que aceptamos son: p ul li div span strong b em cite dfn i big small font tt a
u del s strike sup sub h1 h2 h3 h4 h5 h6 br
Para el borrado de la noticia vía API, es necesario recuperar el id que se devuelve al dar de alta la
noticia y a continuación realizar la llamada al servicio de borrado “/api/external/v1/newses” con
método DELETE indicando:
- id: id de la noticia devuelto al dar de alta la noticia.
- import_code: asociado al usuario que va a borrar la noticia.
- token: token de autorización del usuario que va a borrar la noticia.
https://pre.appuniversitaria.idsant.com/api/external/v1/newses
URL destino
Método DELETE
Paráme-
Petición id News id
tro
OK 200
Respuesta
NOK 404 No se encuentra la noticia
https://pre.appuniversitaria.idsant.com/api/external/v3_2/newses/{news_id}
URL destino
https://appuniversitaria.universia.net/api/external/v3_2/newses/{news_id}
Método PATCH
Petición Tipo
application/json
MIME
0 para noticias, 1
news[section] Sección de la app donde aparecerá. actualidad, 2 am-
bas secciones.
ESTUDIANTE,
PROFESOR, PAS,
news[target_roles] Filtrado de rol para la noticia ALUMNI, PRE-
UNIVERSITARIO,
EXTERNO, TODOS.
news[target_segme
Etiquetas académicas. String
nts]
news[highlighted_el
ement_attributes][s Fecha comienzo destacado String
tarts_at]
ews[highlighted_ele
ment_attributes][e Fecha fin destacado String
nds_at]
Tipo
application/json
Respuesta MIME
PUT /api/external/v3_2/newses/news_id
{
"news": {
"starts_at": "2019-12-17",
"category": "text",
"section": "0",
"title_es": "Titulo en es",
"title_en": "Some title in en",
"description": "Descripcion en es",
"target_segments": [
"tag1",
"tag2"
],
"target_roles": [
"TODOS"
]
},
"import_code": "univadmin_code_001",
"token": "token_univadmin_001"
}
Respuesta:
200
{
Updated
Recurso Descripción
A continuación, se muestra cómo se tiene que hacer la llamada al API externa de creación de un
evento.
Los eventos sólo aceptan la codificación UTF-8.
https://pre.appuniversitaria.idsant.com/api/external/v3_3/events
URL destino
https://appuniversitaria.universia.net/api/external/v3_3/events
Método POST
Tipo
application/json
MIME
event[attached_file
]
event[target_segme
Etiquetas académicas. String
nts]
Tipo
application/json
Respuesta MIME
OK 200 Id
Este es un ejemplo de envío de JSON con el formato correspondiente (en este caso se tienen que
proporcionar las credenciales de token e importcode emisor para cada universidad), devolviendo el
valor de ID unívoco deL evento, necesario para poder borrar/actualizarla a posteriori.
POST /api/external/v3_3/events
"event": {
"starts_at": "2020-01-01",
"ends_at": "2020-06-01",
"title_es": "Título del evento via API",
"title_en": "Event title via API",
"description": "Description via API",
"logo": "https://img.blogs.es/img.jpg",
"event_category": "Festivo",
"target_segments": [
"University::UCJCNEW"
],
"target_roles": [
"TODOS"
]
},
"import_code": "univadmin_code_001",
"token": "token_univadmin_001"
}
Respuesta
200
Para el borrado del evento vía API, es necesario recuperar el id que se devuelve al dar de alta el
evento y realizar la llamada al siguiente servicio “/api/external/v1/events/{event_id}” con método
DELETE indicando:
https://pre.appuniversitaria.idsant.com/api/external/v1/events/{event_id}
URL destino
https://appuniversitaria.universia.net/api/external/v1/events/{event_id}
Método DELETE
OK 200
Respuesta
NOK 404 No se encuentra la notificación
Recurso Descripción
A continuación, se muestra cómo se tiene que hacer la llamada al API externa de creación de una
promoción.
https://pre.appuniversitaria.idsant.com/api/external/v3/promotions
URL destino
https://appuniversitaria.universia.net/api/external/v3/ promotions
Método POST
Tipo
application/json
MIME
promotion
[foto_url]
Promotion[discount
Descuento de la promoción Numérico
]
promotion[price_be
Precio antes de la promoción Numérico
fore]
promotion[price_af
Precio después de la promoción Numérico
ter]
promotion
Etiquetas académicas. String
[target_segments]
Tipo
application/json
Respuesta MIME
OK 200 Id
Este es un ejemplo de envío de JSON con el formato correspondiente (en este caso se tienen que
proporcionar las credenciales de token e import_code emisor para cada universidad), devolviendo
el valor de ID unívoco de la promoción, necesario para poder borrar/actualizarla a posteriori.
POST /external/v3/promotions
body:
{
"promotion": {
"starts_at": "2020-05-27",
"ends_at": "2021-05-20",
"url": "https://google.com",
"discount": "20",
"price_before": "50",
"price_after": "20",
"title_es": "Promoción por API tag regresiva 27/03/2020",
"title_en": "Promotion title in en for API",
"description": "Descripcion de Promoción en es",
"foto_url": "https://www.cleverfiles.com/howto/wp-content/2018/03/minion.jpg",
"target_segments": [
],
"target_roles": [
"ESTUDIANTE"
]
},
"import_code": "unizar_import_code",
"token": "unizar_token"
}
RESPONSE:
{
"id": 623
}
Para el borrado de una promoción vía API, es necesario recuperar el id que se devuelve al dar de alta
la promoción y realizar la llamada al siguiente servicio
“/api/external/v2/promotions/{promotion_id}” con método DELETE indicando:
https://pre.appuniversitaria.idsant.com/api/external/v2/promotions/{promotion_id}
URL destino
https://appuniversitaria.universia.net/api/external/ v2/promotions/{promotion_id}
Método DELETE
OK 200
Respuesta
NOK 404 No se encuentra la promoción
18 RECOMENDACIONES
Las notificaciones push son una herramienta muy útil de comunicación de la universidad. Deben de
ser mensajes concretos y cortos que inciten a entrar en la aplicación para ver el contenido que se
quiere.
Cuando se automatice el envío de notificaciones push a través del API o bien si se envían
individualmente a través del gestor, se exponen las recomendaciones para su correcto uso.
Recomendaciones:
Título: No exceder de 45 caracteres, procurando que sea algo concreto y que llame la atención, ya
que será lo que primero que se vea en el dispositivo móvil. Si es más largo no se verá
adecuadamente.
Mensaje: El mensaje debe de ser entre 150 a 350 caracteres (contando los espacios).
Recomendable un máximo de 2 párrafos de texto. Si se desea completar con más texto se puede
crear una noticia para exponer todo el contenido que se desea.
18.2 Noticias
Las noticias también tienen que ser ajustadas para leerse en un dispositivo móvil, no deben de
considerarse como noticias en una web.
Recomendaciones:
Título: No exceder de 75 caracteres para que se vea adecuadamente.
Contenido: El contenido debe de ser entre 300 y 400 caracteres para que no sea demasiado largo y
no haya que hacer mucho scroll en un móvil.
PREPRODUCCION: https://pre.appuniversitaria.idsant.com
PRODUCCION: https://appuniversitaria.universia.net
Las credenciales de acceso para cada entorno se proporcionan según se vaya avanzando en las fases
de lanzamiento.
Este apartado del documento va dirigido a aquellas universidades que actualmente trabajan con el
Servicio de Datos de usuario y el Servicio de Estructura y van a migrar al nuevo Servicio de datos de
usuario con etiquetas.
Con el nuevo servicio de datos de usuario con etiquetas se asociarán directamente los niveles
académicos a los usuarios, evitando el cruce de dos fuentes de información y permitiendo también
la actualización automática de la información de grupos de segmentación.
• Si la universidad utiliza el API externo se tendrá que actualizar también a la nueva versión de
este. Para noticias y eventos versión 3.1 del API de Appcrue y para notificaciones, el API de
Twinpush. (Véase pg. 38 del documento). En el caso de la universidad lo solicite facilitaremos
un paquete Postman con llamadas de ejemplo al API.
• En el caso de que la Oferta Académica use como fuente la Estructura Académica. Se deberá
optar por una de las 3 opciones detallas en este documento. (Véase pg. 10).
20.2 Certificación
El contenido que se publique desde el gestor v7 únicamente será visible en la app v7 y en el gestor
v7.
20.3 Publicación
En el momento de la publicación los usuarios del gestor de contenidos que utilizase la universidad
antes de la migración pasarán a funcionar para la v7 (no es necesario crear nuevos usuarios)