# TownNews CMS 的单点登录 (SSO)

**URL:** <https://meta.discourse.org/t/sso-with-townnews-cms/144735>\
**Category:** SSO\
**Created:** [2020年三月18日 16:46 UTC](https://meta.discourse.org/t/sso-with-townnews-cms/144735 "2020-03-18T16:46:28Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![Michael\_Greathouse](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/michael_greathouse/32/173162_2.png) [@Michael\_Greathouse](https://meta.discourse.org/u/Michael_Greathouse)\
**Post date:** [2020年三月18日 16:46 UTC](https://meta.discourse.org/t/sso-with-townnews-cms/144735/1 "2020-03-18T16:46:28Z")

</div>

有人为 Townnews 网站配置过单点登录（SSO）吗？

---

<div class="post-metadata">

**Author:** ![simon](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/simon/32/339122_2.png) [@simon](https://meta.discourse.org/u/simon)\
**Post date:** [2020年三月18日 17:25 UTC](https://meta.discourse.org/t/sso-with-townnews-cms/144735/2 "2020-03-18T17:25:10Z")

</div>

据我所知，没有任何网站在使用 Townnews 或 [BLOX CMS](https://townnews.com/solutions/products/blox-cms/article_0408a2f8-6d09-11e5-bc41-27a032fadd13.html) 时集成了 [Discourse SSO](https://meta.discourse.org/t/13045?silent=true)。您是否知道是否有可能向使用该服务的网站添加代码？如果能够将 [Discourse SSO](https://meta.discourse.org/t/13045?silent=true) 代码添加到该网站，则有可能将其用作 Discourse 的 SSO 提供商。

---

<div class="post-metadata">

**Author:** ![Michael\_Greathouse](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/michael_greathouse/32/173162_2.png) [@Michael\_Greathouse](https://meta.discourse.org/u/Michael_Greathouse)\
**Post date:** [2020年三月18日 17:59 UTC](https://meta.discourse.org/t/sso-with-townnews-cms/144735/3 "2020-03-18T17:59:46Z")

</div>

抱歉，我是个新手，但我指的是使用 townnews 作为单点登录（SSO）源。我需要在网站上添加什么代码？

---

<div class="post-metadata">

**Author:** ![simon](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/simon/32/339122_2.png) [@simon](https://meta.discourse.org/u/simon)\
**Post date:** [2020年三月18日 18:14 UTC](https://meta.discourse.org/t/sso-with-townnews-cms/144735/4 "2020-03-18T18:14:46Z")

</div>

> [@Michael\_Greathouse](#):
>
> 我指的是使用 Townnews 作为 SSO 来源。

这意味着 Townnews 将作为您 Discourse 网站的 SSO 提供商。要使用 Discourse 的 SSO 实现，您需要能够在充当 SSO 提供商的服务中添加代码。该代码需要与该服务的登录流程挂钩。有关需要添加的代码的详细信息，请参见此处：[Discourse 官方单点登录 (SSO)](https://meta.discourse.org/t/official-single-sign-on-for-discourse-sso/13045)。

要查看可运行的代码示例，请查看我们的 WordPress 插件如何实现 SSO：[https://github.com/discourse/wp-discourse/tree/master/lib/sso-provider。](https://github.com/discourse/wp-discourse/tree/master/lib/sso-provider%E3%80%82)

此外，也可能通过 OAuth2 使用 Townnews 将用户登录到 Discourse。如果 Townnews 能够充当 OAuth2 提供商，则这是可行的。有关在 Discourse 中设置 OAuth2 登录的详细信息，请参见此处：[OAuth2 基本支持](https://meta.discourse.org/t/oauth2-basic-support/33879)。在投入过多时间之前，最好先确认 Townnews 是否能够充当 OAuth2 提供商。这应该可以通过查阅其文档来确认。

---

<div class="post-metadata">

**Author:** ![Michael\_Greathouse](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/michael_greathouse/32/173162_2.png) [@Michael\_Greathouse](https://meta.discourse.org/u/Michael_Greathouse)\
**Post date:** [2020年三月18日 18:56 UTC](https://meta.discourse.org/t/sso-with-townnews-cms/144735/5 "2020-03-18T18:56:11Z")

</div>

我正在尝试与我的网站提供商沟通，但我认为分享这些信息给您，看看是否有能帮到我的内容，是有价值的。感谢您抽出时间。

* * *

### 重定向到提供商端点

每个 BLOX-CMS 站点都在同一个保留 URL 上提供联合身份验证端点：

`https://www.example.com/tncms/auth/federated/`

消费者站点通过重定向用户的浏览器到此 URL 来启动身份验证。该端点需要一个参数 `return`，其值必须设置为消费者站点端点的 URL。

示例 URL：

`https://www.example.com/tncms/auth/federated/?return=http://vendor.com/login/`

该端点还接受其他参数：

- _ **source** ：_ 如果需要进行用户身份验证，此参数及其值将被传递到站点的登录 URL。模板可以根据此值自定义登录表单的界面。如果未指定，默认值为“federated”。

- _ **reauth** ：_ 设置为真值（truthy value）可强制显示登录页面，无论用户当前的登录状态如何。

### 重定向到消费者端点

消费者站点的端点 URL 在用户最初被重定向到提供商端点时，通过 `return` 参数提供给提供商。在成功通过提供商站点进行身份验证后，用户将被重定向到此 URL，并附带一个 `code` 参数。`code` 的值需要在随后的即时网络服务调用中交换为用户的账户详细信息，如下所述。

消费者的端点 URL 可以包含其自己的查询参数。`code` 参数将与其合并，而不会覆盖其他值。

根据提供商站点模板的编写方式，用户可能在没有 `code` 值的情况下到达消费者端点。在这种情况下，应将该用户视为取消了身份验证流程。

成功登录后的响应示例（基于前面的示例）：

`http://vendor.com/login/?code={code}`

其中 _{code}_ 是用于后续网络服务的唯一标识符。

### 后续网络服务调用

当用户携带有效的 `code` 到达消费者端点时，消费者站点应立即向提供商站点发出网络服务调用，以交换用户的账户信息。

消费者站点将访问用户模块的 `get` 操作，并传递由提供商提供的 `code` 参数：

`https://www.example.com/tncms/webservice/v1/user/get/?code={code}`

响应将是一个包含用户账户数据的数据对象，具体格式如网络服务文档所述。如果 `code` 无效，将返回 null 响应。

`code` 只能使用一次。在用于检索用户账户后，该 `code` 将立即失效，后续使用它的请求将返回 null 响应。

---

<div class="post-metadata">

**Author:** ![simon](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/simon/32/339122_2.png) [@simon](https://meta.discourse.org/u/simon)\
**Post date:** [2020年三月18日 20:23 UTC](https://meta.discourse.org/t/sso-with-townnews-cms/144735/6 "2020-03-18T20:23:54Z")

</div>

这看起来很有希望：[https://help.bloxcms.com/knowledge-base/applications/settings/users/authentication\_provider/article\_fa0ce6ec-9824-11e4-b296-23bd78ef308a.html：](https://help.bloxcms.com/knowledge-base/applications/settings/users/authentication_provider/article_fa0ce6ec-9824-11e4-b296-23bd78ef308a.html%EF%BC%9A)

> **认证提供商** 选项允许您的网站作为 OpenID 认证提供商。这意味着您网站的用户可以通过其在该网站的凭据登录其他允许此操作的网站。其他 BLOX CMS 网站可以作为客户端站点，允许这种登录凭据的交换。

应该可以配置一个 BLOX CMS 站点，使其作为 Discourse 的 OpenID 认证提供商。如果可行，这意味着用户可以通过您的 TownNews 网站登录到您的 Discourse 论坛。要设置此功能，您需要在 Discourse 站点上安装 [https://meta.discourse.org/t/openid-connect-authentication-plugin/103632。配置过程可能需要进行一些尝试和调整。如果您遇到任何问题，请告诉我们，我们将尽力提供帮助。](https://meta.discourse.org/t/openid-connect-authentication-plugin/103632%E3%80%82%E9%85%8D%E7%BD%AE%E8%BF%87%E7%A8%8B%E5%8F%AF%E8%83%BD%E9%9C%80%E8%A6%81%E8%BF%9B%E8%A1%8C%E4%B8%80%E4%BA%9B%E5%B0%9D%E8%AF%95%E5%92%8C%E8%B0%83%E6%95%B4%E3%80%82%E5%A6%82%E6%9E%9C%E6%82%A8%E9%81%87%E5%88%B0%E4%BB%BB%E4%BD%95%E9%97%AE%E9%A2%98%EF%BC%8C%E8%AF%B7%E5%91%8A%E8%AF%89%E6%88%91%E4%BB%AC%EF%BC%8C%E6%88%91%E4%BB%AC%E5%B0%86%E5%B0%BD%E5%8A%9B%E6%8F%90%E4%BE%9B%E5%B8%AE%E5%8A%A9%E3%80%82)

---

<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:** [2024年三月16日 18:36 UTC](https://meta.discourse.org/t/sso-with-townnews-cms/144735/8 "2024-03-16T18:36:32Z")

</div>


