简单的 proxy_set_header X-Forwarded-Proto https; 可以吗?
http/s 请求是从容器到 Discourse ID 在互联网上的 IDP 服务器。中间没有可以添加/更改任何请求头的实例。
依我之见,并假设“Discourse ID”只是标准的 OAuth,正确的方法是:
a) 为 Discourse ID 提供一个配置选项,我可以在其中添加一个“well-known”配置端点,其中包含所有必需的 OIDC 配置值,包括“https://… 前缀。
b) 相同,但已硬编码到代码中
我仍在研究 Discourse ID 的技术细节……
您可以在我们的代码中查找 Discourse ID 的详细信息,我们使用的协议都在我们的 Github 存储库中。与其他 OAuth 实现的唯一区别是我们会自动注册一个实例。在自动注册期间,我们会确保请求注册的实例与其声称的身份一致,并且使用 https(如今,不应有 Discourse 实例使用 http://)。
我上面分享的 http 错误表明您的站点配置不正确。
您可以通过控制台检查以下命令的输出:
Discourse.base_url
SiteSetting.force_https
如果第一个命令返回 http:// URL,第二个命令返回 false,您可能需要设置 SiteSetting.force_https = true 并查看这是否能解决问题。(但如果其他地方的配置不正确,也可能导致问题。请注意。)
您好 Penar,
也许我们应该先澄清我的设置细节。它与标准部署略有不同。
- 中央负载均衡器 (https://www.haproxy.org/) 作为 SSL 加速器,用于处理多个不同的 Web 服务(不仅仅是 Discourse)。从 Internet 访问这些服务只允许通过 HTTPS。HTTP 到 HTTPS 的切换在负载均衡器本身完成,请参阅 Redirect HTTP to HTTPS in a Few Easy Steps with HAProxy 获取参考。
- haproxy 将前端请求转发到私有网络 (10.x.x.x) 上的后端,无加密。此流量在 Docker 主机上的本地 nginx 处终止。
- nginx 使用
proxy_pass ``http://unix``:/mnt/data/discourse/shared/web-only/nginx.http.sock将请求转发到web_only容器的 HTTP 套接字。
(我使用的是web_only.yml和data.yml的双容器设置)。请参阅 templates/web.socketed.template.yml 获取参考。
我不需要 SiteSetting.force_https,因为所有的 HTTPS 加密都在 Discourse 容器 外部 完成。我已经使用了基于 Discourse OpenID Connect (OIDC) 插件和我的 IDP 的 OAuth。Discourse OIDC 插件包含一个用于“well-known” OpenID Connect discovery document 的设置。在我的例子中是:https://login.netzwissen.de/realms/netzwissen/.well-known/openid-configuration
如果 Discourse ID 在 Discourse 容器实例和 Discourse ID IDP 之间的链接中实现类似的功能,就不会有问题。“Discourse ID”使用固定的 IDP,因此这样的“well-known URL”甚至可以硬编码,包括 HTTPS 前缀。
托马斯,抱歉,我无法真正帮助你解决你的特定设置问题。我只能说你的实例中有些东西不正确。
嗯,你网站上的JS控制台并不认为容器外部的https加密覆盖了所有内容。我上面分享的那些JS警告是你与ID遇到的类似问题的症状,你的设置中的Discourse本身认为它运行在http下,这是一个问题,因为它在某些情况下会生成http格式的URL。
非常抱歉,非常非常抱歉:
我比较了我们生产实例(PROD)和开发实例(DEV)的设置。只有开发实例禁用了 force_https 设置。之所以能正常工作,是因为我们有 SSL haproxy SSL 加速器在前面。
我现在在开发实例中启用了 SiteSetting.force_http,Discourse ID 运行正常。因此,我也会在我们的生产实例(forum.netzwissen.de)上部署 Discourse ID。
抱歉造成混淆。
没关系,很高兴问题已解决。感谢您的跟进!