Использование Apache APISIX и Authing для реализации централизованного управления аутентификацией
API7.ai
January 4, 2022
Введение
О Apache APISIX
Apache APISIX — это динамический, высокопроизводительный API-шлюз, работающий в реальном времени, который предоставляет богатые функции управления трафиком, такие как балансировка нагрузки, динамический апстрим, канареечные релизы, аутентификация, наблюдаемость и многое другое. Apache APISIX не только поддерживает динамическое изменение и горячую замену плагинов, но также имеет множество полезных плагинов. Плагин OpenID Connect для Apache APISIX поддерживает протокол OpenID Connect, что позволяет пользователям использовать этот плагин для интеграции Apache APISIX с сервисами Authing и развертывания в качестве централизованного шлюза аутентификации в корпоративной среде.
О Authing
Authing — это первый в Китае продукт для управления идентификацией, ориентированный на разработчиков, который интегрирует все основные протоколы идентификации и предоставляет полные и безопасные услуги аутентификации и управления доступом для предприятий и разработчиков. Основываясь на принципе "API First", все распространенные функции в области идентификации модульно инкапсулированы, а все возможности предоставляются разработчикам через SDK на различных языках программирования. Пользователи также могут гибко использовать открытые RESTful API Authing для расширения функциональности, чтобы удовлетворить потребности в управлении идентификацией в различных бизнес-сценариях.
Что такое централизованная аутентификация
Традиционный режим аутентификации
В традиционном режиме аутентификации каждое серверное приложение должно разрабатывать отдельные функции для поддержки аутентификации, такие как взаимодействие с провайдером идентификации и получение информации о пользователе.

Централизованный режим аутентификации
В отличие от традиционного режима, централизованная аутентификация выносит процесс аутентификации пользователя за пределы серверного приложения. На примере Apache APISIX процесс централизованной аутентификации выглядит следующим образом: сначала пользователь инициирует запрос, затем фронтальный шлюз отвечает за процесс аутентификации пользователя, взаимодействуя с провайдером идентификации и отправляя запрос на авторизацию. Провайдер идентификации возвращает информацию о пользователе. После завершения идентификации пользователя шлюз передает информацию о пользователе серверному приложению в виде заголовка запроса.

Преимущества централизованной аутентификации
По сравнению с традиционным режимом аутентификации, централизованная аутентификация имеет следующие преимущества.
- Упрощает процесс разработки приложений, снижает нагрузку на разработку и затраты на обслуживание, избегая повторной разработки логики аутентификации для каждого приложения.
- Повышает безопасность бизнеса, так как централизованная аутентификация на уровне шлюза может своевременно перехватывать неаутентифицированные запросы для защиты серверных приложений.
В сочетании с мощными функциями управления аутентификацией Authing можно достичь следующих возможностей.
- Управление жизненным циклом служб аутентификации через консоль, включая создание, включение, отключение и т.д.
- Реальное время и визуальный мониторинг приложений, включая количество запросов, задержку вызовов интерфейсов и информацию об ошибках, а также уведомления в реальном времени.
- Централизованное ведение журналов для удобного просмотра информации о входе, выходе и изменениях в приложении.
Подробнее можно узнать на странице Authing Access Gateway.
Как реализовать централизованную аутентификацию с использованием Apache APISIX и Authing
Шаг 1: Настройка Authing
- Войдите в свой аккаунт Authing, выберите "Создать свое приложение" и заполните имя приложения и адрес аутентификации. Если у вас нет аккаунта Authing, посетите Authing, нажмите "Вход/Регистрация" в правом верхнем углу, чтобы зарегистрировать аккаунт.

- Нажмите "Создать", чтобы создать приложение Authing.

- В процессе аутентификации Authing будет отклонять URL-адреса обратного вызова, отличные от настроенных. Поскольку это локальный тест, URL-адрес для входа и выхода установлен на адрес доступа APISIX http://127.0.0.1:9080/.

- Создание пользователя (опционально). На странице списка пользователей создайте пользователя с учетной записью user1/user1, и вы можете настроить доступ к приложению на странице "Информация о пользователе - Управление доступом" (по умолчанию доступ разрешен).

- Посетите страницу приложения для следующих настроек, которые необходимы при настройке плагина OpenID Connect в Apache APISIX.
- App ID: Идентификатор клиента OAuth, соответствующий
client_idи{YOUR_CLIENT_ID}ниже. - App secret: Секретный ключ клиента OAuth, соответствующий
client_secretи{YOUR_CLIENT_SECRET}ниже. - Service_discovery_address: Адрес обнаружения службы приложения. Соответствует
{YOUR_DISCOVERY}ниже.
- App ID: Идентификатор клиента OAuth, соответствующий
Шаг 2: Установка Apache APISIX
Вы можете установить Apache APISIX различными способами, включая исходные пакеты, Docker, Helm Chart и т.д.
Установка зависимостей
Для работы Apache APISIX требуется наличие зависимостей NGINX и etcd.
Перед установкой Apache APISIX установите зависимости в зависимости от используемой операционной системы. Мы предоставляем инструкции по установке зависимостей для CentOS7, Fedora 31 и 32, Ubuntu 16.04 и 18.04, Debian 9 и 10, а также macOS. Подробнее см. Установка зависимостей.
Установка через RPM-пакет (CentOS 7)
Этот метод установки подходит для CentOS 7; выполните следующую команду для установки Apache APISIX.
sudo yum install -y https://github.com/apache/apisix/releases/download/2.7/apisix-2.7-0.x86_64.rpm
Установка через Docker
Подробнее см. Установка Apache APISIX с помощью Docker.
Установка через Helm Chart
Подробнее см. Установка Apache APISIX с помощью Helm Chart.
Установка через исходный код
- Создайте каталог с именем
apisix-2.7.
mkdir apisix-2.7
- Загрузите исходный пакет Apache APISIX.
wget https://downloads.apache.org/apisix/2.7/apache-apisix-2.7-src.tgz
Вы также можете загрузить исходный пакет Apache APISIX с официального сайта. Официальный сайт Apache APISIX - Страница загрузки также предоставляет исходные пакеты для Apache APISIX, APISIX Dashboard и APISIX Ingress Controller.
- Распакуйте исходный пакет Apache APISIX.
tar zxvf apache-apisix-2.7-src.tgz -C apisix-2.7
- Установите необходимые библиотеки Lua.
# Перейдите в каталог apisix-2.7 cd apisix-2.7 # Создайте зависимости make deps
Инициализация зависимостей
Выполните следующую команду для инициализации конфигурационного файла NGINX и etcd.
# инициализация конфигурационного файла NGINX и etcd make init
Шаг 3: Запуск Apache APISIX и настройка маршрута
-
Выполните следующую команду для запуска Apache APISIX.
apisix start -
Создайте маршрут и настройте плагин OpenID Connect. Список конфигураций OpenID Connect приведен ниже.
| Поле | Значение по умолчанию | Описание |
|---|---|---|
| client_id | N/A | Идентификатор клиента OAuth |
| client_secret | N/A | Секретный ключ клиента OAuth |
| discovery | N/A | Конечные точки обнаружения службы для провайдеров идентификации |
| scope | openid | Область ресурсов, к которым требуется доступ |
| relm | apisix | Указывает информацию аутентификации в заголовке ответа WWW-Authenticate |
| bearer_only | false | Проверять ли токен в заголовке запроса |
| logout_path | /logout | URI для выхода |
| redirect_uri | request_uri | URI, на который провайдер идентификации перенаправляет пользователя, по умолчанию используется адрес запроса |
| timeout | 3 | Время ожидания запроса в секундах |
| ssl_verify | false | Проверять ли SSL-сертификат провайдера идентификации |
| introspection_endpoint | N/A | URL конечной точки проверки токена провайдера идентификации, который будет извлечен из ответа обнаружения, если оставить пустым. |
| introspection_endpoint_auth_method | client_secret_basic | Метод аутентификации для проверки токена |
| public_key | N/A | Публичный ключ для аутентификации токена |
| token_signing_alg_values_expected | N/A | Алгоритм для аутентификации токенов |
| set_access_token_header | true | Передавать ли токен доступа в заголовке запроса |
| access_token_in_authorization_header | false | Токен доступа помещается в заголовок Authorization, если true, и в заголовок X-Access-Token, если false. |
| set_id_token_header | false | Не передавать ID-токен в заголовок запроса X-ID-Token |
| set_userinfo_header | false | Передавать ли информацию о пользователе в заголовок запроса X-Userinfo |
В следующем примере кода создается маршрут через API администратора Apache APISIX, устанавливая апстрим маршрута на httpbin.org. httpbin.org — это простой серверный сервис для приема и ответа на запросы, страница get httpbin.org будет использована ниже, см. http bin get.
Подробнее о конфигурации см. Плагин OpenID Connect для Apache APISIX.
curl -XPOST 127.0.0.1:9080/apisix/admin/routes -H "X-Api-Key: edd1c9f034335f136f87ad84b625c8f1" -d '{ "uri":"/*", "plugins":{ "openid-connect":{ "client_id":"{YOUR_CLIENT_ID}", "client_secret":"{YOUR_CLIENT_SECRET}", "discovery":"https://{YOUR_DISCOVERY}", "scope":"openid profile", "bearer_only":false, "realm":"apisix", "introspection_endpoint_auth_method":"client_secret_post", "redirect_uri":"http://127.0.0.1:9080/" } }, "upstream":{ "type":"roundrobin", "nodes":{ "httpbin.org:80":1 } } }'
Шаг 4: Доступ к Apache APISIX
-
Посетите "http://127.0.0.1:9080/get", и страница будет перенаправлена на страницу входа Authing, так как плагин OpenID Connect уже включен (эту страницу можно настроить в консоли Authing в разделе "Приложения - Брендинг").

-
Введите пароль для учетной записи пользователя, зарегистрированной в Authing, или пользователя user1/user1, созданного на Шаге 1, и нажмите "Войти", чтобы войти в аккаунт Authing.
-
После успешного входа вы сможете успешно получить доступ к странице get на httpbin.org. Страница httpbin.org/get вернет запрошенные данные, как показано ниже.
... "X-Access-Token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6InFqeU55aVdVd2NhbUFxdEdVRUNCeFNsTWxQSWtTR2N1NmkyZzhEUk1OSGsifQ.eyJqdGkiOiJjTy16a0pCS0NSRFlHR2kyWkJhY0oiLCJzdWIiOiI2MWM5OGFmOTg0MjI4YWU0OTYyMDU4NTIiLCJpYXQiOjE2NDA1OTg4NTgsImV4cCI6MTY0MTgwODQ1OCwic2NvcGUiOiJvcGVuaWQgcHJvZmlsZSIsImlzcyI6Imh0dHBzOi8vYXBpc2l4LmF1dGhpbmcuY24vb2lkYyIsImF1ZCI6IjYxYzk4M2M0YjI4NzdkNDg2OWRkOGFjYiJ9.l2V8vDWcCObB1LjIhKs2ARG4J7WuB-0c-bnYZG2GP2zcpl6PMAPcId2B76CaXCU58ajGcfRmOlWJ67UaHrfWKv8IM4vcYN1gwhKdokSyrhEM31gQE-MzNEsEbPaVIGXdpR1N2JnAJK5-tKIjopDAXSwArfO6fQKTpjLhCi3COIA169WGRR4CKCwNzzpFAYP2ilNc18D_HRTBLS6UjxZSNUtWE5dbx7uBjblhwIwn5e1fxiEQcknVK8Dxf8NUliFECvr02HX2hNvmuCECkvA_mZYlshAeqidK8tSEXirAWsWS5jlXFqLiBJkhSHFrbxRyqeOSfJCJR_YcCwk9AzgZGg", "X-Id-Token": "eyJhdF9oYXNoIjoiRl8tRjZaUVgtWVRDNEh0TldmcHJmUSIsImJpcnRoZGF0ZSI6bnVsbCwiZmFtaWx5X25hbWUiOm51bGwsImdlbmRlciI6IlUiLCJnaXZlbl9uYW1lIjpudWxsLCJpc3MiOiJodHRwczpcL1wvYXBpc2l4LmF1dGhpbmcuY25cL29pZGMiLCJwaWN0dXJlIjoiaHR0cHM6XC9cL2ZpbGVzLmF1dGhpbmcuY29cL2F1dGhpbmctY29uc29sZVwvZGVmYXVsdC11c2VyLWF2YXRhci5wbmciLCJwcmVmZXJyZWRfdXNlcm5hbWUiOm51bGwsInVwZGF0ZWRfYXQiOiIyMDIxLTEyLTI3VDA5OjU0OjE3Ljc3M1oiLCJ3ZWJzaXRlIjpudWxsLCJ6b25laW5mbyI6bnVsbCwibmFtZSI6bnVsbCwiaWF0IjoxNjQwNTk4ODU4LCJuaWNrbmFtZSI6bnVsbCwibm9uY2UiOiJmMTlmZjhjODM5NzdmZjNlMDczMzZmMzg3Y2QxM2EzMSIsIm1pZGRsZV9uYW1lIjpudWxsLCJleHAiOjE2NDE4MDg0NTgsInN1YiI6IjYxYzk4YWY5ODQyMjhhZTQ5NjIwNTg1MiIsImxvY2FsZSI6bnVsbCwiYXVkIjoiNjFjOTgzYzRiMjg3N2Q0ODY5ZGQ4YWNiIiwicHJvZmlsZSI6bnVsbH0=", "X-Userinfo": "eyJ3ZWJzaXRlIjpudWxsLCJ6b25laW5mbyI6bnVsbCwibmFtZSI6bnVsbCwicHJvZmlsZSI6bnVsbCwibmlja25hbWUiOm51bGwsInN1YiI6IjYxYzk4YWY5ODQyMjhhZTQ5NjIwNTg1MiIsImxvY2FsZSI6bnVsbCwiYmlydGhkYXRlIjpudWxsLCJmYW1pbHlfbmFtZSI6bnVsbCwiZ2VuZGVyIjoiVSIsImdpdmVuX25hbWUiOm51bGwsIm1pZGRsZV9uYW1lIjpudWxsLCJwaWN0dXJlIjoiaHR0cHM6XC9cL2ZpbGVzLmF1dGhpbmcuY29cL2F1dGhpbmctY29uc29sZVwvZGVmYXVsdC11c2VyLWF2YXRhci5wbmciLCJwcmVmZXJyZWRfdXNlcm5hbWUiOm51bGwsInVwZGF0ZWRfYXQiOiIyMDIxLTEyLTI3VDA5OjU0OjE3Ljc3M1oifQ==" ...X-Access-Token: Apache APISIX помещает токен доступа, полученный от провайдера идентификации, в заголовок запроса
X-Access-Token, при необходимости его можно поместить в заголовок Authorization через параметрaccess_token_in_authorization_headerв конфигурации плагина.
X-Id-Token: Apache APISIX помещает ID-токен, полученный от провайдера идентификации, в заголовок запроса X-Id-Token после кодирования base64, что можно включить или отключить через параметр
set_id_token_headerв конфигурации плагина.
X-Userinfo: Apache APISIX помещает информацию о пользователе, полученную от провайдера идентификации, в X-Userinfo после кодирования base64. Вы можете выбрать, включать ли эту функцию, используя параметр
set_userinfo_headerв конфигурации плагина.
Как видно, Apache APISIX передает заголовки
X-Access-Token,X-Id-TokenиX-Userinfoв апстрим. Апстрим может разобрать эти заголовки, чтобы получить информацию о пользователе и его метаданные. -
В разделе "Журнал аудита - Журнал действий пользователя" в консоли Authing можно наблюдать информацию о входе пользователя user1.

Заключение
В этой статье описаны подробные шаги по интеграции Apache APISIX с Authing.
Apache APISIX не только стремится поддерживать свою высокую производительность, но и уделяет большое внимание развитию экосистемы с открытым исходным кодом. В настоящее время Apache APISIX имеет более 10 плагинов, связанных с аутентификацией и авторизацией, которые поддерживают интеграцию с основными сервисами аутентификации и авторизации в отрасли.
Если у вас есть потребность в интеграции с другими провайдерами аутентификации, посетите GitHub Apache APISIX и оставьте свои предложения через issue; или подпишитесь на рассылку Apache APISIX, чтобы выразить свои мысли по электронной почте.