# 使用Discourse的SSO登录

**URL:** https://meta.discourse.org/t/sso-login-with-discourse/234702
**Category:** SSO
**Created:** [2022年八月1日 16:51 UTC](https://meta.discourse.org/t/sso-login-with-discourse/234702 "2022-08-01T16:51:51Z")
**Posts on this page:** 8
**Page:** 1

<div class="post-metadata">

### Author: ![Suresh](https://avatars.discourse-cdn.com/v4/letter/s/aca169/32.png) [@Suresh](https://meta.discourse.org/u/Suresh)
#### Post date: [2022年八月1日 16:51 UTC](https://meta.discourse.org/t/sso-login-with-discourse/234702/1 "2022-08-01T16:51:51Z")

</div>

我已经阅读了 [Discourse Connect](https://meta.discourse.org/t/13045?silent=true) SSO 文章 ([Setup DiscourseConnect - Official Single-Sign-On for Discourse (sso)](https://meta.discourse.org/t/discourseconnect-official-single-sign-on-for-discourse-sso/13045))。

我的理解是，我们可以让 Discourse 使用我们的 API 来验证身份验证，并且还可以发送一些自定义参数。如果我错了，请纠正我。

我们想要的是，我们想使用自己的登录页面（当用户点击 discourse.open…com 上的登录时，我们的登录页面“kan.open..com”应该会打开）。登录成功后，它应该跳转到 Discourse 站点。我们看到像 Twitter 或 Atlassian 等网站也在这样做。您能否提供更多关于如何实现这一目标的详细信息？

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [2022年八月2日 21:51 UTC](https://meta.discourse.org/t/sso-login-with-discourse/234702/2 "2022-08-02T21:51:15Z")

</div>

> [@Suresh](#):
>
> 我的理解是，我们可以让 Discourse 使用我们的 API 来验证身份验证，并且还可以发送一些自定义参数。如果我错了，请纠正我。

这是正确的，如果“使用我们的 API”是指“我们将修改我们的 API 以支持 [Discourse Connect](https://meta.discourse.org/t/13045?silent=true)”。您如何做到这一点，其详细信息在您链接的文档中。如果您希望每个人都立即重定向，而不是在您的论坛上看到任何内容，您需要启用“需要登录”站点设置。

---

<div class="post-metadata">

### Author: ![suraj96100singh](https://avatars.discourse-cdn.com/v4/letter/s/22d042/32.png) [@suraj96100singh](https://meta.discourse.org/u/suraj96100singh)
#### Post date: [2024年十月1日 12:08 UTC](https://meta.discourse.org/t/sso-login-with-discourse/234702/3 "2024-10-01T12:08:44Z")

</div>

您好，Discourse 社区：

我有一个关于 [Discourse SSO](https://meta.discourse.org/t/13045?silent=true)（[DiscourseConnect](https://meta.discourse.org/t/13045?silent=true)）设置的问题。在 Discourse 调用 [DiscourseConnect](https://meta.discourse.org/t/13045?silent=true) URL 时，是否有办法在请求中包含其他参数？具体来说，我想将用户数据（例如用户令牌或用户 ID）传递到 [DiscourseConnect](https://meta.discourse.org/t/13045?silent=true) URL 的请求中，以便我可以使用这些数据进行身份验证并完成 SSO 登录过程。

我目前面临的挑战是，用户需要登录两次——一次登录到我的项目，另一次登录到 Discourse——当通过 SSO 连接时。理想情况下，我希望简化流程，以便如果用户已登录到我的项目，他们就不必在我的项目上使用相同的凭据再次登录。

Discourse 中是否有此功能的特性或任何最佳实践？我将不胜感激任何有关使 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: [2024年十月1日 17:39 UTC](https://meta.discourse.org/t/sso-login-with-discourse/234702/4 "2024-10-01T17:39:34Z")

</div>

> [@suraj96100singh](#):
>
> 我想简化这个流程，这样如果用户已经登录了我的项目，他们就不必用相同的凭据再次登录我的项目。

> [@suraj96100singh](#):
>
> Discourse 中是否有处理这种情况的功能或最佳实践？

处理这种情况的一种方法概述在此主题的“为已认证用户简化流程”部分：[Create a DiscourseConnect login link](https://meta.discourse.org/t/create-a-discourseconnect-login-link/109290#p-537064-making-the-process-seamless-for-authenticated-users-2%E3%80%82)

---

<div class="post-metadata">

### Author: ![suraj96100singh](https://avatars.discourse-cdn.com/v4/letter/s/22d042/32.png) [@suraj96100singh](https://meta.discourse.org/u/suraj96100singh)
#### Post date: [2024年十月2日 07:26 UTC](https://meta.discourse.org/t/sso-login-with-discourse/234702/5 "2024-10-02T07:26:19Z")

</div>

我第一次使用 Discourse 执行 SSO 登录时，我想知道是否有任何 API 或方法可以提供用户数据，例如用户 ID 或令牌，我可以将其发送到 Discourse API。作为回报，Discourse 会将该数据（如用户 ID 或令牌）包含在 [Discourse Connect](https://meta.discourse.org/t/13045?silent=true) URL 请求中。

---

<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: [2024年十月2日 17:24 UTC](https://meta.discourse.org/t/sso-login-with-discourse/234702/6 "2024-10-02T17:24:37Z")

</div>

> [@suraj96100singh](#):
>
> 我想知道是否有任何 API 或方法可以提供用户数据，例如用户 ID 或令牌，我可以将其发送到 Discourse API。

您可以使用您在 [DiscourseConnect](https://meta.discourse.org/t/13045?silent=true) 有效负载中设置的 `external_id` 向 Discourse 发出 API 请求。该请求将返回完整的用户对象。

> [@Finding a user by their identity provider 'external ID'](https://meta.discourse.org/t/finding-a-user-by-their-identity-provider-external-id/169723#discourseconnect-2):
>
> bookmark This guide explains how to find a Discourse user based on their external\_id from an identity provider using API calls. person_raising_hand Required user level: Administrator When using an external authentication system, Discourse keeps track of two user ids: the Discourse user\_id, and an external\_id from the identity provider. If you need to lookup a Discourse user based on the external\_id, this #howto article is for you! Below, you’ll learn how to perform this operation. API S…

---

<div class="post-metadata">

### Author: ![suraj96100singh](https://avatars.discourse-cdn.com/v4/letter/s/22d042/32.png) [@suraj96100singh](https://meta.discourse.org/u/suraj96100singh)
#### Post date: [2024年十月3日 06:48 UTC](https://meta.discourse.org/t/sso-login-with-discourse/234702/7 "2024-10-03T06:48:08Z")

</div>

您没有理解我想表达的意思。我不是在询问登录后从 Discourse 中检索用户详细信息。请理解我试图实现的完整流程，并告知我这是否可以通过 Discourse 实现，或者我是否应该继续采用自己的方法。

目前，我有一个使用 Laravel 框架构建的项目，我想让用户能够访问 Discourse 论坛以获取反馈。我已经决定为 Discourse 实现 SSO 登录。我创建了一个 Discourse 管理员帐户，并启用了必要的 SSO 登录设置，包括启用 SSO、设置重定向 URL 和配置密钥。

现在，我在我的项目中添加了一个“[Discourse Connect](https://meta.discourse.org/t/13045?silent=true)”按钮。我希望当用户点击此按钮时，他们可以使用我的凭据注册或登录，并自动登录到 Discourse。当用户点击“[Discourse Connect](https://meta.discourse.org/t/13045?silent=true)”按钮时，我会将他们重定向到我的基本社区 URL 和 session/sso 端点，然后该端点会重定向回我的 [Discourse Connect](https://meta.discourse.org/t/13045?silent=true) URL。我收到了 SSO 和 sig 参数的请求，我理解这些参数用于验证。但是，我需要 user\_id 或某个标识符来从我的数据库中检索用户数据，以便进行验证、身份验证并将用户登录到 Discourse。

我的问题是：Discourse 是否有任何 API 或机制可以在请求中返回 user\_id 以及 SSO 和 sig 参数？这一点很重要，因为如果不请求中检索用户数据，我就必须让用户再次登录，这将提供糟糕的用户体验。本质上，当用户登录到我的项目并点击“[Discourse Connect](https://meta.discourse.org/t/13045?silent=true)”按钮时，会触发 [Discourse Connect](https://meta.discourse.org/t/13045?silent=true) URL，我将收到 SSO 和 sig 参数。为了验证用户，我需要从数据库中获取用户数据，但这需要用户再次登录，而我想避免这种情况。

我想要一种无缝的体验，如果用户已经登录过一次，他们就不需要再次登录。他们应该能够直接使用他们的项目凭据访问 Discourse 论坛。

---

<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: [2024年十月3日 18:18 UTC](https://meta.discourse.org/t/sso-login-with-discourse/234702/8 "2024-10-03T18:18:11Z")

</div>

我不确定我是否理解问题出在哪里。

> [@suraj96100singh](#):
>
> 我有一个使用 Laravel 框架构建的项目，

您是否正在使用此库进行 [DiscourseConnect](https://meta.discourse.org/t/13045?silent=true)：[https://github.com/spinen/laravel-discourse-sso？](https://github.com/spinen/laravel-discourse-sso%EF%BC%9F)

查看该代码（[laravel-discourse-sso/src/Controllers/SsoController.php at develop · spinen/laravel-discourse-sso · GitHub](https://github.com/spinen/laravel-discourse-sso/blob/develop/src/Controllers/SsoController.php#L91-L115%EF%BC%89%EF%BC%8C%E6%88%91%E4%B8%8D%E6%B8%85%E6%A5%9A%E5%AE%83%E5%A6%82%E4%BD%95%E5%A4%84%E7%90%86%E5%B7%B2%E7%99%BB%E5%BD%95) Laravel 应用的用户的情况。
