【发布时间】:2019-10-08 19:36:31
【问题描述】:
在 nginx 和 Phusion Passenger 后面运行时,如何将我的自定义标头一直获取到我的 Rails 应用程序?有可能,请参阅下面的详细信息,但是当我只使用 Paw 中的标题窗格时,它不会通过。
我正在使用 Paw 在 Rails 应用程序中测试和开发一些 API 端点。在我的开发环境中一切正常,这是一个使用 Puma 在 macOS 上运行的 Rails 6 应用程序。为了安全起见,我使用了一个包含个人身份验证令牌的自定义标头。当我检查 Rails 请求对象,特别是 request.headers 时,我能够看到所有的标头,包括我的自定义标头,并且我可以根据它的值进行身份验证。
在我的登台系统上运行时出现问题,我对环境几乎没有控制权。在这里,相同的 Rails 应用程序在 nginx 后面的 Phusion Passenger 下运行。当我用相同的请求访问相同的端点时,只是更改请求中的主机,自定义标头不存在。我通过将所有标头写入暂存中的每个请求的文件来验证这一点。
标题去哪儿了?由于暂存环境不同,我怀疑 nginx 或 Fusion Passenger 正在接收标头,但没有将其传递给我的 Rails 应用程序。我无法验证这一点,因为除了 Rails 应用程序的日志之外,我无权访问其他日志。该应用程序旨在从外部服务获取请求,因此我通过该服务发送一些请求并且存在标头。这很奇怪,所以有些标头被传递,有些则没有。
Paw(在标题窗格下定义的标题)。
-
我使用 cURL 检查了:
curl -X 'https://example.com/ivr/main_menu' -H 'X_JSW_AUTH_TOKEN':'my_tkn' -
使用 Ruby 的 Net::HTTP:
uri = URI('https://example.com/ivr/main_menu') http = Net::HTTP.new(uri.host, uri.port) http.use_ssl = true http.verify_mode = OpenSSL::SSL::VERIFY_PEER req = Net::HTTP::Post.new(uri) req.add_field "X_JSW_AUTH_TOKEN", "my_tkn" res = http.request(req) -
使用 HTTPie:
http POST 'https://example.com/ivr/main_menu' 'X_JSW_AUTH_TOKEN':'my_tkn' -
使用来自 httprb 的 http gem:
resp = HTTP.headers(X_JSW_AUTH_TOKEN: "my_tkn").post("https://example.com/ivr/main_menu")
【问题讨论】: