Client DiscourseConnect WordPress - nonce expiré

J’ai rencontré le même problème et cela se produit lors de la connexion avec Google. Avant WordPress, nous utilisons Nginx comme proxy inverse. Cela pourrait-il être lié ?

Je suppose que cela se produit lors de la connexion à WordPress via votre site Discourse. Si c’est le cas, le problème est que le nonce généré par WordPress a expiré. Cela se produit sur les sites WordPress qui ont un cache d’objets activé.

Une solution consiste à désactiver le cache d’objets sur toutes les pages qui contiennent le lien « Se connecter avec Discourse ». Pour cette approche, assurez-vous que le cache d’objets est désactivé pour les utilisateurs anonymes.

Une autre solution est décrite ici : Wordpress SSO Expired nonce - #15 by simon. La fonction de ce post peut être copiée telle quelle dans le fichier functions.php de votre thème WordPress.

Cette fonction ajoute une chaîne aléatoire à l’URL « Se connecter avec Discourse ». La chaîne aléatoire déclenche WordPress pour vider le cache et générer un nouveau nonce pour l’utilisateur. @angus, cela devrait probablement être ajouté au code du plugin : wp-discourse/lib/sso-client/sso-client-base.php at main · discourse/wp-discourse · GitHub. Il n’y a aucun inconvénient, et je ne pense pas qu’il existe d’autre moyen de gérer le cache d’objets qui provoque l’utilisation de nonces obsolètes au lieu d’en générer de nouveaux pour chaque visite.

3 « J'aime »

Merci beaucoup pour votre réponse. Une fois que nous aurons lancé Discourse en production, nous essaierons de désactiver le cache Nging sur le site WordPress et si cela ne fonctionne pas, nous modifierons le functions.php conformément aux instructions.

Merci @simon !

Je ne comprends pas très bien pourquoi cela viderait le cache d’objets de WordPress, car généralement, ajouter une chaîne aléatoire à une URL est utilisé pour éviter le cache du navigateur. Quelle requête est mise en cache dans le cache d’objets de WordPress ? Je vois une raison non liée au cache d’objets pour laquelle cette approche pourrait fonctionner

Cependant, si c’est le cas, nous pourrions avoir besoin d’un ajustement légèrement différent. Mais peut-être que je manque quelque chose ?

Le problème ne vient pas du cache d’objets WordPress, car à ma connaissance, il n’est pas persistant entre les requêtes. Le problème survient avec les sites qui ont une forme de cache persistant : https://developer.wordpress.org/reference/classes/wp_object_cache/#persistent-caching. Cela peut être configuré via un plugin, mais il est également activé par défaut par certains fournisseurs d’hébergement, par exemple WP Engine. Je pense que dans le cas de WP Engine, ils n’activent pas le cache d’objets sur leur page de connexion, mais ils l’activent pour les utilisateurs anonymes sur toutes les autres pages. Donc, sur WP Engine, le problème n’est déclenché que si le lien “se connecter avec Discourse” est ajouté à une page autre que la page de connexion.

Le problème avec discourse_sso_url est que lorsqu’il est toujours défini sur la même valeur, pour les sites qui ont un cache persistant activé, il renverra toujours le même nonce. Définir sa valeur discourse_sso sur une chaîne aléatoire, au lieu de sa valeur par défaut de 1, casse le cache. Du moins, cela a toujours fonctionné ainsi lorsque je l’ai testé précédemment. Je n’ai pas la configuration nécessaire pour le tester actuellement.

Modification : il y a quelques détails supplémentaires sur le problème ici : Discourse (as provider) + WP SSO nonce error - #14 by simon. Cela fait un bon moment que je n’ai pas examiné cela. La solution au problème à l’époque semblait être à la fois d’ajouter une chaîne aléatoire à discourse_sso_url et de s’assurer que la mise en cache de la page n’était pas activée sur la page où le lien de connexion était affiché (sinon, la chaîne aléatoire ne serait pas unique pour chaque visite d’un utilisateur anonyme.)

Je vois. Merci pour l’explication.

Je pense que nous devrions peut-être y aller étape par étape, car je crains de pousser une correction ici sans être sûr qu’elle sera « pluraliste », c’est-à-dire qu’elle fonctionnera avec différentes approches de mise en cache.

Je ne suis pas encore tout à fait clair sur le rôle des différents caches dans la cause de ce problème spécifique, en particulier les rôles distincts des caches d’objets persistants et de pages (s’ils sont présents). Je peux comprendre pourquoi un cache de page pourrait causer ce problème, mais pas un cache d’objets persistants (pour l’instant). Si c’est ce dernier, nous pourrions vouloir ajuster les requêtes dans notre classe Nonce à la place.

Je devrai tester cela plus en profondeur la semaine prochaine.

@Petr_Mišák Pourriez-vous d’abord essayer de désactiver tout cache de page que vous avez sur la page avec le lien de connexion et nous faire savoir comment cela se passe ?

Je vais essayer de désactiver notre Nginx Microcache pour une page de connexion de test sur WordPress. Notre page de test où nous nous connectons à WordPress via Discourse se trouve ici Test Discourse Login | Svět Androida

J’ai (parfois) remarqué le problème si j’utilise la connexion Google pour me connecter.

Mais je suis surpris maintenant que les liens de connexion Discourse que nous avons mis sur la page en utilisant le shortcode ont disparu de notre page de test.

Quelqu’un a-t-il une idée pourquoi cela se produit ?

Jusqu’à ce que je résolve le problème avec la page de test de connexion, je n’ai pas de « nonce expiré » pour la tester.

Veuillez d’abord vérifier s’il n’y a pas un problème de mise en cache. Faites-nous savoir comment cela se passe.

Je comprends, nous allons résoudre cela étape par étape, je suis d’accord.

Il semble que l’erreur se produise également avec la connexion officielle. Voici un e-mail pour la simuler afin que vous puissiez l’essayer vous-même.

  1. allez sur la page Přihlásit se ‹ Svět Androida — WordPress
  2. connectez-vous en utilisant « Se connecter avec Discourse » et utilisez votre compte Google.
  3. après vous être connecté à Discourse, vous serez redirigé vers https://www.svetandroida.cz/ ou https://www.svetandroida.cz/wp-login.php avec un message d’erreur, voir la capture d’écran.

C’est mal testé car le problème ne se manifeste pas toujours.
Veuillez essayer et me faire savoir si vous obtenez l’erreur avant que je ne désactive le cache Nginx. Merci

1 « J'aime »

J’ai vérifié l’état de notre Nginx Microcache sur Přihlásit se ‹ Svět Androida — WordPress, mais il semble que Nginx Microcache ne soit pas du tout utilisé. Le problème avec le « nonce expiré » sera donc lié à autre chose.

1 « J'aime »

Salut @Petr_Mišák, juste pour savoir si vous avez réussi à trouver le coupable pour ça ?

Nous avons cherché mais jusqu’à présent, malheureusement, sans succès. Mais nous continuerons à chercher et à trouver la cause du problème.

Je suis à peu près sûr que le problème de connexion à https://www.svetandroida.cz/ via Discourse est lié à la mise en cache du nonce. La façon dont j’ai testé cela a été en cliquant sur le lien « Se connecter avec Discourse » (https://www.svetandroida.cz/?discourse_sso=1&redirect_to=https%3A%2F%2Fwww.svetandroida.cz%2F).

La première fois que je l’ai fait, j’ai été redirigé vers https://komunita.svetandroida.cz/, j’ai créé un compte sur le site Discourse avec Gmail, puis j’ai été redirigé vers votre site WordPress en tant qu’utilisateur connecté.

Ensuite, je me suis déconnecté de votre site WordPress et j’ai essayé de me reconnecter en cliquant à nouveau sur le lien « Se connecter avec Discourse ». Cette fois, j’ai reçu l’erreur « nonce expiré ».

J’ai ensuite généré un lien de connexion avec une valeur aléatoire pour le paramètre d’URL discourse_sso, par exemple https://www.svetandroida.cz/?discourse_sso=181253058&redirect_to=https%3A%2F%2Fwww.svetandroida.cz%2F et j’ai pu me connecter à votre site WordPress via Discourse sans aucun problème.

J’ai essayé cela plusieurs fois, à la fois avec le lien de connexion généré par le plugin (https://www.svetandroida.cz/?discourse_sso=1&redirect_to=https%3A%2F%2Fwww.svetandroida.cz%2F) et avec des liens de connexion ayant une valeur aléatoire définie pour le paramètre discourse_sso. Il semble que le nonce retourné soit mis en cache pendant au moins quelques minutes.

Sans déboguer entièrement le problème, je suis à peu près sûr que vous pouvez faire fonctionner les choses simplement en ajoutant ce qui suit au fichier functions.php de votre thème (cela définira une chaîne aléatoire pour le paramètre d’URL discourse_sso. Cela devrait fonctionner tant qu’il n’y a pas également de « mise en cache de page » activée sur votre page de connexion.)

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

Si vous souhaitez déboguer le problème, voici ce que je vois pour une requête réussie. Notez la ligne Cache-Svetzitrka: STALE. Cela pourrait indiquer qu’une couche de mise en cache personnalisée est en place et que le cache était STALE pour la requête réussie (donc un nouveau nonce a été généré.)

Résumé
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

Voici ce que je vois pour une requête échouée. La ligne Cache-Control: no-cache, no-store semble indiquer que la réponse ne devrait pas être mise en cache, mais l’entrée from service worker dans la réponse indique que la réponse pourrait provenir du cache d’un service worker.

Résumé
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 « J'aime »