web-dev-qa-db-ja.com

HTTPS経由でswagger.jsonを配信しようとすると、「仕様が提供されていません」エラーが発生します

Flask RestPlus over HTTPSを使用してSwaggerUIを配信しようとすると、ルートURLに「仕様が提供されていません」というエラーメッセージのみが表示され、完全なSwaggerUIが読み込まれません。 APIエンドポイントにアクセスすると、期待どおりに応答が返されます。

エラーページのソースHTMLを見ると、swagger.jsonhttp://myhost/ではなくhttps://myhost/からフェッチされていることがわかりました。

残りのGithubの問題 でまったく同じ問題を発見しました

そのページに記載されている 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;
    }
  }
}
8
ukosteopath

私はそれを機能させるために以下を使用しました。以下のリンクで安定した例を見ることができます。

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)
3
Yusuf

これが完全に安全かどうかはわかりませんが、Nginxで修正した方法は次のとおりです。

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

NginxでSSLをオフロードしていますが、これは問題なく機能します。また、アプリケーションコードにモンキーパッチを適用する必要もなくなります。

フラスコレストプラスの問題からリストした方法は、間違いなく安全でないと見なされます。

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.
0
n3rV3