Cliente WordPress DiscourseConnect - nonce caducado

Me encontré con el mismo problema y ocurre al iniciar sesión con Google. Antes de WordPress, usamos Nginx como proxy inverso. ¿Podría estar relacionado?

Supongo que esto está sucediendo al iniciar sesión en WordPress a través de tu sitio de Discourse. Si ese es el caso, el problema es que el nonce generado por WordPress ha expirado. Esto sucede en sitios de WordPress que tienen habilitado el almacenamiento en caché de objetos.

Una solución es deshabilitar el almacenamiento en caché de objetos en cualquier página que tenga el enlace “Iniciar sesión con Discourse”. Para este enfoque, asegúrate de que el almacenamiento en caché de objetos esté deshabilitado para los usuarios anónimos.

Otra solución se describe aquí: Wordpress SSO Expired nonce - #15 by simon. La función en esa publicación se puede copiar exactamente como está en el archivo functions.php de tu tema de WordPress.

Esa función agrega una cadena aleatoria a la URL de Iniciar sesión con Discourse. La cadena aleatoria activa WordPress para que rompa la caché y genere un nonce nuevo para el usuario. @angus, esto probablemente debería agregarse al código del plugin: wp-discourse/lib/sso-client/sso-client-base.php at main · discourse/wp-discourse · GitHub. No tiene inconvenientes y no creo que haya otra forma de lidiar con el almacenamiento en caché de objetos que cause que se usen nonces obsoletos en lugar de generar nuevos para cada visita.

3 Me gusta

Muchas gracias por la respuesta. Una vez que lancemos Discourse en producción, intentaremos deshabilitar la caché de Nging en el sitio de WordPress y, si eso no funciona, editaremos el functions.php según las instrucciones.

¡Gracias @simon!

No tengo muy claro por qué esto borraría la caché de objetos de WordPress, ya que normalmente añadir una cadena aleatoria a una URL se utiliza para evitar la caché del navegador. ¿Qué consulta se está almacenando en caché en la caché de objetos de WordPress? Veo una razón no relacionada con la caché de objetos por la que ese enfoque podría funcionar

Sin embargo, si ese es el caso, es posible que necesitemos un ajuste ligeramente diferente. ¿Pero quizás me estoy perdiendo algo?

El problema no es con la caché de objetos de WordPress, hasta donde yo sé, no es persistente entre solicitudes. El problema ocurre con sitios que tienen algún tipo de caché persistente: https://developer.wordpress.org/reference/classes/wp_object_cache/#persistent-caching. Esto se puede configurar a través de un plugin, pero también está habilitado por defecto por algunos proveedores de alojamiento, por ejemplo WP Engine. Creo que en el caso de WP Engine, no habilitan la caché de objetos en su página de inicio de sesión, pero sí la habilitan para usuarios anónimos en todas las demás páginas. Por lo tanto, en WP Engine, el problema solo se activa si el enlace “iniciar sesión con Discourse” se agrega a una página que no sea la página de inicio de sesión.

El problema con discourse_sso_url es que cuando siempre se establece en el mismo valor, para sitios que tienen habilitada una caché persistente, siempre devolverá el mismo nonce. Establecer su valor discourse_sso en una cadena aleatoria, en lugar de su valor predeterminado de 1, rompe la caché. Al menos siempre ha funcionado así cuando lo he probado anteriormente. No tengo las cosas configuradas para probarlo en este momento.

Editar: hay algunos detalles más sobre el problema aquí: Discourse (as provider) + WP SSO nonce error - #14 by simon. Ha pasado bastante tiempo desde que miré esto. La solución al problema en ese momento parecía ser tanto agregar una cadena aleatoria a discourse_sso_url como asegurarse de que la caché de páginas no estuviera habilitada en la página donde se mostraba el enlace de inicio de sesión (de lo contrario, la cadena aleatoria no será única para cada visita de un usuario anónimo).

Entiendo. Gracias por la explicación.

Creo que deberíamos ir paso a paso, ya que desconfío de implementar una solución aquí sin estar seguro de que será “pluralista”, es decir, que funcionará con diferentes enfoques de caché.

Todavía no tengo muy claro el papel de las diversas cachés en la causa de este problema específico, en particular los diferentes papeles de las cachés de objetos persistentes y de páginas (si están presentes). Puedo entender por qué una caché de páginas podría causar este problema, pero no una caché de objetos persistentes (todavía). Si es lo último, es posible que queramos ajustar las consultas en nuestra clase Nonce en su lugar.

Necesitaré probar esto con un poco más de profundidad la próxima semana.

@Petr_Mišák ¿Podrías intentar primero deshabilitar cualquier caché de página que tengas en la página con el enlace de inicio de sesión y decirnos cómo te va con eso?

Intentaré deshabilitar nuestra Nginx Microcache para una página de inicio de sesión de prueba en WordPress. Nuestra página de prueba donde iniciamos sesión en WordPress a través de Discourse está aquí Test Discourse Login | Svět Androida

He notado (ocasionalmente) el problema si uso el inicio de sesión de Google para iniciar sesión.

Pero ahora me sorprende que los enlaces de inicio de sesión de Discourse que pusimos en la página usando el shortcode hayan desaparecido de nuestra página de prueba.

¿Alguien tiene alguna idea de por qué está sucediendo esto?

Hasta que resuelva el problema con la página de prueba de inicio de sesión, no tengo ningún “nonce expirado” para probarlo.

Por favor, primero asegúrate de que no haya algún tipo de problema de caché. Haznos saber cómo te va con eso.

Entendido, lo resolveremos paso a paso, estoy de acuerdo.

Parece que el error también ocurre con el inicio de sesión oficial. Aquí tienes un correo electrónico para simularlo para que puedas probarlo tú mismo.

  1. Ve a la página Přihlásit se ‹ Svět Androida — WordPress
  2. Inicia sesión usando “Iniciar sesión con Discourse” y usa tu cuenta de Google allí.
  3. Después de iniciar sesión en Discourse, serás redirigido de vuelta a https://www.svetandroida.cz/ o https://www.svetandroida.cz/wp-login.php con un mensaje de error, mira la captura de pantalla.

Está mal probado porque el problema no siempre aparece.
Por favor, inténtalo y hazme saber si obtienes el error antes de que desactive la caché de Nginx. Gracias.

1 me gusta

Comprobé el estado de nuestra Nginx Microcache en Přihlásit se ‹ Svět Androida — WordPress, pero parece que Nginx Microcache no se utiliza allí en absoluto. El problema con el “nonce expirado” estará, por lo tanto, relacionado con otra cosa.

1 me gusta

Hola @Petr_Mišák, solo quería saber si lograste encontrar al culpable de esto.

Hemos buscado pero hasta ahora, lamentablemente, sin éxito. Pero seguiremos buscando y buscando la causa del problema.

Estoy bastante seguro de que el problema al iniciar sesión en https://www.svetandroida.cz/ a través de Discourse está relacionado con el nonce en caché. La forma en que probé esto fue haciendo clic en el enlace “Iniciar sesión con Discourse” (https://www.svetandroida.cz/?discourse_sso=1&redirect_to=https%3A%2F%2Fwww.svetandroida.cz%2F).

La primera vez que lo hice, fui redirigido a https://komunita.svetandroida.cz/, creé una cuenta en el sitio de Discourse con Gmail, y luego fui redirigido de regreso a su sitio de WordPress como usuario conectado.

Luego cerré sesión en su sitio de WordPress e intenté iniciar sesión nuevamente haciendo clic en el enlace “Iniciar sesión con Discourse”. Esta vez obtuve el error “nonce expirado”.

Luego generé un enlace de inicio de sesión con un valor aleatorio para el parámetro de URL discourse_sso, por ejemplo https://www.svetandroida.cz/?discourse_sso=181253058&redirect_to=https%3A%2F%2Fwww.svetandroida.cz%2F y pude iniciar sesión en su sitio de WordPress a través de Discourse sin ningún problema.

Lo he intentado varias veces, tanto con el enlace de inicio de sesión que genera el plugin (https://www.svetandroida.cz/?discourse_sso=1&redirect_to=https%3A%2F%2Fwww.svetandroida.cz%2F) como con enlaces de inicio de sesión que tienen un valor aleatorio establecido para el parámetro discourse_sso. Parece que el nonce que se devuelve se está almacenando en caché durante al menos unos minutos.

Sin depurar completamente el problema, estoy bastante seguro de que puede hacer que las cosas funcionen simplemente agregando lo siguiente al archivo functions.php de su tema (establecerá una cadena aleatoria en el parámetro de URL discourse_sso. Esto debería funcionar siempre que tampoco haya “almacenamiento en caché de páginas” habilitado en su página de inicio de sesión).

add_filter('wpdc_sso_client_query', 'wpdc_custom_sso_client_query' );
function wpdc_custom_sso_client_query() {
    return wp_generate_password( 12, false );
}

Si desea depurar el problema, esto es lo que veo para una solicitud exitosa. Tenga en cuenta la línea Cache-Svetzitrka: STALE. Esto podría indicar que hay una capa de caché personalizada en su lugar y que la caché estaba STALE para la solicitud exitosa (por lo que se generó un nonce nuevo).

Resumen
Request URL:
https://www.svetandroida.cz/?discourse_sso=1&redirect_to=https%3A%2F%2Fwww.svetandroida.cz%2F
Request Method:
GET
Status Code:
302 Found
Remote Address:
93.185.102.156:443
Referrer Policy:
strict-origin-when-cross-origin
Cache-Control:
max-age=0
Cache-Svetzitrka:
STALE
Content-Length:
0
Content-Type:
text/html; charset=UTF-8
Date:
Mon, 11 Dec 2023 09:38:05 GMT
Expires:
Mon, 11 Dec 2023 09:21:47 GMT
Location:
https://komunita.svetandroida.cz/session/sso_provider?sso=bm9uY2U9MGU3NTNjYWNhNjMwNmMzNzM5M2MyODk4MjZlYzMxMjQmcmV0dXJuX3Nzb191cmw9aHR0cHMlM0ElMkYlMkZ3d3cuc3ZldGFuZHJvaWRhLmN6JTJG&sig=32ddcc85bd2dd7175f963e791cc9ac734a607355d773422d3abec6173c9f656b
Server:
nginx
Strict-Transport-Security:
max-age=10886400; includeSubdomains; preload
X-Content-Type-Options:
nosniff
X-Frame-Options:
SAMEORIGIN
X-Redirect-By:
WordPress

Esto es lo que veo para una solicitud fallida. La línea Cache-Control: no-cache, no-store parece indicar que la respuesta no debería almacenarse en caché, pero la entrada from service worker en la respuesta indica que la respuesta podría provenir de la caché de un service worker.

Resumen
Request URL:
https://www.svetandroida.cz/?discourse_sso=1&redirect_to=https%3A%2F%2Fwww.svetandroida.cz%2F
Request Method:
GET
Status Code:
302 Found (from service worker)
Referrer Policy:
strict-origin-when-cross-origin
Cache-Control:
no-cache, no-store
Content-Security-Policy:
upgrade-insecure-requests; base-uri 'self'; object-src 'none'; script-src https://komunita.svetandroida.cz/logs/ https://komunita.svetandroida.cz/sidekiq/ https://komunita.svetandroida.cz/mini-profiler-resources/ https://komunita.svetandroida.cz/assets/ https://komunita.svetandroida.cz/extra-locales/ https://komunita.svetandroida.cz/highlight-js/ https://komunita.svetandroida.cz/javascripts/ https://komunita.svetandroida.cz/plugins/ https://komunita.svetandroida.cz/theme-javascripts/ https://komunita.svetandroida.cz/svg-sprite/ https://www.google-analytics.com/analytics.js https://www.googletagmanager.com/gtag/js 'sha256-8uAKDaK4QxxCeYZl0Wxad2Nnj2tgKyA14hYBh66pnn0='; worker-src 'self' https://komunita.svetandroida.cz/assets/ https://komunita.svetandroida.cz/javascripts/ https://komunita.svetandroida.cz/plugins/; frame-ancestors 'self'; manifest-src 'self'
Content-Type:
text/html; charset=utf-8
Date:
Mon, 11 Dec 2023 09:38:05 GMT
Discourse-Logged-Out:
1
Location:
https://komunita.svetandroida.cz/login
Referrer-Policy:
strict-origin-when-cross-origin
Server:
nginx
Set-Cookie:
sso_payload=sso%3Dbm9uY2U9MGU3NTNjYWNhNjMwNmMzNzM5M2MyODk4MjZlYzMxMjQmcmV0dXJuX3Nzb191cmw9aHR0cHMlM0ElMkYlMkZ3d3cuc3ZldGFuZHJvaWRhLmN6JTJG&sig=32ddcc85bd2dd7175f963e791cc9ac734a607355d773422d3abec6173c9f656b; path=/; SameSite=Lax
Set-Cookie:
_forum_session=kGW2K6gafsjS90qQMEmxzjggEYo4tZPZe76XZNVro34ilyuuHsaYt2nEzC9h6tfiSBmY9XoDdxh1SV3S8n%2BwqrbsD58UvJBz6khjm%2Fty83ufkgry8daHDdyoTfFwQOjAbXrWeGIwkS4edGY1XetNwXhu%2FNJUghqmq8BEUycBt7098KUO%2BmRYDl5iSL0FNhUzo5Hc7xwRg0tfxuxmb%2FIyVLnbFz6IJuGB3Y95PRcU5DYIwAAny1GQbKQ23kSjgALxAThG7aA%2B7LCI9cJNWV1JRSy%2FTElDN3iugKuVpaQcrSPhV3SvQaiNH3MCfLwu6yxlp%2BZ%2BwTyw22czX8bb197z36WhlbghYtxvKYGRjONJQUagisjPpMrCAcGeTKsGB4JgnUKCtlrwIoFvaDxjec7hMo3aCnibbbkmcxWc6LvD6G2xaxkDgebe7RpvfTYdG8cn8j6rNwX3hM8la4RqZnmma0%2FQlSrfj0BjfY7lnan6TYm28vLwH%2FFfdZoRbo6JdTs5AFjCJvx9UXSjFmoXHH1R1yfAizPeKDFnpiuUs4a%2FBzWafQ%3D%3D--8PEvbWwpqBuJMSRJ--CzzhBea4mmv58a7KLEnukw%3D%3D; path=/; secure; HttpOnly; SameSite=Lax
Set-Cookie:
_t=; path=/; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 GMT; SameSite=Lax
Strict-Transport-Security:
max-age=31536000
Vary:
Accept
X-Content-Type-Options:
nosniff
X-Discourse-Route:
session/sso_provider
X-Download-Options:
noopen
X-Frame-Options:
SAMEORIGIN
X-Permitted-Cross-Domain-Policies:
none
X-Request-Id:
001750b9-94f2-4bf0-8503-9d673463b91e
X-Runtime:
0.012335
X-Xss-Protection:
0
2 Me gusta