Integración de SSO / autenticación con 'servicio de directorio' externo

15

Estoy a punto de comenzar a trabajar en un prototipo para un cliente, y una de las características requeridas es la integración con un sistema interno de autenticación / registro de usuarios.

Este sistema actuará como la base de datos de usuarios autorizados y proporciona una interfaz RESTful para crear nuevos usuarios y autenticar usuarios válidos.

  1. Necesito poder crear nuevos usuarios en WP y, como parte de ese proceso, hacer una llamada a la API de autenticación externa para crear / validar a ese usuario.

  2. Una persona que sea un usuario válido pero que WP no conozca debería poder iniciar sesión para comentar, sin necesidad de registrarse en el sitio de WP.

  3. Una persona que inició sesión en el sitio web en general también debería iniciar sesión automáticamente en WordPress.

Estoy pensando que el siguiente es el camino a seguir.

  • Para (1): ¿hay un gancho de registro que pueda usar?

  • Para (2): supongo que engancho el filtro de autenticación, es decir, cuando alguien intenta iniciar sesión, lo atrapo, hago una llamada al sistema externo y luego proceso el inicio de sesión de WP o los redirijo al proceso de registro donde ( 1) toma oer.

  • Para (3): lea la cookie de inicio de sesión establecida por el sitio principal y continúe con (2).

Supongo que también necesitaré insertar un registro en los usuarios y la tabla de usuario.

Entonces, ¿tiene sentido lo anterior? ¿No he pensado en algo? Cualquiera tiene buenos recursos para ayudar con esto (@hakre - ¡¡Vi que has trabajado en esto !!).

Actualizar

Así que todavía estoy golpeando mi cabeza contra esto un poco, esencialmente estoy tratando de conectarme al filtro de autenticación, y lo uso para:

  1. compruebe si está configurada una cookie de inicio de sesión para el sitio 'maestro' y, en caso afirmativo, vuelva a validar contra su API de autenticación y, si es válida, fuerce un inicio de sesión de WP con wp_signon()la información contenida en la cookie del sitio maestro (correo electrónico y contraseña hash) como credenciales para WP
  2. si la cookie no está configurada, redirija a la página de inicio de sesión del sitio maestro y obtenga un inicio de sesión / registro y luego regrese al paso 1
  3. si no hay un usuario de WP cuando existe un usuario del sitio maestro autenticado, créelo y luego un inicio de sesión 'transparente' (es decir, para que el usuario no vea un formulario de inicio de sesión de WP)

Básicamente, quiero ocultar el formulario de inicio de sesión de WP completamente para los usuarios que solo van a comentar principalmente, y luego encontrar una manera de permitir que los autores y el administrador accedan directamente.

Va bastante lento, esto es con lo que podría necesitar ayuda:

  • ¿Es el filtro de autenticación el correcto para usar? No parece que lo llamen en todas las situaciones que esperaría, por ejemplo, el widget de meta muestra enlaces de inicio / cierre de sesión sin la activación del enlace de autenticación

  • puedo wp_signon()devolver un WP_Userobjeto (lo que indica éxito), pero no afecta el estado de inicio de sesión, es decir, el widget de meta aún se mostrará en "Iniciar sesión" incluso después de actualizar.

Cualquier ayuda recibida con gratitud :)

anu
fuente
tal vez esta debería ser una pregunta por separado?
Anu
Ah, y no sé si incluso se permite mencionar esto, pero me encantaría pagar medio día más o menos de ayuda para esto: detalles de contacto en mi perfil.
Anu

Respuestas:

12

OK, el enfoque que funciona para mí es el siguiente:

  1. Suponga que la base de datos de usuarios del sitio principal es autorizada. La cookie de inicio de sesión del sitio principal contiene un ID y un hash de la contraseña del sitio.

  2. Obtenga la cookie del sitio principal y vuelva a validarla contra la API de autenticación del sitio principal

  3. Si es válido, use la dirección de correo electrónico del valor de retorno como 'user_login'valor para WP y la contraseña del sitio con hash como contraseña de WP.

  4. Pruebe si este usuario existe en WP mediante wp_authenticate('user_login', 'user_pass'). Esto devuelve un WP_Userobjeto en caso de éxito o un WP_Errorobjeto en caso de error.

  5. Si WP_Error/is_wp_error(), use use wp_update_user()para crear un usuario (o actualizar un usuario con una contraseña modificada).

  6. Entrar a través de wp_set_current_user(), wp_set_auth_cookie()ydo_action('wp_login, id)

(Todo esto está contenido en una función asociada a la 'init'acción)

Esto parece estar funcionando: los usuarios válidos del sitio desconocidos para WP se crean automáticamente. Se atienden los cambios de contraseña, y si la cookie del sitio está configurada y el usuario de WP existe, el SSO es automático y bastante perfecto.

anu
fuente
1
+1 Descripción / respuesta impresionante. Espero que encuentres el tiempo un día para mostrar un poco más de detalles algún día. Nos ayudaría a otros a evitar la mayor parte de la prueba / erro;)
kaiser
1
Esto es exactamente lo que estoy buscando, ¿puedes explicar un poco más el proceso? Especialmente los pasos 1,2,3 no son muy claros para mí. ¡¡Gracias!!
chifliiiii
3

Todo el sistema de autenticación es conectable. Sugiero mirar los complementos existentes para tener una idea de cómo anular el sistema. ¿Quizás mirando algunos complementos LDAP ?

Dougal Campbell
fuente
Sí y sin querer ser sarcástico, ¡eso es obvio!
Anu
Para obtener información que pueda ayudar a reflejar el estado de inicio de
Dougal Campbell
1

Varias funciones relacionadas con el usuario se definen condicionalmente !function_exists()en wp-includes/pluggable.phpy son fáciles de anular con sus propias versiones.

Rarst
fuente
1

Habilitar el inicio de sesión único en WordPress me llevó más de 18 horas de lucha, pero podría llevarle solo unos minutos:

Básicamente, querrá usar https://wordpress.org/plugins/wp-force-login/ y una versión modificada de https://as.wordpress.org/plugins/jwt-authenticator/ y luego crear una autenticación protegido en su sitio principal que genera un JWT (JSON Web Token) y redirige a la URL especial de su sitio de WordPress.

Ver código completo aquí .

Ryan
fuente
Gracias por tu respuesta. Se desaconsejan las respuestas de solo enlaces, ya que los enlaces pueden desaparecer y hacer que su respuesta sea inútil. Es mejor incluir los bits relevantes aquí.
kaiser