DiscourseSSO 登录间歇性出现 nonce 过期问题

我们使用 DiscourseSSO,偶尔会出现用户登录问题(类似于 https://meta.discourse.org/t/sporadic-issue-wp-discourse-sso-nonce-has-already-expired/94353)。我试图通过添加一些额外的日志记录来调试这个问题,幸运的是,在几天后遇到了这个问题。需要明确的是,登录大多数时候都可以正常工作,只是偶尔(可能每天 5 分钟)用户会遇到登录问题。

我们在多节点集群上使用子文件夹设置,使用外部共享数据库和 Redis(如果这有影响的话)。有两种失败场景:

  1. Nonce 已过期
    当用户被重定向到 /session/sso_login 时,SessionController 无法在会话中获取 session_id,因此无法查找 nonce。我尝试记录会话(Rails.logger.warn("Verbose SSO log: Session #{session.keys.map {|key| [key, session[key]].join('=')}.join(',')}")),它打印了空的会话。我已验证浏览器正在发送上一个请求中收到的“_forum_session” cookie,并且在 SessionController 中记录日志时会记录该 cookie(Rails.logger.warn("Verbose SSO log: Cookies #{cookies.map {|cookie| cookie.join('=')}.join(',')}"))。

  2. 登录完成但用户在屏幕上看到登录错误
    当用户被重定向到 /session/sso_login 时,SessionController 能够验证 SSO 数据并登录用户(我在日志中看到 Verbose SSO log: User was logged on user5)。但当它将用户重定向到 /forums/latest 时,用户会在屏幕上看到一个错误。我注意到在工作流程中,此操作会清除/返回空的“cn” cookie,但在失败场景中,它只是更新并返回“_t” cookie。我猜这个场景也可能与缺少会话数据有关。

如果我们等待大约 5 分钟再次尝试,那么一切都会恢复正常。

我没有测试过访问该网站的所有用户是否都会遇到此问题,但有人告诉我,在我们实例上曾有多个用户遇到过此问题。

你好!

您使用什么来设置子文件夹?如果您在 Discourse 前面使用了某种 Web 应用程序防火墙,那么检查缓存问题可能值得一试。根据我们的经验,这是首先要排除的。

感谢您的回复,Leonardo。我们使用 nginx 作为主网关,它将基于路径的 URL 发送到 Discourse 容器内的 nginx。

我在 session_controller.rb/ssosession_controller.rb/sso_login 的开头添加了这两行:

    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

对于上面提到的第一个失败场景,我在多节点集群的 node1 上获得了以下关于 /sso 的信息:

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

以及在多节点集群的 node2 上关于 /sso_login 的以下信息:

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)是否执行了任何缓存?

在很短的时间内,所有用户都会遇到此问题。我最初猜测是中间节点篡改了数据,但当我从控制器(如上所述)记录 cookie 时,我能够看到 cookie。还有其他我应该检查的内容吗?

再次提及该主题。

3 个帖子已拆分为新主题:WordPress DiscourseConnect 客户端 - Nonce 过期

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