He estado creando un nuevo complemento con una interfaz de usuario de administración basada en React, que admite tanto el Editor de bloques como el Editor clásico. Mi diseño depende en gran medida de la API REST en lugar del legado wp-ajax sistema.
Últimamente, me he encontrado con un problema recurrente: aunque la interfaz de usuario muestra claramente que he iniciado sesión, la API REST sigue arrojando 403 Prohibido errores.
Aquí está el contexto de mi entorno:
- Se fuerza la desactivación de la caché de almacenamiento del navegador.
- No hay absolutamente ningún almacenamiento en caché de objetos o del lado del servidor activo.
- Estoy confirmado que he iniciado sesión; Puedo navegar libremente por el panel de administración de WP sin problemas.
En el pasado, cerrar sesión e iniciar sesión manualmente lo “solucionaba”, pero tenía el presentimiento de que esto era una solución. defecto fundamental de intercambio nonce. Si logro esto como desarrollador, es muy probable que mis usuarios también lo hagan. Así que hoy decidí profundizar en la causa raíz.
Para descartar mi propio código, verifiqué el Salud del sitio de WordPress página, incluso las llamadas principales a la API Site Health fallaban con un error 403.

Al inspeccionar las cookies de sesión, encontré dos cookies idénticas con el mismo nombre pero con rutas diferentes. Rastreé la lógica hasta pluggable.php aquí:
https://github.com/WordPress/WordPress/blob/59e1…/wp-includes/pluggable.php#L1193-L1195Lo más importante wordpress_logged_in galleta es era completamente desaparecidopero aún puedo navegar por las páginas de administración.

Mi entorno de desarrollo está limpio, solo WordPress y WooCommerce para probar las funciones del producto. Ningún otro complemento.
Pasos para reproducirse:
Paso 1:
Inicie sesión normalmente. Normalmente verá tres cookies:
- wordpress_{hash} (Ruta: /wp-admin)
- wordpress_{hash} (Ruta: /wp-content/plugins)
- wordpress_logged_in_{hash} (Ruta: /)
Paso 2:
Elimine manualmente la cookie wordpress_logged_in.
La interfaz de usuario del administrador todavía funciona perfectamente bien. Puede hacer clic y visitar diferentes páginas. Esto parece un error de nivel de seguridad: el panel permanece accesible incluso sin la cookie de inicio de sesión principal. Sin embargo, la API REST ahora está oficialmente rota (403) y Site Health está muerto. Esto se debe a que los nonces REST dependen de esa cookie de inicio de sesión específica para validar.
Paso 3:
Elimine la cookie wordpress_{hash} (Ruta: /wp-admin).
Sólo entonces serás finalmente expulsado a la pantalla de inicio de sesión.
No he investigado completamente por qué wordpress_logged_in La cookie desaparece en primer lugar, pero no creo que ese sea ni siquiera el punto principal. El verdadero problema es que los administradores modernos de WordPress dependen en gran medida de la API REST, pero la generación nonce está ligada a la wordpress_logged_in cookie, mientras que la propia interfaz de usuario del administrador está protegida por un conjunto completamente diferente de cookies «solo para administradores».
Este es un defecto de diseño fundamental. Se encuentra en una situación en la que el sistema cree que «ha iniciado sesión lo suficiente» para ver el panel, pero «no ha iniciado sesión lo suficiente» para usar las API que impulsan ese mismo panel.