Flask RestPlus over HTTPSを使用してSwaggerUIを配信しようとすると、ルートURLに「仕様が提供されていません」というエラーメッセージのみが表示され、完全なSwaggerUIが読み込まれません。 APIエンドポイントにアクセスすると、期待どおりに応答が返されます。
エラーページのソースHTMLを見ると、swagger.json
がhttp://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;
}
}
}
私はそれを機能させるために以下を使用しました。以下のリンクで安定した例を見ることができます。
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)
これが完全に安全かどうかはわかりませんが、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.