Почему мой пользовательский заголовок иногда отсутствует? - PullRequest
0 голосов
/ 08 октября 2019

Как получить свой настраиваемый заголовок вплоть до приложения Rails при работе с Nginx и Phusion Passenger? Возможно , см. Подробности ниже, но когда я просто использую панель заголовков в Paw, она не проходит.

Я использую Paw для тестирования и разработки некоторых конечных точек API вПриложение Rails. В моей среде разработки все работает как положено (приложение Rails 6 работает на macOS с использованием сервера rails (Puma)). В целях безопасности я использую пользовательский заголовок, который содержит личный токен авторизации. Когда я проверяю объект запроса Rails, в частности request.headers, я вижу все заголовки, включая мой настраиваемый заголовок, и я могу аутентифицироваться на основе его значения ✅.

Проблема возникает при запуске на стадии подготовки, гдеУ меня очень мало контроля над окружающей средой. Здесь то же самое приложение Rails работает под Phusion Passenger за Nginx. Когда я обращаюсь к одной и той же конечной точке с тем же запросом (просто меняя хост в запросе), пользовательский заголовок отсутствует. (Я проверил это, записав все заголовки в файл для каждого запроса в стадии подготовки)

Куда пропал заголовок? Поскольку среда в стадии подготовки отличается, я подозреваю, что Nginx или Fusion Passenger получает заголовок, но не передает его в мое приложение Rails. К сожалению, я не могу проверить это, так как у меня нет доступа к журналам (кроме журналов моего приложения Rails). Приложение предназначено для получения запросов от внешнего сервиса, поэтому я отправляю некоторые запросы через этот сервис, и заголовок присутствует. Это очень странно. Таким образом, некоторые заголовки пропускаются, а некоторые нет.

  • Paw (заголовок, определенный в области заголовков) ❌

  • Я проверяю с помощью cURL ❌

    curl -X 'https://example.com/ivr/main_menu' -H 'X_JSW_AUTH_TOKEN':'my_tkn'
  • С сетью Руби / 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'
  • С помощью http gem от httprb 10
    resp = HTTP.headers(X_JSW_AUTH_TOKEN: "my_tkn").post("https://example.com/ivr/main_menu")

1 Ответ

0 голосов
/ 10 октября 2019

Кажется, ответ не имеет ничего общего с Лапой. Довольно убедительные доказательства этого, когда cURL, HTTPie и Net / Http имеют одинаковые результаты с Paw.

Проблема в том, как Nginx по умолчанию обрабатывает заголовки с подчеркиванием - , игнорируя их . Почему серверы HTTP запрещают подчеркивание в именах заголовков HTTP .

Gem Ruby http, который смог предоставить заголовок моему приложению, сделал это, потому что он заменяет подчеркивания (_) дефисами (-) в именах заголовков, поэтому эти заголовки дошли до приложения Rails. Затем Rails заменяет дефисы в именах заголовков запросов символами подчеркивания. Таким образом, и отправитель (http gem), и получатель (Rails) делали замены за кулисами. Это затрудняло поиск и устранение неисправностей.

Большое спасибо Крису Оливеру по телефону https://hatchbox.io за ответ.

...