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

**URL:** <https://meta.discourse.org/t/sporadic-discoursesso-login-issues-with-expired-nonce/224441>\
**Category:** SSO\
**Created:** [2022年四月15日 21:01 UTC](https://meta.discourse.org/t/sporadic-discoursesso-login-issues-with-expired-nonce/224441 "2022-04-15T21:01:48Z")\
**Posts on this page:** 11\
**Page:** 1

<div class="post-metadata">

**Author:** ![aarsaa](https://avatars.discourse-cdn.com/v4/letter/a/977dab/32.png) [@aarsaa](https://meta.discourse.org/u/aarsaa)\
**Post date:** [2022年四月15日 21:01 UTC](https://meta.discourse.org/t/sporadic-discoursesso-login-issues-with-expired-nonce/224441/1 "2022-04-15T21:01:48Z")

</div>

我们使用 DiscourseSSO，偶尔会出现用户登录问题（类似于 [https://meta.discourse.org/t/sporadic-issue-wp-discourse-sso-nonce-has-already-expired/94353）。我试图通过添加一些额外的日志记录来调试这个问题，幸运的是，在几天后遇到了这个问题。需要明确的是，登录大多数时候都可以正常工作，只是偶尔（可能每天](https://meta.discourse.org/t/sporadic-issue-wp-discourse-sso-nonce-has-already-expired/94353%EF%BC%89%E3%80%82%E6%88%91%E8%AF%95%E5%9B%BE%E9%80%9A%E8%BF%87%E6%B7%BB%E5%8A%A0%E4%B8%80%E4%BA%9B%E9%A2%9D%E5%A4%96%E7%9A%84%E6%97%A5%E5%BF%97%E8%AE%B0%E5%BD%95%E6%9D%A5%E8%B0%83%E8%AF%95%E8%BF%99%E4%B8%AA%E9%97%AE%E9%A2%98%EF%BC%8C%E5%B9%B8%E8%BF%90%E7%9A%84%E6%98%AF%EF%BC%8C%E5%9C%A8%E5%87%A0%E5%A4%A9%E5%90%8E%E9%81%87%E5%88%B0%E4%BA%86%E8%BF%99%E4%B8%AA%E9%97%AE%E9%A2%98%E3%80%82%E9%9C%80%E8%A6%81%E6%98%8E%E7%A1%AE%E7%9A%84%E6%98%AF%EF%BC%8C%E7%99%BB%E5%BD%95%E5%A4%A7%E5%A4%9A%E6%95%B0%E6%97%B6%E5%80%99%E9%83%BD%E5%8F%AF%E4%BB%A5%E6%AD%A3%E5%B8%B8%E5%B7%A5%E4%BD%9C%EF%BC%8C%E5%8F%AA%E6%98%AF%E5%81%B6%E5%B0%94%EF%BC%88%E5%8F%AF%E8%83%BD%E6%AF%8F%E5%A4%A9) 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 分钟再次尝试，那么一切都会恢复正常。

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

---

<div class="post-metadata">

**Author:** ![leonardo](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/leonardo/32/228634_2.png) [@leonardo](https://meta.discourse.org/u/leonardo)\
**Post date:** [2022年四月19日 23:40 UTC](https://meta.discourse.org/t/sporadic-discoursesso-login-issues-with-expired-nonce/224441/2 "2022-04-19T23:40:19Z")

</div>

你好！

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

---

<div class="post-metadata">

**Author:** ![aarsaa](https://avatars.discourse-cdn.com/v4/letter/a/977dab/32.png) [@aarsaa](https://meta.discourse.org/u/aarsaa)\
**Post date:** [2022年四月20日 14:44 UTC](https://meta.discourse.org/t/sporadic-discoursesso-login-issues-with-expired-nonce/224441/3 "2022-04-20T14:44:43Z")

</div>

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

我在 `session_controller.rb/sso` 和 `session_controller.rb/sso_login` 的开头添加了这两行：

```plaintext
    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` 的信息：

```plaintext
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` 的以下信息：

```plaintext
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 键：

```plaintext
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_login` 的 _Session_ 为空。

---

<div class="post-metadata">

**Author:** ![aarsaa](https://avatars.discourse-cdn.com/v4/letter/a/977dab/32.png) [@aarsaa](https://meta.discourse.org/u/aarsaa)\
**Post date:** [2022年五月11日 20:53 UTC](https://meta.discourse.org/t/sporadic-discoursesso-login-issues-with-expired-nonce/224441/4 "2022-05-11T20:53:16Z")

</div>

正在跟进该主题，如果您有任何建议，请告知。

---

<div class="post-metadata">

**Author:** ![leonardo](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/leonardo/32/228634_2.png) [@leonardo](https://meta.discourse.org/u/leonardo)\
**Post date:** [2022年五月16日 15:28 UTC](https://meta.discourse.org/t/sporadic-discoursesso-login-issues-with-expired-nonce/224441/5 "2022-05-16T15:28:36Z")

</div>

请问该网站是公开的吗？如果能在网上调试它，将对我们有所帮助。

---

<div class="post-metadata">

**Author:** ![aarsaa](https://avatars.discourse-cdn.com/v4/letter/a/977dab/32.png) [@aarsaa](https://meta.discourse.org/u/aarsaa)\
**Post date:** [2022年五月16日 17:57 UTC](https://meta.discourse.org/t/sporadic-discoursesso-login-issues-with-expired-nonce/224441/6 "2022-05-16T17:57:04Z")

</div>

是的，我会通过私信发送地址。

更新：已通过私信发送

---

<div class="post-metadata">

**Author:** ![david](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/david/32/157490_2.png) [@david](https://meta.discourse.org/u/david)\
**Post date:** [2022年五月16日 19:09 UTC](https://meta.discourse.org/t/sporadic-discoursesso-login-issues-with-expired-nonce/224441/8 "2022-05-16T19:09:18Z")

</div>

> [@aarsaa](#):
>
> 如果我们等待大约 5 分钟或更长时间然后重试，那么一切都会恢复正常

登录是同时对所有用户中断吗？还是对每个用户在不同时间发生？

它在一段时间后开始恢复正常，这让我怀疑是否有缓存。您的 NGINX 配置或任何其他中间代理（例如 Cloudflare）是否执行了任何缓存？

---

<div class="post-metadata">

**Author:** ![aarsaa](https://avatars.discourse-cdn.com/v4/letter/a/977dab/32.png) [@aarsaa](https://meta.discourse.org/u/aarsaa)\
**Post date:** [2022年五月16日 19:22 UTC](https://meta.discourse.org/t/sporadic-discoursesso-login-issues-with-expired-nonce/224441/10 "2022-05-16T19:22:09Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![aarsaa](https://avatars.discourse-cdn.com/v4/letter/a/977dab/32.png) [@aarsaa](https://meta.discourse.org/u/aarsaa)\
**Post date:** [2022年五月31日 15:20 UTC](https://meta.discourse.org/t/sporadic-discoursesso-login-issues-with-expired-nonce/224441/11 "2022-05-31T15:20:41Z")

</div>

再次提及该主题。

---

<div class="post-metadata">

**Author:** ![HAWK](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/hawk/32/86627_2.png) [@HAWK](https://meta.discourse.org/u/HAWK)\
**Post date:** [2023年十一月13日 23:21 UTC](https://meta.discourse.org/t/sporadic-discoursesso-login-issues-with-expired-nonce/224441/12 "2023-11-13T23:21:33Z")

</div>

3 个帖子已拆分为新主题：[WordPress DiscourseConnect 客户端 - Nonce 过期](https://meta.discourse.org/t/wordpress-discourseconnect-client-expired-nonce/285374)

---

<div class="post-metadata">

**Author:** ![system](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/system/32/443519_2.png) [@system](https://meta.discourse.org/u/system)\
**Post date:** [2023年十二月13日 23:22 UTC](https://meta.discourse.org/t/sporadic-discoursesso-login-issues-with-expired-nonce/224441/13 "2023-12-13T23:22:22Z")

</div>

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