首页 > 解决方案 > 通过 HAProxy 从颤振到 IPFS 的 REST 调用不起作用

问题描述

背景:

我在 HAProxy 服务器后面设置了一个 IPFS 服务器。我写了一个 Flutter 客户端通过代理连接到这个 IPFS 服务器并添加一个文件。

问题:

当我将 Flutter 客户端作为桌面应用程序(在 Macos 上)运行时,一切都按预期工作,但是当我将 Flutter 客户端作为 Web 应用程序运行时,出现 403 错误。

细节:

成功调用的标头(通过 tcpdump 捕获)如下:

REQUEST:
POST /api/v0/add HTTP/1.1
Host: po.segito.net
User-Agent: Dart/2.11 (dart:io)
Accept-Encoding: gzip
Content-Type: multipart/form-data; boundary=dart-http-boundary-fmjPP-TIwnDcY7pJGniid4grt9mdDADtazmb7Pm8sP_PRJkV1oY
Content-Length: 39611

--dart-http-boundary-fmjPP-TIwnDcY7pJGniid4grt9mdDADtazmb7Pm8sP_PRJkV1oY
content-type: application/octet-stream
content-disposition: form-data; name="asset"

RESPONSE:
HTTP/1.1 200 OK
Access-Control-Allow-Headers: X-Stream-Output, X-Chunked-Output, X-Content-Length
Access-Control-Expose-Headers: X-Stream-Output, X-Chunked-Output, X-Content-Length
Content-Type: application/json
Server: go-ipfs/0.6.0
Trailer: X-Stream-Error
Vary: Origin
X-Chunked-Output: 1
Date: Sat, 07 Nov 2020 09:48:28 GMT
Transfer-Encoding: chunked

不成功调用的标头如下:

REQUEST:
POST /api/v0/add HTTP/1.1
Host: po.segito.net
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:82.0) Gecko/20100101 Firefox/82.0
Accept-Encoding: gzip, deflate, br
Content-Type: multipart/form-data; boundary=dart-http-boundary-HvcRoK0lGd4+oahuNaOejbIBd-cID5+0n3GFvwwOY4ZqfitRP1s
Content-Length: 39611

--dart-http-boundary-HvcRoK0lGd4+oahuNaOejbIBd-cID5+0n3GFvwwOY4ZqfitRP1s
content-type: application/octet-stream
content-disposition: form-data; name="asset"

RESPONSE:
HTTP/1.1 403 Forbidden
Content-Type: text/plain; charset=utf-8
Vary: Origin
X-Content-Type-Options: nosniff
Date: Sat, 07 Nov 2020 09:38:55 GMT
Content-Length: 16

403 - Forbidden

笔记:

  1. 不存在 CORS 问题,因为所有文件和 REST 调用(包括 Flutter HTML 文件)都通过同一个 HAProxy 服务器提供服务。
  2. HAProxy 是 SSL 终结器。
  3. CURL 请求按预期工作。
  4. 通过 HAProxy 的所有其他 REST 调用按预期工作。

标签: flutterhaproxyipfs

解决方案


推荐阅读