尝试通过HTTPS传递swagger.json时出现“未提供规范”错误

7hiiyaii  于 2022-11-06  发布在  其他
关注(0)|答案(4)|浏览(176)

如果我尝试使用Flask RestPlus通过HTTPS提供Swagger UI,我在根URL处只看到“No spec provided”错误消息,并且完全的Swagger UI不会加载。但是,如果我访问API端点,它们会按预期返回响应。
查看错误页面的源代码HTML,我注意到swagger.json是从http://myhost/而不是https://myhost/获取的
我在the restplus Github issues上发现了完全相同的问题
我已经用那个页面上提到的monkey-patch暂时修复了我的问题。Swagger UI加载了,查看HTML源代码,我发现swagger.json确实是从https://myhost中提取的。
为什么会发生这种情况,我怎么能在没有猴子补丁的情况下修复它?
HTTPS是由Cloudflare的“灵活”HTTPS服务提供的。
我的应用程序是Nginx背后的配置,因此,并没有造成任何问题,据我所知:

...
http {
  ...
  server {
    location / {
      charset UTF-8;
      try_files $uri @proxy_to_app;
    }
    location @proxy_to_app {
      charset UTF-8;
      proxy_intercept_errors on;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_set_header Host $http_host;
      proxy_redirect off;
      proxy_pass http://127.0.0.1:5000;
    }
  }
}
wlsrxk51

wlsrxk511#

我已经使用下面的工作。你可以在下面的链接查看稳定的例子。
http://flask-restplus.readthedocs.io/en/stable/example.html

from werkzeug.contrib.fixers import ProxyFix
app = Flask(__name__)
app.wsgi_app = ProxyFix(app.wsgi_app)
mpbci0fu

mpbci0fu2#

我不确定这是完全安全的,但这里是我如何在Nginx修复它:

sub_filter "http://$host/" "https://$host/";
sub_filter_once off;
proxy_redirect    off;

我在Nginx上卸载SSL,这对我来说没有任何问题。它还消除了对猴子补丁应用程序代码的需要。
您在flak-restplus问题中列出的方法绝对被认为是不安全的:

Please keep in mind that it is a security issue to use such a
middleware in a non-proxy setup because it will blindly trust
the incoming headers which might be forged by malicious clients.
fruv7luv

fruv7luv3#

我有这个问题。
当我查看“未提供规范”错误页面的源代码时,我可以在底部看到以下内容:

window.onload = function() {
            const ui = window.ui = new SwaggerUIBundle({
                url: "http://127.0.0.1:5000/api/v1/swagger.json",
                validatorUrl: "" || null,
                dom_id: "#swagger-ui",
                presets: [
                    SwaggerUIBundle.presets.apis,
                    SwaggerUIStandalonePreset.slice(1) // No Topbar
                ],
                plugins: [
                    SwaggerUIBundle.plugins.DownloadUrl
                ],
                displayOperationId: false,
                displayRequestDuration: false,
                docExpansion: "none"
            })

注意,uri是**http://127.0.0.1:5000**,这表示主机名和协议没有传递到服务器(在我的例子中是Gnuicorn)。
为了解决这个问题,我在我的ngnix配置中添加了以下内容:

location / {
                # new lines
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header Host $host;

                # this already existed
                proxy_pass http://127.0.0.1:5000;
        }

请注意,我必须将其添加到ssl服务器块中。当我第一次尝试时,我将其放在非SSL部分,它没有任何区别。

cgyqldqp

cgyqldqp4#

将该行添加到索引中

<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">

相关问题