Es un mecanismo bien diseñado de Single Sign-On (SSO) o autenticación basada en tokens temporales. Aunque el código fuente exacto de la plataforma Odoo.sh es propietario, el comportamiento se basa en prácticas estándar que se pueden deducir y que son comunes en la gestión de instancias en la nube.
El flujo aproximado es el siguiente:
-
Generación del Token: Cuando haces clic en el botón "Connect" en el panel de control de Odoo.sh, el servidor de Odoo.sh (que tiene control total sobre el contenedor donde corre tu instancia) genera una URL especial.
-
Inyección o Acceso a la Base de Datos: Odoo.sh tiene acceso al sistema de archivos y a la base de datos de tu contenedor. El sistema puede establecer una sesión válida directamente en el almacenamiento de sesiones de Odoo (Redis o sistema de archivos) o utilizar un módulo preinstalado que acepta un token temporal.
-
Redirección: Tu navegador es redirigido a tu instancia con un parámetro en la URL (algo parecido a
?token=xyz...o una ruta específica de un controlador). -
Validación: La instancia de Odoo recibe la petición, valida el token contra lo que el sistema de Odoo.sh ha autorizado, crea una sesión de usuario para el administrador y te deja entrar sin pedir contraseña.
Sí, existen módulos comunitarios y técnicas que replican esta funcionalidad para facilitarte la vida si gestionas múltiples instancias (por ejemplo, en entornos de desarrollo local o servidores propios).
Aquí te presento las opciones más destacadas:
Aunque no es idéntico a Odoo.sh, el concepto es permitir el acceso rápido. En entornos de desarrollo, muchos desarrolladores usan módulos que permiten loguearse como admin seleccionando el usuario de una lista sin contraseña (si se configura así) o usando una "contraseña maestra".
Existe un patrón común en integraciones donde se permite la autenticación vía URL usando un UUID o token.
- Cómo funciona: Se crea un controlador que espera un parámetro
token. Si el token coincide con uno guardado en la configuración del sistema (o en el usuario), se crea la sesiónrequest.session.uid = user.id.
La Odoo Community Association (OCA) utiliza Runbot. Si te fijas, Runbot hace exactamente lo mismo: entras a una build y te logueas automáticamente (o hay botones para loguearse como admin o demo).
-
El mecanismo de Runbot: Runbot instala módulos específicos en las instancias que levanta. Estos módulos habilitan rutas especiales (controllers) que permiten el inicio de sesión automático.
- Puedes revisar el código de Runbot en el repositorio de la OCA para ver cómo gestionan los controladores de
Login.
- Puedes revisar el código de Runbot en el repositorio de la OCA para ver cómo gestionan los controladores de
Si quieres replicar esto para tus servidores, puedes crear un módulo muy simple.
Ejemplo conceptual de código (Python - Odoo Controller):
Python
from odoo import http
from odoo.http import request
class AutoLogin(http.Controller):
@http.route('/autologin', type='http', auth='public')
def auto_login(self, token=None, **kwargs):
# PELIGRO: Esto es solo un ejemplo. Nunca usar hardcode en producción.
# Debes validar el token contra algo seguro en la BD.
my_secret_token = request.env['ir.config_parameter'].sudo().get_param('my.secret.token')
if token and token == my_secret_token:
# Buscamos al usuario admin (ID 2 usualmente)
user = request.env.ref('base.user_admin')
# Forzamos el login
request.session.uid = user.id
request.session.login = user.login
request.session.session_token = user._compute_session_token(request.session.sid)
return request.redirect('/web')
return "Acceso Denegado"
Odoo.sh utiliza su posición de "superusuario" del servidor para orquestar la autenticación. No rompen la seguridad de Odoo, sino que utilizan Controladores (Controllers) y Sesiones HTTP para inyectar al usuario autenticado.
Advertencia de Seguridad: Si decides implementar algo así por tu cuenta (fuera de un entorno controlado como Odoo.sh o Runbot), ten muchísimo cuidado. Exponer una URL que permita acceso de administrador sin contraseña es un riesgo de seguridad crítico si el token es débil o interceptado.