Forward-Auth, еще один выбор для функции аутентификации

API7.ai

January 26, 2022

Ecosystem

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 или через список рассылки для общения.

Tags: