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

11

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 autorizada y proporciona una interfaz REST 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 ese usuario.

  2. Una persona que es un usuario válido pero que WP no conoce debe poder iniciar sesión para comentar, sin necesidad de registrarse en el sitio de WP.

  3. Una persona que haya iniciado sesión en el sitio web general también debe iniciar sesión automáticamente en WordPress.

  

Estoy pensando que el siguiente es el camino a seguir.

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

  •   
  • Para (2) - Supongo que engancho el filtro de autenticación, es decir, cuando alguien intenta iniciar sesión, capto eso, hago una llamada al sistema externo y luego procesa el inicio de sesión WP o lo redirecciono al proceso de registro donde (1) toma el cargo.

  •   
  • 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 la tabla de usuarios y usuarios.

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

Actualizar

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

  1. compruebe si una cookie de inicio de sesión para el sitio 'maestro' está configurada, y si lo está, vuelva a validar su API de autenticación y, si es válida, fuerce un inicio de sesión WP con wp_signon() , usando la información contenida en la cookie del sitio maestro (correo electrónico y contraseña con hash) como credenciales para WP
  2. si la cookie no está establecida, rediríjala a la página de inicio de sesión del sitio maestro y obtenga un inicio de sesión / registro y luego vuelva al paso 1
  3. si no hay un usuario de WP cuando existe un usuario de 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 por completo para los usuarios que solo van a realizar comentarios, y luego encontrar una manera de permitir que los autores y administradores accedan a él directamente.

Va bastante lento, esto es para lo que necesito ayuda:

  • ¿es el filtro de autenticación el correcto para usar? No parece que se haga ninguna llamada en todas las situaciones que esperaría, por ejemplo, el meta widget muestra los enlaces de inicio / cierre de sesión sin el enlace de autenticación auténtico

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

Cualquier ayuda recibida con gratitud :)

    
pregunta anu 08.02.2011 - 18:26

3 respuestas

10

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

  1. Suponga que la base de datos de usuarios del sitio principal tiene autoridad. La cookie de inicio de sesión principal del sitio 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 el valor 'user_login' para WP, y la contraseña del sitio de hash como la contraseña de WP.

  4. Pruebe si este usuario existe en WP utilizando wp_authenticate('user_login', 'user_pass') . Esto devuelve un objeto WP_User en caso de éxito, o un objeto WP_Error en caso de error.

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

  6. Iniciar sesión a través de wp_set_current_user() , wp_set_auth_cookie() y do_action('wp_login, id)

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

Esto parece estar funcionando: los usuarios de sitios válidos desconocidos para WP se crean automáticamente. Se atienden los cambios de contraseña, y si la cookie del sitio se establece y el usuario de WP existe, el inicio de sesión único es automático y bastante transparente.

    
respondido por el anu 08.03.2011 - 14:35
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 ?

    
respondido por el Dougal Campbell 04.03.2011 - 18:48
1

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

    
respondido por el Rarst 08.02.2011 - 19:51

Lea otras preguntas en las etiquetas