Sporadic DiscourseSSO ログイン問題、nonce期限切れ

DiscourseSSO を使用しており、時折ユーザーがログインの問題に遭遇します(Sporadic issue wp-discourse/SSO: Nonce has already expired に類似)。追加のロギングを追加してデバッグしようとしたところ、数日後に問題が発生しました。はっきりさせておくと、ログインはほとんどの場合機能しますが、時折(1日あたり約5分間)ユーザーがログインの問題に遭遇します。

マルチノードクラスターでサブフォルダー設定を使用しており、外部共有DBとRedisを使用しています(これが違いを生むなら)。失敗するシナリオは2つあります。

  1. ノンス(nonce)の有効期限切れ
    ユーザーが /session/sso_login にリダイレクトされると、SessionController はセッションで session_id を取得できず、ノンスを検索できません。セッションをログに記録しようとしました(Rails.logger.warn("Verbose SSO log: Session #{session.keys.map {|key| [key, session[key]].join('=')}.join(',')}"))。空のセッションが出力されました。ブラウザが前のリクエストで受信した「_forum_session」Cookieを送信しており、SessionController でのロギング(Rails.logger.warn("Verbose SSO log: Cookies #{cookies.map {|cookie| cookie.join('=')}.join(',')}"))でCookieがログに記録されていることを確認しました。

  2. ログインは完了するが、ユーザーは画面にログインエラーが表示される
    ユーザーが /session/sso_login にリダイレクトされると、SessionController は SSO データを検証し、ユーザーをログインさせることができます(ログに Verbose SSO log: User was logged on user5 と表示されます)。しかし、ユーザーを /forums/latest にリダイレクトすると、画面にエラーが表示されます。正常なフローではこのアクションが「cn」Cookie をクリア/空にするが、失敗したシナリオでは「_t」Cookie を更新して返すだけであることに気づきました。このシナリオもセッションデータの欠落に関連している可能性があります。

約5分待ってから再試行すると、すべて正常に機能するようになります。

サイトにアクセスしているすべてのユーザーが問題に遭遇するかどうかはテストしていませんが、あるインスタンスで複数のユーザーが問題に遭遇したと伝えられています。

こんにちは!

サブフォルダの設定には何を使用していますか? Discourse の前に Web アプリケーション ファイアウォールを配置している場合は、キャッシュの問題を確認する価値があるかもしれません。私たちの経験では、それが最初に除外すべきことです。

レオナルドさん、ご返信ありがとうございます。当社のメインゲートウェイとしてnginxを使用しており、パスベースのURLをDiscourseコンテナ内のnginxに送信しています。

session_controller.rb/ssosession_controller.rb/sso_login の先頭に、これらの2行を追加しました。

    if SiteSetting.verbose_discourse_connect_logging
      Rails.logger.warn("Verbose SSO log: Cookies #{cookies.map {|cookie| cookie.join('=')}.join(',')}")
      Rails.logger.warn("Verbose SSO log: Session #{session.keys.map {|key| [key, session[key]].join('=')}.join(',')}")
    end

上記で言及した最初の障害シナリオについて、/sso(マルチノードクラスタのノード1)では以下のようになりました。

Verbose SSO log: Cookies cn=12,_forum_session=ZjBveGorRVN1bU0zeGRKVHZtWUZDamUxTUJSUkJHUDZDaHhLMkh3U0lXMlpCYS9PTnpJWEovcTlZVDFTSTJuNkVNUE9NdlNvVWlidStIdk9SeTlRYzZ5YVp0N0pXdmhnTldlaSt4d1o3TC9mUm1nSUhsOUtiWFRyVGZBYkJLRHRRR0lFZmM0RkVxLzl0V2JEODR4NGMxQUJvOGhيتVc0c2JsdDFESHo2TWxJPS0tRXZTL0FHZlM1Yy9QVWJkc2xaaTYvUT09--36fa626c698a401db1e7f13276ee6bfde16dea77,sessid=6b4afa7755dc9aa54e3fb16453a28324,<ADDITIONAL_COOKIES_REDACTED>
Verbose SSO log: Session
Verbose SSO log: Setting nonce 8199453c67e347124ecb2e57e5738336 with key SSO_NONCE_8199453c67e347124ecb2e57e5738336

/sso_login(マルチノードクラスタのノード2)では以下のようになりました。

Verbose SSO log: Cookies cn=12,_forum_session=WFRkNThYYUZwUnlOQjF5VHdUZGRUWE1UNUx2a3Z5ZlJCOGl0VFRRUlF2bm5vQUQzMWdaUVZVUnJkNmdIUjlRTE52d1B5MXJnV0svWkJMRWZrOU5XellvV0IzMTBScERwM0lzT3VIUWc2SEppb2xpTlkxaFpuc1dvU2d4SkdZRXFYYjJzakRQTXFmS2lYTlhxVEd5Zi9nQ3dZQnVUR1pDSndScGZhcVNJOW1ZPS0tNFduSE1YRDk5cWdMRXNsWnBzbDVhZz09--00ab1b89ff4cf05c9f3f3ed71eec9c0c4557f032,sessid=6b4afa7755dc9aa54e3fb16453a28324,<ADDITIONAL_COOKIES_REDACTED>
Verbose SSO log: Session
Verbose SSO log: Checking nonce 8199453c67e347124ecb2e57e5738336 with key SSO_NONCE_8199453c67e347124ecb2e57e5738336
Verbose SSO log: Nonce is incorrect, was generated in a different browser session, or has expired

Redisサーバーでは、nonceキーが表示されています。

redis:6379[3]> KEYS "*NONCE*"
1) "default:3aa05452fdd8fd4a93481eb8afa90f3aSSO_NONCE_8199453c67e347124ecb2e57e5738336"
2) "default:21639ca4bef85f68c1d72824e3a49bd6SSO_NONCE_7d54c965762e6861799f62ef7c5cfa60"
3) "default:_CACHE:USED_SSO_NONCE_86886a948684ff110d4830919d4e6de5"
4) "default:_CACHE:USED_SSO_NONCE_d04fdbf483fe61129a6fcc54087cb4e4"
5) "default:f7c87c11539908b30f9e307ef05d3f18SSO_NONCE_90a6a6997b7bd5d75eac1ac0cfc6dee2"

/sso_loginSession が空白になっていることが懸念事項です。

トピックをピン留めします。何か提案があればお願いします。

そのサイトは公開されていますか?オンラインでデバッグできると助かります。

「いいね!」 2

はい、そうです。住所はプライベートメッセージでお送りします。

更新:プライベートメッセージで送信しました

「いいね!」 1

ログインはすべてのユーザーで同時に壊れますか?それともユーザーごとに異なる時間に発生しますか?

しばらくすると再び機能し始めるという事実は、キャッシュが関係しているのではないかと思わせます。NGINXの設定、またはその他の仲介プロキシ(例:Cloudflare)でキャッシュは行われていますか?

それは短い時間ですが、すべてのユーザーで動作しなくなります。最初は中間ノードがデータを改変しているのではないかと思いましたが、コントローラーからクッキーを記録したところ(上記で説明したように)、クッキーを確認できました。他に確認すべきことはありますか?

トピックを再度ピン留めします。

3件の投稿が新しいトピックに分割されました: WordPress DiscourseConnect client - expired nonce

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.