Обнаруживать и переписывать заголовки HTTP Basic user/password в пользовательские заголовки с помощью Nginx/Lua
Я работаю с историческим API, который предоставляет доступ через комбинацию ключ / секрет, которую указанный исходный дизайнер API должен передавать как имя пользователя и пароль в HTTP-заголовке аутентификации Basic, например:
curl -u api_key:api_secret http://api.example.com/....
Теперь, когда наша клиентская база API будет расти, мы планируем использовать 3scale для обработки как аутентификации, ограничения скорости, так и других функций. Согласно инструкциям и советам 3scale, мы будем использовать прокси-сервер Nginx перед нашим API-сервером, который аутентифицируется на основе сервисов 3scale для обработки всех систем контроля доступа.
Мы будем экспортировать ключи и секреты наших существующих клиентов в 3scale и синхронизировать две системы. Нам нужно, чтобы наше существующее приложение продолжало получать ключ и секрет существующим способом, поскольку некоторые из возвращаемых данных зависят от клиента. Однако мне нужно найти способ преобразования этого базового HTTP-запроса на аутентификацию, который 3scale не поддерживает в качестве метода аутентификации, в переписанные пользовательские заголовки, которые они делают.
Я смог настроить прокси с помощью конфигов Nginx и Lua, которые 3scale настраивает для вас. Это позволяет -u key:secret
быть переданным на наш сервер и правильно обработанным. На данный момент, однако, мне нужно дополнительно добавить ту же информацию аутентификации, что и в параметрах запроса или пользовательских заголовках, чтобы 3scale мог управлять доступом. Я хочу, чтобы мой прокси-сервер Nginx обрабатывал это для меня, чтобы пользователи предоставляли один набор деталей аутентификации уже существующим способом, и 3scale также может его забрать.
На языке, который я знаю, например, Ruby, я могу декодировать заголовок HTTP_AUTHORIZATION, выбирать часть в кодировке Base64 и декодировать ее, чтобы найти предоставленные ключевые и секретные компоненты. Но я новичок в Nginx и не знаю, как добиться этого в Nginx (я также не знаю, может ли поставленный 3scale скрипт Lua быть / будет частью решения)...
1 ответ
Повторное использование заголовка HTTP Authorization для ключей 3scale может быть поддержано небольшим изменением в ваших файлах конфигурации Nginx. Как вы правильно заметили, загружаемый скрипт Lua - это то место, где вы можете это сделать.
Однако я бы предложил немного другой подход к ключам, которые вы импортируете в 3scale. Вместо использования шаблона аутентификации app_id/app_key, вы можете использовать режим user_key (который является одним ключом). Тогда то, что вы импортировали бы в 3scale для каждого приложения, было бы объединенной строкой base64 api_key+api_secret.
Таким образом, изменения, которые вам нужно будет внести в файлы конфигурации, будут меньше и проще.
Шаги, которые вы должны будете выполнить:
- на административном портале 3scale установите для режима аутентификации ключ API ( https://support.3scale.net/howtos/api-configuration/authentication-patterns)
- перейдите на экран конфигурации прокси (где вы устанавливаете свой API-интерфейс, сопоставления и где вы загружаете файлы Nginx).
- в разделе "Параметры проверки подлинности" укажите расположение учетных данных для заголовков HTTP.
- скачайте конфигурационные файлы Nginx и откройте скрипт Lua
- найдите следующую строку (должна быть ближе к концу файла):
local parameters = get_auth_params("headers", string.split(ngx.var.request, " ")[1] )
- замените его на:
local parameters = get_auth_params("basicauth", string.split(ngx.var.request, " ")[1] )
- наконец, в том же файле замените всю функцию с именем "get_auth_params" на функцию в этом списке: https://gist.github.com/vdel26/9050170
Я надеюсь, что этот подход соответствует вашим потребностям. Вы также можете связаться по адресу support@3scale.net, если вам нужна дополнительная помощь.