Cómo usar la API REST de WordPress para iniciar sesión de un usuario

25 sept 2021, 02:37:55
Vistas: 16.3K
Votos: 2

Me gustaría usar la API REST para recibir un nombre de usuario y una contraseña enviados en una solicitud y usarlos en wp_authenticate(), luego responder si las credenciales eran correctas. ¿Cómo puedo hacer esto?

3
Comentarios

Puedes crear un endpoint personalizado, luego en tu solicitud API, incluir el nombre de usuario y contraseña, y después llamar wp_authenticate() en tu endpoint para validar las credenciales. Pero la conexión siempre debe usar https (protocolo seguro) porque estarías enviando la contraseña en texto plano. ¿Y has intentado algún código, has leído algún tutorial/artículo?

Sally CJ Sally CJ
25 sept 2021 04:47:39

@SallyCJ ¿Qué método usaría para enviar los datos? Además, ¿cómo se vería la función?

jeffinter jeffinter
25 sept 2021 06:57:36

La API puede usarse desde cualquier aplicación (JS, PHP, cURL, Postman, Python, etc.) enviando solicitudes HTTP básicas. Por ejemplo, en el lado del front-end (o no administrador) de un sitio WordPress, puedes usar el cliente Backbone.js o wp.apiFetch().

Sally CJ Sally CJ
25 sept 2021 07:50:40
Todas las respuestas a la pregunta 4
0

Añadir código al functions.php Y enviar datos a la ruta

add_action( 'rest_api_init', 'register_api_hooks' );
// Endpoints API personalizados para WP-REST API
function register_api_hooks() {

    register_rest_route(
        'custom-plugin', '/login/',
        array(
            'methods'  => 'POST',
            'callback' => 'login',
        )
    );
}

function login() {
    // Tu lógica va aquí
    return wp_signon( array(
        'user_login'    => $_POST['user_login'],
        'user_password' => $_POST['user_password'],
        'remember'      => $_POST['remember']
    ), false );

}
10 ene 2024 13:44:47
0

Existen 3 formas de autenticar a un usuario utilizando una solicitud a un punto final de API REST,

1- usando cookies, que es la forma en que WordPress realiza el seguimiento de usuarios autenticados en solicitudes POST. Pasas los detalles de autenticación en tu solicitud REST, usas la wp_signon() función para iniciar sesión de tu usuario, y si es exitoso, estableces la cookie de autenticación usando la función wp_set_auth_cookie() función,

$creds = array(
    'user_login'    => 'ejemplo',
    'user_password' => 'contraseñaenplano',
    'remember'      => true
);

$user = wp_signon( $creds, false );

if ( is_wp_error( $user ) ) {
    $msg = $user->get_error_message();
}else{
  wp_clear_auth_cookie();
  wp_set_current_user ( $user->ID ); // Establecer los detalles del usuario actual
  wp_set_auth_cookie  ( $user->ID ); // Establecer detalles de autenticación en la cookie
  $msg = "Inicio de sesión exitoso"; 
}

Puedes encontrar una discusión sobre esto en el hilo del foro de WordPress.

2- Usando solicitudes de Autenticación Básica a tu propio servidor

la idea aquí es que por cada solicitud REST que hagas a tu servidor, pases las credenciales del usuario (cada vez) a través de una conexión SSL. El grupo de API de WordPress proporciona un plugin en su repositorio de GitHub para hacer esto por ti, que te permite codificar las credenciales del usuario y decodificarlas en el otro lado para autenticarlas, así que por ejemplo, para eliminar una publicación de un usuario en el servidor,

let user='...', pw='...';
jQuery.ajax({
   url: 'http://tu-dominio/wp-json/wp/v2/posts/50',
   method: 'DELETE',
   crossDomain: true,
   beforeSend: function ( xhr ) {
       xhr.setRequestHeader( 'Authorization', 'Basic ' + Base64.encode( user + ':' + pw ) );
   },
   success: function( data, txtStatus, xhr ) {
       console.log( data );
       console.log( xhr.status );
   }
});

Para más detalles, consulta este tutorial detallado

3- usando autenticación de terceros como el estándar abierto OAuth.

Esto es lo que usa Google, y permite que tu sitio identifique usuarios basándose en sus credenciales de inicio de sesión de Google. WordPress.com también usa este método para la autenticación de su servicio de blogs.

La idea es que tus usuarios inicien sesión en un servidor que los identifique (usando cookies en su navegador).

Una vez autenticados, tu página (js reactivo) hace una solicitud a la autoridad/servidor de autenticación que, si es confirmada por el usuario, devuelve un token de acceso que se usa para autenticar las solicitudes REST a partir de ese momento.

Podrías usar un servicio de autenticación de terceros, como Google, en cuyo caso puedes seguir este tutorial de YouTube que te guía por lo básico para configurar un proyecto de API de Google y permitir que tu aplicación haga solicitudes de autenticación.

Alternativamente, podrías convertir tu servidor WordPress en un servidor OAuth usando un plugin existente como WP-OAuth Server, y su extensa documentación.

25 sept 2021 14:40:30
3

La mejor manera de "iniciar sesión" de un usuario en un sitio es utilizar el formulario de inicio de sesión de WordPress. Como sugieren otros comentarios y respuestas, hacerlo de la manera que implica el título de la pregunta requiere reinventar la rueda. El formulario de inicio de sesión, además de realizar el inicio de sesión real, también proporciona retroalimentación cuando el inicio de sesión falla y ofrece un flujo para restablecer la contraseña.

Incluso si buscas una experiencia completamente "sin cabeza" (headless) en WordPress, probablemente deberías estar 100% seguro de que el esfuerzo de reinventar el formulario de inicio de sesión vale la pena.

Ahora bien, si te refieres a autenticar a un usuario desde un dominio diferente, simplemente no va a funcionar, ya que las cookies se establecerán solo en el dominio del sitio, según recuerdo.

Así que el único caso de uso válido es la comunicación de servidor a servidor, en la que necesitas almacenar las cookies que recibes de tu solicitud de "inicio de sesión" y reutilizarlas en las próximas solicitudes. Pero esto implica que almacenes el usuario y la contraseña en tu servidor, en cuyo caso usar contraseñas de aplicación podría ser una solución mejor.

25 sept 2021 15:42:06
Comentarios

No responde a la pregunta.

Aurovrata Aurovrata
28 dic 2022 07:13:38

Las malas preguntas obtienen respuestas no tan buenas. En retrospectiva, el OP probablemente quiere saber si un usuario está logueado, pero enviar una solicitud REST solo para eso difícilmente sea la forma óptima de hacerlo.

Mark Kaplun Mark Kaplun
28 dic 2022 15:20:34

a menos que sea entre dominios diferentes, en cuyo caso se puede abrir un nuevo conjunto de problemas si se implementa algo así

Mark Kaplun Mark Kaplun
28 dic 2022 15:45:05
0

Las contraseñas de aplicación de WordPress (introducidas en WordPress 5.6) permiten el acceso a la API mediante Autenticación Básica HTTP. Utilizas tu nombre de usuario de WordPress y una contraseña de aplicación generada (que se encuentra en tu perfil de usuario) para autenticar las solicitudes.

Pasos exactos

Iniciar sesión en el Administrador de WordPress: Accede al panel de administración de WordPress (ej., https://tu-sitio-wordpress.com/wp-admin).

Navegar a tu Perfil: En el menú de la izquierda, haz clic en Usuarios y luego en Perfil (o Tu Perfil).

Ubicar la sección de Contraseñas de Aplicación: Desplázate hacia abajo hasta ver la sección de Contraseñas de Aplicación.

Generar una nueva Contraseña de Aplicación: Ingresa un nombre descriptivo para la nueva aplicación (ej., "Aplicación Python"). Haz clic en el botón Agregar Nueva Contraseña de Aplicación. Importante: Copia la contraseña generada inmediatamente, ya que no se mostrará de nuevo.

Usar las Credenciales para Solicitudes API: Combina tu nombre de usuario de WordPress y la contraseña de aplicación generada para autenticarte mediante Autenticación Básica HTTP. La biblioteca requests con HTTPBasicAuth codificará automáticamente estas credenciales en Base64.

Ejemplo de código en Python:

import requests
from requests.auth import HTTPBasicAuth

# Reemplaza con la URL de tu sitio WordPress, nombre de usuario y la contraseña de aplicación generada
site_url = "https://tu-sitio-wordpress.com"
username = "tu_nombre_de_usuario"
app_password = "tu_contraseña_de_aplicación"

# Ejemplo: Obtener publicaciones
get_url = f"{site_url}/wp-json/wp/v2/posts"
response = requests.get(get_url, auth=HTTPBasicAuth(username, app_password))
print("Respuesta GET:", response.json())

# Ejemplo: Crear una nueva publicación con datos
post_url = f"{site_url}/wp-json/wp/v2/posts"
data = {
    "title": "Hola Mundo",
    "content": "Esta publicación fue creada mediante la API REST con una contraseña de aplicación.",
    "status": "publish"
}
response = requests.post(post_url, json=data, auth=HTTPBasicAuth(username, app_password))
print("Respuesta POST:", response.json())
5 mar 2025 16:50:31