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.inc
archivo. Quiero hacer la autenticación como se muestra en la imagen:
ESCENARIO: Iniciar sesión
Los detalles de los pasos serían:
- 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).
- 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?).
- 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_name
variable y con valor$sid
. Quiero que Drupal no establezca la cookie aquí, sino que envíe los valores de las variables al servidor SSO. - El servidor SSO tomará los valores, creará una cookie y la colocará en el dominio principal
domain.com
(para recordar a ambosmy website
ysso server
está 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:
- ¿Dónde debo buscar para comprender cómo funciona la autenticación de Drupal y la gestión de sesiones en profundidad?
- ¿Hay alguna forma de llamar a las funciones al
includes/session.inc
usar 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).
Respuestas:
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_inc
variable a la ruta de un archivo que proporciona implementaciones alternativas de las funciones que se encuentran enincludes/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 deciruser_login_submit()
). Este controlador de envío en sí mismo es simple, carga al usuario autenticado con éxitouser_load()
en la$user
variable global , luego llama auser_login_finalize()
qué sesión de manejo, marca de tiempo de inicio de sesión en lauser
tabla e invocahook_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 utilizaruser_save()
,user_set_authmaps()
,user_login_submit()
yuser_external_load()
de que llame a medida, utilizandouser_external_login_register()
como plantilla de lo que hay que hacer.fuente
user_authenticate () APi puede ser útil aquí.
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_domain
en el dominio. Entonces las cookies en el subsitio estarán disponibles en el sitio principal.fuente
user_authenticate
porque, la autenticación no necesita suceder en el sitio de Drupal. Puedo generar la sesión llamandodrupal_session_generate()
ydrupal_session_regenerate()
desde el archivo session.inc. Lo entendiste bien sobre el requisito de la cookie ... consulta la edición.