Saltar al contenido principal
Agregamos la validación del parámetro state en la versión 3.6.0 del plugin de WordPress, que puedes encontrar en el repositorio de GitHub auth0/wordpress. Esta medida de seguridad ayuda a mitigar ataques CSRF al garantizar que la respuesta pertenezca a una solicitud iniciada por el mismo usuario. Para obtener más información, consulta Prevenir ataques y redirigir a los usuarios con el parámetro state de OAuth 2.0.

Cómo funciona la validación del estado

El plugin realiza la validación del estado de la siguiente manera:
  1. Establece una cookie auth0_state en el navegador mediante Javascript cuando se muestra el formulario de Login de Lock (en wp-login.php o en cualquier otra página al usar un shortcode o un widget).
  2. Pasa ese valor al formulario de inicio de sesión integrado de Lock para que se envíe con la solicitud de autenticación.
  3. Recibe ese valor de vuelta desde Auth0 sin cambios en un parámetro URL state si el inicio de sesión con Auth0 se realizó correctamente.
  4. Valida que el valor recibido coincida con el valor enviado y almacenado en la cookie auth0_state. Si es válido, el proceso de inicio de sesión continúa. Si no, el proceso se detiene y se muestra un mensaje de error de “Estado no válido”.
  5. Elimina la cookie, independientemente de si es válido o no.
  6. Usa valores del objeto decodificado en base64 para redirigir o realizar otras acciones de inicio de sesión, si es válido.
Este proceso debería ser completamente opaco tanto para el usuario que inicia sesión como para el administrador del sitio. El servidor de Auth0 no valida ni requiere un valor de estado y lo devuelve intacto a la URL de devolución de llamada. Si aparece el mensaje “Estado no válido”, entonces uno de los primeros 4 pasos anteriores no se está produciendo.

Causas comunes del error de estado no válido

A continuación, se muestran algunas causas comunes del error de estado no válido, así como algunos pasos de solución de problemas que puede seguir.

URLs de devolución de llamada en caché

La causa más común del error de estado no válido es que la URL de devolución de llamada esté almacenada en caché en el servidor. Desactive el almacenamiento en caché en su servidor para todas las URL enumeradas en el campo Allowed Callback URLs de Auth0 Dashboard > Applications > Applications > Settings y vuelva a probar. Además, excluya del almacenamiento en caché la URL del sitio (/index.php en una instalación normal) si incluye un parámetro de URL de Auth0. Compruebe que la hora del servidor esté configurada correctamente. El error BeforeValidException puede producirse cuando parece que el token se generó antes de la hora actual, algo que puede ocurrir si el reloj del servidor está desajustado. Puede comprobar la hora del servidor usando echo current_time( 'c' ). Como solución temporal, también puede modificar el complemento para añadir un desfase horario si no puede cambiar la hora del servidor, pero esto debe corregirse para producción. Si eso no resuelve el problema, continúe con los pasos de solución de problemas que se indican a continuación.

Cookies almacenadas en caché y parámetros de URL

Si está en un servicio de hosting administrado como WP-Engine, es posible que deba ponerse en contacto con su equipo de soporte para obtener ayuda adicional. Hemos recibido informes de problemas para acceder a las cookies necesarias en la URL de devolución de llamada, así como problemas al verificar la autenticación en la página final que ven los usuarios después de iniciar sesión. En concreto, solicite que se agreguen exclusiones de caché para:
  • Cookie: auth0_state
  • Cookie: auth0_nonce
  • Arg/parámetro de URL: auth0
  • Arg/parámetro de URL: code
  • Arg/parámetro de URL: state
  • Arg/parámetro de URL: id_token

Recarga de la página después de un mensaje de error

Si recarga la página después de ver un mensaje de error distinto (verificación de correo electrónico, etc.), aparecerá el mensaje de estado no válido, ya que se intentará volver a validar un valor que ya se utilizó. Esto es lo esperado. Algunos hosts, como Pantheon, requieren el uso de nombres de cookies específicos. Puedes cambiar el nombre de la cookie mediante el filtro auth0_state_cookie_name en tu tema o en un plugin personalizado. Para obtener más información sobre el filtro auth0_state_cookie_name, consulta Extiende el plugin de WordPress Login by Auth0. Para obtener información adicional, consulta el issue relacionado en GitHub y revisa su corrección. Si su sitio usa la página de y está creando el enlace manualmente en un tema o plugin, debe:
  • Establecer una cookie llamada auth0_state con un valor generado aleatoriamente
  • Enviar ese valor en un parámetro de URL state.
Como alternativa, puede ir a Configuración > pestaña Funciones > Página de Universal Login y redirigir las solicitudes de inicio de sesión a la página wp-login.php, donde esa cookie y ese parámetro de URL se establecerán automáticamente.

Acceder directamente a la URL de devolución de llamada

Si accede directamente a su URL de devolución de llamada (normalmente yourdomain.com/index.php?auth0=1) o vuelve a hacerlo después de que se haya intercambiado el código de autorización, es posible que aparezca el error de estado no válido. Esto indica que el estado ya se ha verificado y eliminado.

Solucionar problemas de errores de estado no válido

Ten en cuenta que algunos de los pasos siguientes requerirán interrumpir el proceso de inicio de sesión (se indicará cuando sea así):
  1. Con la sesión cerrada en WordPress y Auth0, visita la página de Login que estás probando.
  2. Comprueba si se está estableciendo la cookie auth0_state (en Chrome, View > Developer > JavaScript Console > Application tab > Storage a la izquierda > Cookies > dominio que se está probando; busca una cookie auth0_state con un valor no vacío).
    • Si este valor no está establecido, comprueba si hay errores en la consola de JS y asegúrate de que tu navegador pueda aceptar cookies (el Login no funcionará sin cookies).
    • Si el valor está establecido, cópialo y visualiza el código fuente de la página (en Chrome, View > Developer > View Source). Busca el valor; debería aparecer como el valor asociado al parámetro wpAuth0LockGlobal.settings.auth.params.state (ver JSON de ejemplo). Toma nota de este valor (lo necesitarás en un paso posterior).
  3. Si el valor aparece allí y el formulario de Lock se carga con normalidad, entonces los pasos 1 y 2 de la primera lista anterior están funcionando correctamente.
  4. Antes de iniciar sesión, agrega este fragmento de código al principio de tu wp-config.php para poder hacer una instalación de prueba. ADVERTENCIA: Esto interrumpirá el Login del sitio de WordPress que se está probando, así que úsalo solo en una instalación que no sea de producción.
  5. Inicia sesión normalmente.
  6. Después de que se te redirija de vuelta a la URL de devolución de llamada de tu sitio, el proceso se detendrá. Deberías ver una salida como la que se muestra en el Gist enlazado en el paso n.º 4 anterior. Si ves algo como Array() sin valores adicionales, podría estar ocurriendo una de estas dos cosas:
    • La URL de devolución de llamada de WordPress está almacenada en caché. El almacenamiento en caché de páginas puede producirse de muchas formas distintas, por lo que no podemos proporcionar pasos concretos aquí. Revisa cualquier plugin de caché que tengas instalado; normalmente incluyen algún tipo de exclusión de URL. Consulta también con tu proveedor de hosting, ya que el almacenamiento en caché puede ser automático y requerir la intervención del equipo de soporte.
    • El servidor no está leyendo la cookie de Auth0. Para una posible solución, consulta el issue relacionado en GitHub y revisa su corrección.
  7. Si los valores están presentes, comprueba los encabezados de respuesta de la URL de devolución de llamada que se está cargando (en Chrome, View > Developer > JavaScript Console > Network tab, haz clic en el primer “document” listado con un estado 500 y busca “Response Headers”). Busca cualquier indicio de almacenamiento en caché, como un Cache-Control con un max-age distinto de cero, un x-cache con un valor distinto de MISS o cualquier otra pista de que esta página se está sirviendo desde una caché.
  8. También en los encabezados de respuesta, comprueba que set-cookie incluya una directiva como auth0_state=deleted para confirmar que el proceso de validación se está llevando a cabo.
  9. Asegúrate de que el parámetro state de la URL coincida con el registrado a partir de la cookie establecida en el paso n.º 3 anterior.
  10. Si no hay indicios de almacenamiento en caché, elimina el fragmento de depuración de wp-config.php y vuelve a cargar la URL de devolución de llamada. Deberías volver a ver el mensaje “Estado no válido”. Si se hicieron cambios en la caché, intenta completar todo el proceso de Login (asegúrate de borrar las cookies y la caché del navegador del sitio antes de hacer la prueba).
Los siguientes pasos de solución de problemas requieren cambios en el plugin que interrumpirán el proceso de Login y que deberán revertirse una vez completados. Estos pasos deben realizarse en un servidor de prueba o de staging.
  1. A continuación, debemos comprobar por qué el estado llega pero no coincide con el valor almacenado.
  2. En lib/WP_Auth0_LoginManager.php, muestra los valores del estado almacenado y del estado devuelto, y detén el proceso a continuación. Justo antes de la línea 148, agrega:
echo '<h1>$_REQUEST</h1>'; var_dump($_REQUEST); echo '<h1>$_COOKIE</h1>'; var_dump($_COOKIE); die('<h1>Done</h1>');
  1. Una vez más, asegúrate de haber cerrado sesión y completa el proceso de Login.
  2. Deberías ver valores en la salida cuando se te redirija de nuevo a la URL de devolución de llamada de WordPress.
  3. Comprueba si el valor de state en $_REQUEST existe y coincide con el valor de auth0_state en $_COOKIE.
  • Si es diferente, debe coincidir con el valor original registrado en el paso n.º 3 anterior. Esto significa que el valor de estado de $_COOKIE ha cambiado en algún momento del proceso.
Si ninguno de los pasos anteriores resuelve el problema, recopila los resultados de los pasos anteriores y contacta con soporte o publica en Community con la etiqueta wordpress. Incluye también: