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