Crear API para inicio de sesión único con sitio de terceros

13

Mi sitio necesita integrarse con un software de terceros, que vivirá en su propio subdominio, alojado por la compañía de software. Necesito proporcionar a los desarrolladores de terceros un punto final que puedan usar para hacer llamadas API (a mi sitio de WordPress) para permitir que los usuarios de mi sitio accedan al subdominio.

El otro sitio necesita autenticar a los usuarios de mi sitio a través de algún tipo de API.

No estoy seguro de por dónde empezar, pero tengo la sensación de que esto ha sido descubierto por personas más inteligentes que yo. ¡Gracias por adelantado!

emersonthis
fuente
1
¿Qué tipo de llamadas API se necesitarán? ¿Que estás tratando de hacer? ¿Ha visto el soporte XML-RPC de WP ( codex.wordpress.org/XML-RPC_Support )?
anu
El otro sitio necesita verificar / autenticar usuarios de mi sitio WP.
emersonthis

Respuestas:

16

Problemas de secuencias de comandos entre sitios

No puede transferir cookies de autenticación WP entre dominios. Tampoco desea almacenar contraseñas de texto sin formato para iniciar sesión en otra instalación de WP mediante programación. Por lo tanto, deberá hacer que los usuarios inicien sesión en WordPress y luego acceder a su estado de inicio de sesión a través de un punto final API desde el sitio de terceros. Esto permite que WordPress maneje toda la autenticación. Es bastante seguro ya que un usuario tendrá que iniciar sesión físicamente en el lado de WP para que el punto final de la API sirva los datos a un tercero.

Crear un punto final de API

Mira este artículo que acabo de escribir aquí: http://coderrr.com/create-an-api-endpoint-in-wordpress/

Además, puede ver la demostración del código aquí: https://gist.github.com/2982319

Tendrás que descubrir la lógica para las necesidades de tu propia aplicación, pero esto te permitirá crear un punto final donde puedas servir lo que quieras desde el lado de WordPress.

Como está utilizando WordPress como el sitio de autenticación, puede usar una verificación como is_user_logged_in (). Si han iniciado sesión, devuelva un objeto de usuario al tercero con la información que necesite.

Iniciar sesión desde un tercero

Desde el tercero, pueden vincular a su página de inicio de sesión para una experiencia perfecta usando la var. Una vez que haya iniciado sesión, los devolverá al sitio de terceros.

http://sub.yourdomain.com/wp-login.php?redirect_to=http%3A%2F%2Fwww.third-party-domain.com

Inicios de sesión remotos

Si necesita iniciar sesión en WordPress desde un sitio de terceros, puede usar algunas funciones simples de WP enumeradas en este sitio: http://kuttler.eu/code/log-in-a-wordpress-user-programmatic/

Definitivamente necesitarás usar un secreto compartido y crear hashes basados ​​en el tiempo a partir de ese secreto para mantener las cosas seguras. Básicamente, así es como se vería:

El tercero envía una solicitud con una marca de tiempo y un token generado por un secreto compartido:

$shared_secret = 'foobar'; //do not send this to the API endpoint
$timestamp = time();
$token = md5($shared_secret.$time_stamp);

Instalación de WordPress recibe la solicitud:

$shared_secret = 'foobar';
$timestamp = esc_attr($_GET['timestamp']);

if((time() - $timestamp) > 30) # Threshold is 30 seconds
    //do something here - TOKEN expired!

$token = md5($share_secret.$timestamp);
$token_to_check = esc_attr($_GET);

if($token == $token_to_check)
    //authenticated!
Brian Fegter
fuente
Bastante seguro de que el software de terceros no tiene nada que ver con WP, por lo que esencialmente es un inicio de sesión único, pero con WP actuando como el proveedor de autenticación.
anu
@anu: Eso es correcto.
emersonthis
@Brian: Estoy interesado en la idea de cambiar a una instalación multisitio, pero no entiendo completamente el punto que hizo sobre las cookies. Todo lo que necesita suceder es que el software de terceros necesita verificar que su usuario sea realmente uno de mis usuarios. El software es autosuficiente y puede proporcionar sus propias cookies o lo que sea.
emersonthis
@Emerson ya veo ahora. Perdón por la confusion. Podría usar la idea de punto final que creé y usar el token compartido en el meta del usuario para la autenticación. Devuelva una respuesta JSON a la tercera parte si el usuario existe.
Brian Fegter
1
Muy buena solución. Puede haber un problema si las aplicaciones se instalan en servidores diferentes y, por alguna razón, el tiempo de cada máquina es diferente. Sugeriría usar en counterlugar de time()y pasarlo con la solicitud. Ambas partes mantienen el último contador pasado, y cuando api recibe una solicitud con un nuevo contador, verifica que el nuevo sea mayor que el último. De esta manera, una demora no puede causar ningún daño.
guyaloni