Использование плагина OpenID Connect в Apache APISIX для централизованной аутентификации идентификации
API7.ai
September 7, 2021
Использование плагина OpenID Connect для Apache APISIX для настройки аутентификации Okta — это простой трехэтапный процесс. Он позволяет перейти от традиционного режима аутентификации к централизованному режиму аутентификации идентификации. В следующих разделах описаны шаги по настройке аутентификации Okta с использованием плагина OpenID Connect для Apache APISIX.
Централизованный режим аутентификации идентификации, по сравнению с традиционным режимом аутентификации, имеет следующие преимущества:
- Централизованная аутентификация упрощает процесс разработки приложений.
- Централизованная аутентификация повышает безопасность бизнеса.
Предварительные требования
Иметь готовый к использованию аккаунт Okta.
Шаг 1: Настройка Okta
- Войдите в свой аккаунт Okta, нажмите "Create App Integration", чтобы создать приложение Okta.

- Выберите "OIDC- OpenID Connect" для метода входа и "Web Application" для типа приложения.

- Установите URL-адреса перенаправления для входа и выхода. "Sign-in redirect URIs" — это ссылки, на которые разрешено перенаправление после успешного входа, а "Sign-out redirect URIs" — это ссылки, на которые происходит перенаправление после успешного выхода. В этом примере мы установили оба URL-адреса перенаправления для входа и выхода на http://127.0.0.1:9080/.

- После завершения настроек нажмите "Save", чтобы сохранить изменения.

- Перейдите на страницу General приложения, чтобы получить следующие конфигурации, которые необходимы для настройки OpenID Connect в Apache APISIX.
- Client ID: Идентификатор приложения, который соответствует client_id ниже.
- Client secret: Ключ приложения, который соответствует client_secret ниже.
- Okta domain: Домен, используемый приложением, соответствующий {ISSUER} ниже.

Шаг 2: Установка Apache APISIX
Установка зависимостей
Среда выполнения Apache APISIX требует зависимостей от NGINX и etcd. Перед установкой Apache APISIX установите зависимости в соответствии с используемой операционной системой. Мы предоставляем инструкции по установке зависимостей для CentOS7, Fedora 31 & 32, Ubuntu 16.04 & 18.04, Debian 9 & 10 и MacOS. Подробнее см. Install Dependencies.
Установка через 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
См. Installing Apache APISIX with Docker.
Установка через Helm Chart
См. Installing Apache APISIX with Helm Chart.
Установка через исходный код
-
Создайте каталог с именем
apisix-2.7.mkdir apisix-2.7 -
Скачайте исходный пакет Apache APISIX Release.
wget https://downloads.apache.org/apisix/2.7/apache-apisix-2.7-src.tgzВы также можете скачать исходный пакет Apache APISIX Release с сайта Apache APISIX. Apache APISIX Official Website - Download Page также предоставляет исходные пакеты для Apache APISIX, APISIX Dashboard и APISIX Ingress Controller.
-
Распакуйте исходный пакет Apache APISIX Release.
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. В следующем примере кода создается маршрут через API администратора Apache APISIX, устанавливая путь к вышестоящему серверу на httpbin.org, простой сервис для получения и ответа на запросы. В дальнейшем будет использоваться страница get httpbin.org. Подробнее см. http bin get. Для конкретных конфигураций см. Apache APISIX OpenID Connect Plugin.
Конфигурационные поля OpenID Connect перечислены ниже:
| Поле | Значение по умолчанию | Описание |
|---|---|---|
| client_id | "" | Идентификатор клиента OAuth. |
| client_secret | "" | Секрет клиента OAuth. |
| discovery | "" | Конечные точки обнаружения сервисов для провайдеров идентификации. |
| 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 | "" | URL конечной точки проверки токена провайдера идентификации, который будет извлечен из discovery, если оставить пустым. |
| introspection_endpoint_auth_method | client_secret_basic | Название метода аутентификации для проверки токена. |
| public_key | "" | Публичный ключ для токена аутентификации. |
| token_signing_alg_values_expected | "" | Алгоритм для токенов аутентификации. |
| set_access_token_header | true | Передавать ли токен доступа в заголовке запроса. |
| access_token_in_authorization_header | false | Помещать ли токен доступа в заголовок Authorization. Токен доступа помещается в заголовок Authorization, если значение true, и в заголовок X-Access-Token, если значение false. |
| set_id_token_header | true | Передавать ли ID-токен в заголовке запроса X-ID-Token. |
| set_userinfo_header | true | Передавать ли информацию о пользователе в заголовке запроса X-Userinfo. |
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_ISSUER}/.well-known/openid-configuration", "scope":"openid profile", "bearer_only":false, "realm":"master", "introspection_endpoint_auth_method":"client_secret_post", "redirect_uri":"http://127.0.0.1:9080/" } }, "upstream":{ "type":"roundrobin", "nodes":{ "httpbin.org:80":1 } } }'
Проверка
-
Перейдите по адресу "http://127.0.0.1:9080/get", и страница будет перенаправлена на страницу входа Okta, так как плагин OpenID Connect включен.

-
Введите имя пользователя и пароль для аккаунта Okta и нажмите "Sign In", чтобы войти в свой аккаунт Okta.
-
После успешного входа вы сможете получить доступ к странице get на "httpbin.org". Страница "httpbin.org/get" вернет запрошенные данные с X-Access-Token, X-Id-Token и X-Userinfo, как показано ниже.
"X-Access-Token": "******Y0RPcXRtc0FtWWVuX2JQaFo1ZVBvSlBNdlFHejN1dXY5elV3IiwiYWxnIjoiUlMyNTYifQ.***TVER3QUlPbWZYSVRzWHRxRWh2QUtQMWRzVDVGZHZnZzAiLCJpc3MiOiJodHRwczovL3FxdGVzdG1hbi5va3RhLmNvbSIsImF1ZCI6Imh0dHBzOi8vcXF0ZXN0bWFuLm9rdGEuY29tIiwic3ViIjoiMjgzMDE4Nzk5QHFxLmNvbSIsImlhdCI6MTYyODEyNjIyNSwiZXhwIjoxNjI4MTI5ODI1LCJjaWQiOiIwb2ExMWc4ZDg3TzBGQ0dYZzY5NiIsInVpZCI6IjAwdWEwNWVjZEZmV0tMS3VvNjk1Iiwic2NwIjpbIm9wZW5pZCIsInByb2Zpb***.****iBshIcJhy8QNvzAFD0fV4gh7OAdTXFMu5k0hk0JeIU6Tfg_Mh-josfap38nxRN5hSWAvWSk8VNxokWTf1qlaRbypJrKI4ntadl1PrvG-HgUSFD0JpyqSQcv10TzVeSgBfOVD-czprG2Azhck-SvcjCNDV-qc3P9KoPQz0SRFX0wuAHWUbj1FRBq79YnoJfjkJKUHz3uu7qpTK89mxco8iyuIwB8fAxPMoXjIuU6-6Bw8kfZ4S2FFg3GeFtN-vE9bE5vFbP-JFQuwFLZNgqI0XO2S7l7Moa4mWm51r2fmV7p7rdpoNXYNerXOeZIYysQwe2_L****", "X-Id-Token": "******aTdDRDJnczF5RnlXMUtPZUtuSUpQdyIsImFtciI6WyJwd2QiXSwic3ViIjoiMDB1YTA1ZWNkRmZXS0xLdW82OTUiLCJpc3MiOiJodHRwczpcL1wvcXF0ZXN0bWFuLm9rdGEuY29tIiwiYXVkIjoiMG9hMTFnOGQ4N08wRkNHWGc2OTYiLCJuYW1lIjoiUGV0ZXIgWmh1IiwianRpIjoiSUQuNGdvZWo4OGUyX2RuWUI1VmFMeUt2djNTdVJTQWhGNS0tM2l3Z0p5TTcxTSIsInZlciI6MSwicHJlZmVycmVkX3VzZXJuYW1lIjoiMjgzMDE4Nzk5QHFxLmNvbSIsImV4cCI6MTYyODEyOTgyNSwiaWRwIjoiMDBvYTA1OTFndHAzMDhFbm02OTUiLCJub25jZSI6ImY3MjhkZDMxMWRjNGY3MTI4YzlmNjViOGYzYjJkMDgyIiwiaWF0IjoxNjI4MTI2MjI1LCJhdXRoX3RpbWUi*****", "X-Userinfo": "*****lfbmFtZSI6IlpodSIsImxvY2FsZSI6ImVuLVVTIiwicHJlZmVycmVkX3VzZXJuYW1lIjoiMjgzMDE4Nzk5QHFxLmNvbSIsInVwZGF0ZWRfYXQiOjE2MjgwNzA1ODEsInpvbmVpbmZvIjoiQW1lcmljYVwvTG9zX0FuZ2VsZXMiLCJzdWIiOiIwMHVhMDVlY2RGZldLTEt1bzY5NSIsImdpdmVuX25hbWUiOiJQZXRlciIsIm5hbWUiOiJQZXRl****"
X-Access-Token: Apache APISIX помещает токен доступа, полученный от провайдера пользователя, в заголовок запроса X-Access-Token, опционально через access_token_in_authorization_header в конфигурации плагина в заголовок Authorization.

X-Id-Token: Apache APISIX получит Id-токен от провайдера пользователя через кодировку base64 и поместит его в заголовок запроса X-Id-Token. Вы можете выбрать, включать ли эту функцию через set_id_token_header в конфигурации плагина, по умолчанию она включена.

X-Userinfo: Apache APISIX получит информацию о пользователе от провайдера пользователя и поместит ее в X-Userinfo после кодирования Base64. Вы можете выбрать, включать ли эту функцию через set_userinfo_header в конфигурации плагина, по умолчанию она включена.

Как видите, Apache APISIX передает заголовки запроса X-Access-Token, X-Id-Token и X-Userinfo вышестоящему серверу. Вышестоящий сервер может разобрать эти заголовки, чтобы получить информацию о пользователе и метаданные.
Мы показали процесс построения централизованной аутентификации идентификации от Okta непосредственно в шлюзе Apache APISIX. Легко зарегистрировать бесплатный аккаунт разработчика Okta, чтобы начать. Наш подход снижает нагрузку на разработчиков и обеспечивает безопасный и оптимизированный опыт.
О Okta
Okta — это настраиваемое, безопасное и готовое решение для добавления услуг аутентификации и авторизации в ваши приложения. Получите масштабируемую аутентификацию, встроенную прямо в ваше приложение, без затрат на разработку, рисков безопасности и обслуживания, связанных с самостоятельным кодированием. Вы можете подключить любое приложение на любом языке или стеке к Okta и определить, как вы хотите, чтобы ваши пользователи входили в систему. Каждый раз, когда пользователь пытается пройти аутентификацию, Okta проверит его личность и отправит необходимую информацию обратно в ваше приложение.
О Apache APISIX
Apache APISIX — это динамический, высокопроизводительный API-шлюз в реальном времени. Apache APISIX предоставляет богатые функции управления трафиком, такие как балансировка нагрузки, динамический вышестоящий сервер, канареечные выпуски, разрыв цепи, аутентификация, наблюдаемость и многое другое. Вы можете использовать Apache APISIX для обработки традиционного север-южного трафика, а также восточно-западного трафика между сервисами. Он также может использоваться как контроллер ingress для k8s.
Сотни компаний по всему миру используют Apache APISIX, включая финансы, интернет, производство, розничную торговлю, операторов, таких как NASA, Европейская цифровая фабрика, TravelSky, Tencent, Huawei, Weibo, China Mobile, Taikang, 360 и другие.
Github: https://github.com/apache/apisix