Forward-Auth, еще один выбор для функции аутентификации
API7.ai
January 26, 2022
Forward Auth интеллектуально переносит логику аутентификации и авторизации на выделенный внешний сервис, где шлюз перенаправляет запрос пользователя на сервис аутентификации и блокирует исходный запрос, заменяя результат, когда сервис аутентификации отвечает статусом, отличным от 20x. Таким образом, можно вернуть пользовательскую ошибку или перенаправить пользователя на страницу аутентификации, если аутентификация не удалась.
Принцип работы

Принцип и поток работы плагина forward-auth в Apache APISIX показаны на рисунке выше и могут быть описаны следующими шагами.
- Шаг 1: Клиент отправляет запрос в APISIX
- Шаг 2: APISIX отправляет запрос в настроенный пользователем сервис аутентификации
- Шаг 3: Сервис аутентификации отвечает (статус 2xx или исключение)
- Шаг 4: На основе ответа сервиса аутентификации APISIX решит, перенаправить запрос вышестоящему сервису или отправить клиенту ответ об отказе
Как использовать
Шаг 1: Настройка сервиса аутентификации
Предположим, существует сервис аутентификации, на который пользователь отправляет запрос с заголовком Authorization. Если данные проходят аутентификацию, возвращается статус 200 и заголовок ответа X-User-ID; если аутентификация не проходит, считается, что статус аутентификации истек, и возвращается статус 302 и заголовок ответа Location, чтобы перенаправить клиента на страницу входа.
Шаг 2: Создание маршрута и включение плагина forward-auth
Далее мы настроим маршрут и включим плагин forward-auth, чтобы связать вышеуказанный сервис аутентификации с вышестоящим приложением.
curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d ' { "plugins": { "forward-auth": { "address": "http://127.0.0.1:9080/auth", "request_headers": ["Authorization"], "upstream_headers": ["X-User-ID"], "client_headers": ["Location"] } }, "uri": "/user" }'
Детали вышеуказанной конфигурации объясняются ниже.
- Когда запрос соответствует текущему маршруту, запрос отправляется на
addressс заголовком Authorization, определенным вrequest_headers(т.е. заголовок запроса, настроенный для пересылки клиентом в сервис аутентификации, если не задан, заголовок не пересылается), что позволяет сервису аутентификации подтвердить личность пользователя. - Если аутентификация проходит, возвращается статус 200 и заголовок
X-User-ID, определенный вupstream_headers(т.е. заголовок запроса, который будет пересылаться вышестоящему сервису при успешной аутентификации, если не задан, заголовок не пересылается). - Если аутентификация не проходит, возвращается статус 302 и заголовок
Location, определенный вclient_headers(т.е. заголовок ответа, отправляемый сервисом аутентификации клиенту при неудачной аутентификации, или отсутствие заголовка, если он не задан).
Шаг 3: Тестирование запросов
# Запрос и отправка данных с использованием POST curl http://127.0.0.1:9080/user \ --header 'Authorization: true' HTTP/1.1 200 OK Content-Type: application/json Content-Length: 28 Server: APISIX/2.11.0 {"user_id":"i-am-real-user"} # Запрос с использованием GET curl -i http://127.0.0.1:9080/user \ --header 'Authorization: false' HTTP/1.1 302 FOUND Server: APISIX/2.11.0 Location: https://example.com/auth
Дополнение: Отключение плагина
Если вы закончили использовать плагин Forward Auth, просто удалите конфигурацию плагина forward-auth из конфигурации маршрута и сохраните изменения, чтобы отключить плагин Forward Auth на маршруте.
Благодаря динамической природе Apache APISIX, нет необходимости перезапускать Apache APISIX для включения или отключения плагина.
Итог
Чтобы получить больше информации о плагине forward-auth и полном списке конфигураций, вы можете обратиться к официальной документации. Также, если у вас есть более сложные сценарии аутентификации или авторизации, попробуйте использовать плагин opa, который позволяет реализовать более мощные функции программным способом.
Apache APISIX также активно работает над добавлением новых плагинов для поддержки интеграции с дополнительными сервисами, поэтому, если вы заинтересованы, не стесняйтесь начать обсуждение в GitHub Discussion или через список рассылки для общения.