Не используйте символы подчеркивания в заголовках HTTP

Недавно я работал над сервером API, созданным на Node.js и размещенным на AWS Elastic Beanstalk.

Сервер управляет ресурсами для организаций. Помимо маркера авторизации, который сообщает нам, кем является пользователь, мы добавили еще один маркер, который идентифицирует организационные ресурсы, к которым он хочет получить доступ. Пользователь может быть частью нескольких организаций, поэтому мы решили следовать этому подходу.

Заголовок был назван ORG_API_KEY. В качестве промежуточной среды использовался Heroku; все работало отлично, пока не было развернуто на производственном сервере AWS Elastic Beanstalk. Мы продолжали получать ошибку 401 (отсутствующий api_key).

После нескольких часов отладки я выяснил, что Elastic Beanstalk, использующий Nginx в качестве обратного прокси, по умолчанию имеет опцию Nginx underscores_in_headers выключенной (это значение по умолчанию для Nginx). Почему-то у Heroku и других серверов, с которыми я работал, эта опция включена, поэтому я никогда не замечал.

Теперь нужно было либо включить эту опцию в конфигурации .ebextensions, либо изменить наши заголовки и заменить подчеркивание на тире. Чтобы быть уверенным, я попробовал оба подхода, и они сработали.

curl --HEADER "ORG_API_KEY: some-random-token" # won't work
curl --HEADER "ORG-API-KEY: some-random-token" # works fine
Вход в полноэкранный режим Выйти из полноэкранного режима

Чтобы включить эту опцию с помощью конфига Nginx, вам нужно перейти в следующую папку или создать ее, если она не выходит .ebextensions > nginx > conf.d в этой папке должен быть файл конфигурации или создать его (myconfig.conf или любое другое имя с расширением .conf). У меня уже есть конфигурационный файл, который я использую для увеличения размера запроса, поэтому я добавил новую строку. Теперь мой конфиг выглядит следующим образом;

client_max_body_size 20M;
underscores_in_headers on;
Войти в полноэкранный режим Выйти из полноэкранного режима

Использование подчеркивания допустимо согласно стандартам HTTP, сказали они (Nginx) в свою защиту:

Это сделано для того, чтобы предотвратить двусмысленность при сопоставлении заголовков с переменными CGI, поскольку и тире, и подчеркивание сопоставляются с подчеркиванием во время этого процесса.

Причина уважительная, поэтому вместо того, чтобы включить опцию разрешения подчеркивания, мы изменили заголовки, заменив подчеркивание на тире. Мне не понравилась эта ошибка, но я получил удовольствие от обучения. О каких еще конфигурациях серверов вы узнали?

Оцените статью
Procodings.ru
Добавить комментарий