Otaingenio LTI & Security Kit
4 pasos universales para conectar Moodle con herramientas externas + blindaje de contenido al client-side.
La arquitectura en un vistazo
LTI 1.3 se basa en OAuth2 + OpenID Connect. La confianza se construye emparejando 4 bloques de datos entre ambos lados.
Los 4 pasos universales
Registro en la herramienta (OIDC & Redirection)
Ve a Administración > Plugins > Herramientas externas > Gestionar herramientas y selecciona «Configurar herramienta manualmente». Moodle te pedirá las URLs del proveedor externo. Introduce:
Intercambio de parámetros de plataforma
Una vez guardado el paso anterior, Moodle genera automáticamente 3 datos únicos y dinámicos. Cópialos y pégalos en el panel de configuración de tu herramienta externa (Vercel, SCORM Cloud, etc.):
Configuración de la clave pública de la herramienta
LTI 1.3 elimina las contraseñas compartidas de LTI 1.1. Funciona con firmas de clave pública/privada (RSA), lo que hace imposible la suplantación de mensajes entre plataforma y herramienta.
En la configuración de Moodle, selecciona el tipo de clave como «URL del conjunto de claves (Keyset URL)» y pega la URL de claves públicas que te proporciona tu proveedor externo. Esto permite que Moodle verifique que los datos que le devuelve la herramienta no han sido manipulados en tránsito.
Activación del enlace y mapeo de roles
Crea el enlace de la herramienta dentro del curso de Moodle. En la configuración avanzada de privacidad, activa:
<script> document.addEventListener("DOMContentLoaded", function() { function evaluarSeguridad() { // 1. Buscar texto de administración (independiente del tema visual) let tieneMenuAdmin = false; document.querySelectorAll('a, span, button, p').forEach(el => { let txt = el.innerText.toLowerCase(); if (txt.includes('administración del sitio') || txt.includes('site administration')) { tieneMenuAdmin = true; } }); // 2. Comprobaciones técnicas por selectores y variables de Moodle let isManager = tieneMenuAdmin || document.querySelector('[data-key="siteadmin"]') || document.querySelector('.editmode-switch') || document.querySelector('#editmode-switch') || document.querySelector('a[href*="/admin/"]') || (window.M && window.M.cfg && window.M.cfg.userid === 2); // Si eres Manager/Admin, el script se detiene aquí if (isManager) { console.log("Otaingenio: Rol de gestión detectado. Protecciones desactivadas."); return; } // 3. Si es estudiante, se ejecutan los bloqueos document.addEventListener('contextmenu', event => event.preventDefault()); let antiSelectStyle = document.createElement('style'); antiSelectStyle.innerHTML = 'body, html, iframe, p, div, span { -webkit-user-select: none !important; -moz-user-select: none !important; -ms-user-select: none !important; user-select: none !important; }'; document.head.appendChild(antiSelectStyle); document.onkeydown = function(e) { if (e.keyCode == 123) { return false; } // F12 if (e.ctrlKey && e.shiftKey && e.keyCode == 'I'.charCodeAt(0)) { return false; } // DevTools if (e.ctrlKey && e.shiftKey && e.keyCode == 'C'.charCodeAt(0)) { return false; } // Inspect if (e.ctrlKey && e.shiftKey && e.keyCode == 'J'.charCodeAt(0)) { return false; } // Console if (e.ctrlKey && e.keyCode == 'U'.charCodeAt(0)) { return false; } // Código fuente if (e.ctrlKey && e.keyCode == 'C'.charCodeAt(0)) { return false; } // Copiar }; } // Margen de 1,5s para que Moodle pinte los menús asincrónicos de Admin setTimeout(evaluarSeguridad, 1500); }); </script>