OAuth SSO 自动会话管理

您好,

我们正在为一个特定的封闭社区运行一系列服务,并决定将 Discourse 作为社交平台。我想知道在技术层面上,将 Discourse 实例无缝集成到我们的服务套件中的最佳且最优雅的方式是什么。

举个例子,我们的套件包括服务 A 和服务 B(均为内部构建),以及一个 OAuth2 SSO 服务。

如果用户点击服务 A 或服务 B 中的登录按钮,他们会被重定向到 SSO 服务进行登录,然后按常规方式重定向回来。然而,借助 Cookie 和会话控制,如果用户在登录服务 A 后访问服务 B,则无需再次登录(因为他们已经拥有会话)。

同样,我们希望提供一种方式,让用户在通过 SSO 服务登录后,能够无缝地从服务 A 或服务 B 跳转到 Discourse 服务。假设所有服务中都已存在该用户的记录。目前,我们已评估过 OAuth2 Discourse 插件,它能与我们的 SSO 服务配合使用,但用户访问 Discourse 时仍需再次点击“使用 SSO 登录”。是否存在某种方法(例如通过 API 调用),在用户通过服务 A 或服务 B 的通用 SSO 登录时,自动在 Discourse 中启动会话?

此外,上述问题也延伸至通过嵌入组件进行的评论集成。如果 Discourse 服务是公开的,评论部分没有问题,评论也能正确嵌入。但如果运行的是私有 Discourse 服务,若用户未事先登录 Discourse,嵌入的评论窗口将无法正确显示评论,这在追求无缝集成时是个问题。

是否有办法解决这些问题?我在考虑构建一个中间件插件,用于解码令牌或 Cookie,并在发起实际调用之前即时认证并登录相应用户。是否存在现成的插件可以实现这一功能?

感谢您的支持。

您只需启用“需要登录”站点设置即可实现此功能。

启用“需要登录”站点设置也能解决此问题。

感谢您的快速回复。然而,这并未解决问题。无论是在嵌入式 Discourse 评论窗口中,还是访问 Discourse 网站时,用户(已通过 SSO 登录到“服务 A”)都需要重新登录。

在这两种情况下,我都会看到一条欢迎消息:“欢迎,需要账户。请向现有成员索取邀请,或登录以继续。”以及登录按钮。点击该按钮后,会弹出登录窗口,提示通过用户名/密码或 OAuth SSO 进行登录。由于 SSO 会话仍然有效,因此无需再次输入 SSO 的用户名和密码,但我不希望用户经历这一过程。当用户登录到“服务 A”时,应自动登录到 Discourse,而无需再次点击“登录”按钮。

我们需要怎么做才能实现这一目标?
我使用的是 Discourse 2.5.2 版本,如果这有关联的话。

在最新版本的 Discourse 中,只要同时启用了“需要登录”和“立即认证”,并且用户在身份提供商处已拥有有效的 Cookie,系统就会自动将该用户登录到 Discourse。

在早期版本中,这种“神奇”的登录流程仅限于使用我们自有 SSO 协议的站点,相关说明请参阅 Discourse 官方单点登录 (sso)

建议您升级到最新版本。

嗯,我正在使用 Bitnami 镜像,而他们的最新版本仍然是 2.5.2,所以我可能得再等一段时间(或者想办法手动更新,或者使用其他镜像)。

无论如何,感谢您为我指明正确的方向,非常感激!

请注意,bitnami 镜像不受 Discourse 开发人员支持,且多年来与软件的常规用法存在诸多不兼容之处。我强烈建议使用 Discourse 官方标准安装