Comprender la administración de sesiones y la autenticación de usuarios de Drupal

16

Tengo un requisito en el que tengo que reemplazar la autenticación de usuario predeterminada con la autenticación de un servidor central, es decir, un servidor SSO.
Al depurar Drupal, llegué a saber que toda la administración de la sesión ocurre en el includes/session.incarchivo. Quiero hacer la autenticación como se muestra en la imagen:

chasquido

ESCENARIO: Iniciar sesión
Los detalles de los pasos serían:

  1. Reemplace el formulario de inicio de sesión para enviar el nombre de usuario y la contraseña al servidor SSO ( no en Drupal , sino en .NET).
  2. Autentique al usuario en el servidor SSO usando la base de datos de ese sitio; y enviar una respuesta a alguna página PHP personalizada de mi sitio web (¿o un formulario de un módulo?).
  3. Utilizando la respuesta, identifique al usuario en la tabla de usuarios y cree una sesión para ese usuario sin verificar la contraseña (ya que significaría una doble autenticación). Por defecto, Drupal establece una cookie con nombre de $insecure_session_namevariable y con valor $sid. Quiero que Drupal no establezca la cookie aquí, sino que envíe los valores de las variables al servidor SSO.
  4. El servidor SSO tomará los valores, creará una cookie y la colocará en el dominio principal domain.com(para recordar a ambos my websitey sso serverestá en el subdominio del dominio principal, que también no está en Drupal). Luego, el sitio drupal puede iniciar sesión utilizando esa cookie.

Sé que es una pregunta difícil, solo estoy buscando consejos sobre cómo debo comenzar. como dicen "no debes hackear el núcleo". Entonces, mis preguntas son:

  1. ¿Dónde debo buscar para comprender cómo funciona la autenticación de Drupal y la gestión de sesiones en profundidad?
  2. ¿Hay alguna forma de llamar a las funciones al includes/session.incusar ganchos (como dicen los comentarios con funciones "solo para uso interno / no se debe modificar")?

NOTA: utilizaré el mismo método para registrar al usuario, de modo que el registro permanezca en la base de datos central del servidor SSO. Y durante eso, se colocará una contraseña basura para el mismo usuario en la base de datos del sitio Drupal (ya que la contraseña no se verificará al iniciar sesión).

AjitS
fuente
¿Necesita un verdadero SSO (inicie sesión en un sitio y ha iniciado sesión en todos los sitios), o simplemente se autentica en un sistema externo?
mpdonadio
@MPD Quiero un verdadero SSO, que requerirá iniciar sesión en un sitio y -> autenticar al mismo usuario en todos los sitios (podría no estar en Drupal.)
AjitS
@AjitS si ha implementado con éxito esto, puede poner una respuesta detallada. Estoy usando user_login_finalize pero me dicen que debido a problemas de GDPR no puedo almacenar los detalles en Drupal.
Jignesh Rawal

Respuestas:

17

Drupal admite autenticación externa . Existen muchas alternativas de módulos de autenticación para Drupal, como OpenID (incluido en el núcleo), OAuth Connector o LDAP . Obtenga más información sobre cómo funciona la autenticación Drupal; lo mejor sería mirar los módulos OpenID y OAuth, y al formulario de inicio de sesión principal enviar devolución de llamada. Pero, AFAIK, siempre comienzan la sesión normal de Drupal después de una autenticación exitosa.

Para la gestión de sesiones, Drupal se conecta al manejo de sesiones PHP y registra sus propios controladores. La sesión de back-end de Drupal es en sí enchufable, se puede establecer la session_incvariable a la ruta de un archivo que proporciona implementaciones alternativas de las funciones que se encuentran en includes/session.inc. El módulo memcache usa esto para almacenar la sesión en memcached.

Para referencias, el módulo OpenID maneja la autenticación exitosa en la openid_authentication()que termina y llama al controlador de envío del formulario de inicio de sesión del usuario (es decir user_login_submit()). Este controlador de envío en sí mismo es simple, carga al usuario autenticado con éxito user_load()en la $uservariable global , luego llama a user_login_finalize()qué sesión de manejo, marca de tiempo de inicio de sesión en la usertabla e invoca hook_user_login()implementaciones.

Otra opción es usar la user_external_login_register()función. La función iniciará sesión en un usuario externo. También crea un usuario local si es necesario. Si se necesita más control sobre la creación de usuario local, siempre se puede utilizar user_save(), user_set_authmaps(), user_login_submit()y user_external_load()de que llame a medida, utilizando user_external_login_register()como plantilla de lo que hay que hacer.

Pierre Buyle
fuente
2
Esto es bastante acertado. El lado de Drupal de iniciar sesión en usuarios externos es sorprendentemente fácil. El trabajo pesado (si lo hay) en realidad está interactuando con el sistema externo.
mpdonadio
@MPD Encontrar lo contrario, en mi caso particular. Sistema externo = servicio web JSON = cosas relativamente fáciles. Comportamiento de Drupal = cambio impredecible de versión a versión = difícil como el infierno y sin diagnósticos útiles cuando las cosas se rompen.
Trejkaz
1

user_authenticate () APi puede ser útil aquí.

3. Utilizando la respuesta, identifique al usuario en la tabla de usuarios y cree una sesión para ese usuario sin verificar la contraseña (ya que significaría una doble autenticación). Por defecto, Drupal establece una cookie con nombre de $insecure_session_namevariable y con valor $sid. Quiero que Drupal no establezca la cookie aquí, sino que envíe los valores de las variables al servidor SSO.

EDITAR: una vez que el servidor SSO regrese con verdadero uso, esta API para iniciar sesión en el usuario, que se encargará automáticamente de las sesiones por usted. Creo que es mejor si lo usas en user_authenticate()lugar de crear sesiones solo. No debería causar problemas, incluso es una autenticación doble, siempre y cuando se proporcione una p-assowrd válida.

No estoy seguro de 4. ¿Desea que la cookie sea visible en ambos dominios? Si es así, en settings.php se inicializa $cookie_domainen el dominio. Entonces las cookies en el subsitio estarán disponibles en el sitio principal.

GoodSp33d
fuente
Gracias por su respuesta. No puedo usar user_authenticateporque, la autenticación no necesita suceder en el sitio de Drupal. Puedo generar la sesión llamando drupal_session_generate()y drupal_session_regenerate()desde el archivo session.inc. Lo entendiste bien sobre el requisito de la cookie ... consulta la edición.
AjitS
@indrock Verifique ese enlace. User_authenticate le permitirá iniciar sesión con un nombre de usuario y contraseña proporcionados por el usuario correctos. En el Paso 3, cuando verifique que nombre de usuario y contraseña sean correctos en el servidor SSO, use esta API para iniciar sesión en el usuario. Pero debe tener una contraseña almacenada en Drupal. Hacer esto lo hará mucho más fácil que hackear el núcleo.
GoodSp33d