私も同じ問題が発生し、Googleでのログインでも発生します。WordPressの前にNginxをリバースプロキシとして使用していました。これに関連している可能性はありますか?
WordPressのDiscourseサイト経由でのログイン時に発生していると仮定します。その場合、問題はWordPressによって生成されたノンス(nonce)が期限切れになっていることです。これは、オブジェクトキャッシュが有効になっているWordPressサイトで発生します。
1つの解決策は、「Discourseでログイン」リンクがあるページでオブジェクトキャッシュを無効にすることです。このアプローチでは、匿名ユーザーに対してオブジェクトキャッシュが無効になっていることを確認してください。
別の解決策は、こちらで説明されています:Wordpress SSO Expired nonce - #15 by simon
この関数は、「Discourseでログイン」URLにランダムな文字列を追加します。ランダムな文字列は、WordPressにキャッシュを破棄させ、ユーザーのために新しいノンスを生成させます。@angusさん、これはおそらくプラグインのコードに追加すべきです:wp-discourse/lib/sso-client/sso-client-base.php at main · discourse/wp-discourse · GitHub
ご回答ありがとうございます。Discourse を本稼働させたら、WordPress サイトの Nging キャッシュを無効にしてみます。それでもうまくいかない場合は、指示に従って functions.php を編集します。
@simonさん、ありがとうございます!
URLにランダムな文字列を追加すると、通常はブラウザのキャッシュを回避するために使用されるため、これがWordPressのオブジェクトキャッシュをクリアする理由が少し不明です。WordPressのオブジェクトキャッシュでキャッシュされているクエリは何ですか?そのアプローチが機能する理由として、オブジェクトキャッシュ以外の理由が見られます。
ただし、その場合、少し異なる調整が必要になるかもしれません。しかし、何か見落としているでしょうか?
問題はWordPressのオブジェクトキャッシュにあるのではなく、私の知る限りではリクエスト間で永続化されません。問題は、永続的なキャッシュを持つサイトで発生します:https://developer.wordpress.org/reference/classes/wp_object_cache/#persistent-caching。これはプラグインで設定できますが、一部のホスティングプロバイダー(例:WP Engine)によってデフォルトで有効にもなっています。WP Engineの場合、ログインページではオブジェクトキャッシュを有効にしませんが、それ以外のすべてのページでは匿名ユーザーに対して有効にします。したがって、WP Engineでは、「Discourseでログイン」リンクがログインページ以外のページに追加された場合にのみ問題が発生します。
discourse_sso_urlの問題は、永続キャッシュが有効になっているサイトでは、常に同じ値に設定されていると、常に同じノンス(nonce)が返されることです。そのdiscourse_sso値をデフォルト値の1ではなくランダムな文字列に設定すると、キャッシュが壊れます。少なくとも、以前テストしたときは常にそのように機能していました。現時点ではテストできる環境がありません。
承知いたしました。説明ありがとうございます。
この修正を「複数」のもの、つまりさまざまなキャッシュアプローチで機能することが確実でない限り、ここで修正をプッシュすることには慎重なので、一歩ずつ進めるべきだと思います。
また、永続オブジェクトキャッシュとページキャッシュ(存在する場合)のさまざまなキャッシュの役割、特にこの特定の問題を引き起こす原因となっているキャッシュの役割についても、まだ少し不明瞭です。ページキャッシュがこの問題を引き起こす可能性は理解できますが、永続オブジェクトキャッシュ(現時点では)では理解できません。後者の場合、Nonce クラスのクエリを調整する必要があるかもしれません。
来週、もう少し詳しくテストする必要があります。
@Petr_Mišák ログインリンクのあるページでページキャッシュを無効にして、その結果をお知らせいただけますでしょうか?
WordPressサイトのテストログインページでNginx Microcacheを無効にしてみます。WordPressにログインするためのテストページはこちらです:Test Discourse Login | Svět Androida
(時折)Googleログインを使用してログインすると問題が発生することに気づきました。
しかし、現在、ショートコードを使用してページに配置したDiscourseログインリンクがテストページから消えていることに驚いています。
誰かこれが起こっている理由を知っていますか?
テストログインページの問題を解決するまで、「期限切れのnonce」がないためテストできません。
まず、キャッシュの問題がないことを確認してください。それでどうなったかお知らせください。
承知いたしました。段階的に解決していきましょう。同意します。
公式ログインでも同様のエラーが発生するようです。以下に、それを再現するためのメールを記載しますので、ご自身で試してみてください。
- ページ Přihlásit se ‹ Svět Androida — WordPress にアクセスします。
- 「Log in with Discourse」を使用してログインし、そこでGoogleアカウントを使用します。
- Discourseでログインした後、エラーメッセージが表示された状態で https://www.svetandroida.cz/ または https://www.svetandroida.cz/wp-login.php にリダイレクトされます。スクリーンショットを参照してください。
問題が常に発生するわけではないため、テストが不十分です。
Nginxキャッシュを無効にする前に、試してエラーが発生するかどうか教えていただけますでしょうか。ありがとうございます。
Nginx Microcache のステータスを Přihlásit se ‹ Svět Androida — WordPress で確認しましたが、Nginx Microcache はまったく使用されていないようです。「期限切れの nonce」の問題は、したがって、他の何かに起因する可能性があります。
@Petr_Mišák さん、この原因を突き止めることができましたか?
検索しましたが、残念ながら今のところ成功していません。しかし、原因を特定するために検索を続けます。
当社のNginx MicrocacheのステータスをPřihlásit se ‹ Svět Androida — WordPressで確認しましたが、Nginx Microcacheは全く使用されていないようです。
Discourse経由でSvětAndroida.cz - nejlepší recenze, novinky, testy a návody in with Discourse」リンク(https://www.svetandroida.cz/?discourse_sso=1&redirect_to=https%3A%2F%2Fwww.svetandroida.cz%2F)をクリックすることでした。
最初にそれをクリックしたとき、https://komunita.svetandroida.cz/にリダイレクトされ、GmailでDiscourseサイトにアカウントを作成し、その後、ログインユーザーとしてあなたのWordPressサイトにリダイレクトされました。
その後、あなたのWordPressサイトからログアウトし、「Login with Discourse」リンクを再度クリックしてログインしようとしました。今回は「expired nonce」エラーが発生しました。
その後、discourse_sso URLパラメータにランダムな値を設定したログインリンク(例:https://www.svetandroida.cz/?discourse_sso=181253058&redirect_to=https%3A%2F%2Fwww.svetandroida.cz%2F)を生成し、問題なくDiscourse経由であなたのWordPressサイトにログインできました。
この問題を何度か試しました。プラグインによって生成されるログインリンク(https://www.svetandroida.cz/?discourse_sso=1&redirect_to=https%3A%2F%2Fwww.svetandroida.cz%2F)と、discourse_ssoパラメータにランダムな値が設定されたログインリンクの両方で試しました。返されるnonceが少なくとも数分間キャッシュされているようです。
問題を完全にデバッグすることなく、テーマのfunctions.phpファイルに以下を追加するだけで動作するはずです(これにより、discourse_sso URLパラメータにランダムな文字列が設定されます。ログインページで「ページキャッシュ」が有効になっていない限り、これは機能するはずです)。
add_filter('wpdc_sso_client_query', 'wpdc_custom_sso_client_query' );
function wpdc_custom_sso_client_query() {
return wp_generate_password( 12, false );
}
問題をデバッグしたい場合は、成功したリクエストで私が確認しているのは以下の通りです。Cache-Svetzitrka: STALEという行に注意してください。これは、カスタムキャッシュレイヤーが配置されており、成功したリクエストではキャッシュがSTALE(古い)であったことを示している可能性があります(そのため、新しいnonceが生成されました)。
概要
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
失敗したリクエストで私が確認しているのは以下の通りです。Cache-Control: no-cache, no-storeという行は、レスポンスがキャッシュされるべきではないことを示しているようですが、「from service worker」というエントリは、レスポンスがサービスワーカーのキャッシュから来ている可能性があることを示しています。
概要
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%26sig%3D32ddcc85bd2dd7175f963e791cc9ac734a607355d773422d3abec6173c9f656b; 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



