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

问题描述 投票:7回答:2

如果我尝试通过HTTPS使用Flask RestPlus提供Swagger UI,我只会在根URL上看到“No spec provided”错误消息,并且从不加载完整的Swagger UI。但是,如果我访问API端点,则会按预期返回响应。

查看错误页面的源HTML,我注意到swagger.json是从http://myhost/而不是https://myhost/获取的

我在the restplus Github issues上发现了完全相同的问题

我已经在该页面上提到的the 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;
    }
  }
}
swagger flask-restplus
2个回答
3
投票

我用下面的方法来实现它。您可以在下面的链接中查看稳定示例。

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)

0
投票

我不确定这是完全安全的,但这是我在Nginx中修复它的方法:

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

我正在Nginx上卸载SSL,这对我没有任何问题。它还消除了猴子补丁应用程序代码的需要。

您从flask-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.
© www.soinside.com 2019 - 2024. All rights reserved.