В этой статье мы кратко опишем различные методы аутентификации, рассмотрим случаи использования и преимущества централизованной аутентификации с помощью Apache APISIX API Gateway, а также научимся настраивать такие распространенные плагины аутентификации, как basic, key и JWT для защиты ваших сервисов. Итак, давайте приступим.
- Об Apache APISIX
- Аутентификация API
- Базовая аутентификация HTTP
- Аутентификация по API-ключу
- Аутентификация OAuth
- От традиционной к централизованной модели аутентификации
- Связь с поставщиками идентификационных данных
- Учебник по плагинам Apache APISIX
- Предварительные условия
- Установите Apache APISIX
- Плагин базовой аутентификации HTTP
- Плагин аутентификации по API-ключу
- Плагин JWT
- Резюме
Об Apache APISIX
Apache APISIX – это шлюз API с открытым исходным кодом, который предлагает услуги по управлению трафиком, такие как ограничение скорости, наблюдаемость, ведение журнала, безопасность, аутентификация и многое другое. Он также имеет множество встроенных плагинов, которые подходят для всех API и микросервисов. В данном руководстве мы сосредоточимся на плагинах аутентификации. В настоящее время он уже может работать с большим количеством плагинов, связанных с аутентификацией, как вы можете видеть на странице хаба плагинов.
Аутентификация API
Аутентификация API – это подтверждение или проверка личности людей, получающих доступ к вашей системе. Это процесс использования программного протокола для проверки того, что клиенты в сети являются теми, за кого себя выдают, прежде чем предоставить им доступ.
Существует несколько методов аутентификации API, вот некоторые из наиболее популярных, которые мы рассмотрим в этом руководстве, не вдаваясь в глубокие подробности, поскольку наше основное внимание сосредоточено на плагинах аутентификации. Если вы уже хорошо знакомы с ними, вы можете пропустить эту теоретическую часть и перейти непосредственно к практическому руководству по плагинам:
- Базовая аутентификация HTTP
- Аутентификация по ключу API
- Аутентификация OAuth/Auth2
Базовая аутентификация HTTP
Самый простой способ аутентификации – это использование HTTP, когда имя пользователя и пароль отправляются вместе с каждым вызовом API. Вы можете использовать HTTP-заголовок и закодировать имя пользователя и пароль, как показано на рисунке ниже:
Аутентификация по API-ключу
Техника Application Programming Interface Key (API Key) создает уникальные ключи для пользователей и передает их с каждым запросом. API генерирует секретный ключ, который представляет собой длинную, трудноугадываемую строку цифр и букв длиной не менее 30 символов, хотя стандартной длины не существует. Обычно он передается вместе с заголовком авторизации API.
Аутентификация OAuth
Открытая авторизация (OAuth) – еще один широко используемый метод как для аутентификации, так и для авторизации. При таком подходе пользователь входит в систему. Затем эта система запрашивает аутентификацию, обычно в виде маркера. Затем пользователь направляет этот запрос на сервер аутентификации, который либо отклоняет, либо разрешает аутентификацию. После этого маркер предоставляется пользователю, а затем запрашивающему. Затем такой маркер может быть в любое время независимо от пользователя проверен запрашивающей стороной на подлинность и может использоваться в течение определенного времени со строго ограниченной областью действия и сроком действия.
От традиционной к централизованной модели аутентификации
Apache APISIX можно использовать в качестве централизованного шлюза аутентификации. Например, у вас есть три сервиса, которые вы хотите выставить на обозрение, диаграмма слева показывает нам более распространенный традиционный подход к аутентификации. Каждый модуль прикладной службы разрабатывает отдельный модуль аутентификации, который используется для поддержки набора процессов обработки аутентификации. Но когда объем сервисов увеличивается, становится ясно, что объем работы по разработке этих модулей огромен и повторяется.
Для описанного выше сценария мы можем добиться консолидации и уменьшить объем разработки, заменив эту часть логики разработки в шлюзе Apache APISIX.
Как показано на рисунке справа, пользователь или сторона приложения напрямую запрашивает Apache APISIX, а затем Apache APISIX передает аутентифицированную идентификационную информацию в вышестоящую прикладную службу после идентификации и аутентификации. После этого вышестоящая прикладная служба может прочитать эту информацию из заголовка запроса и затем обработать последующую работу.
Связь с поставщиками идентификационных данных
Мы можем обнаружить еще одно расширенное использование APISIX в качестве обработчика аутентификации. API-шлюз может быть типичным местом, где мы осуществляем все взаимодействия с IDP (поставщиком идентификационных данных) для вышестоящих служб. Он сам взаимодействует с провайдером идентификации, ему нужно только знать, как работать с логическими потоками аутентификации, что позволяет избежать необходимости повторять разработку кода аутентификации для каждого приложения. Существует множество провайдеров IDP, таких как Okta, Cognito, Azure Active Directory и другие.
Процесс централизованной аутентификации показан на рисунке: сначала пользователь инициирует запрос, а затем фронтальный шлюз отвечает за процесс аутентификации пользователя, взаимодействуя с поставщиком идентификационных данных и отправляя запрос на авторизацию поставщику идентификационных данных. Поставщик идентификационных данных возвращает информацию о пользователе. После того как шлюз завершает идентификацию пользователя, он передает информацию о нем внутреннему приложению в виде заголовка запроса.
Учебник по плагинам Apache APISIX
Мы получили достаточно теоретических знаний, теперь пришло время поиграть с Apache APISIX Auth Plugins. Однако нам следует усвоить пару основных понятий, прежде чем Apache APISIX заработает в соответствии с нашими потребностями. Вы можете прочитать документацию, если вы еще не знакомы со следующими понятиями.
- Маршрут – это самая важная концепция в Apache APISIX; она указывает APISIX, как перенаправить трафик в нужный апстрим.
- Upstream – это вид микросервисов бэкенда с точки зрения Apache APISIX.
- Plugin – это механизм для управления трафиком (аутентификация, авторизация и так далее) на стороне APISIX.
Предварительные условия
- Установленный Docker и компонент Docker Compose.
- Команда curl для тестирования API. Вы также можете использовать другие инструменты, например Postman, для тестирования.
Установите Apache APISIX
Загрузите Docker-образ Apache APISIX.
git clone https://github.com/apache/apisix-docker.git
Переключите текущий каталог на путь apisix-docker/example.
cd apisix-docker/example
Выполните команду docker-compose для установки Apache APISIX.
docker-compose -p docker-apisix up -d
Плагин базовой аутентификации HTTP
Apache APISIX basic-auth plugin – это плагин аутентификации, который работает с объектом consumer. В контексте HTTP-транзакции базовая аутентификация – это метод предоставления имени пользователя и пароля при выполнении запроса.
Давайте включим плагин basic-auth для потребителя и настроим значение имени пользователя и пароля.
curl http://127.0.0.1:9080/apisix/admin/consumers -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"username": "foo",
"plugins": {
"basic-auth": {
"username": "example_username",
"password": "your_strong_password"
}
}
}'
Когда потребитель будет успешно создан, в ответ вы получите следующий объект JSON:
{
"node": {
"value": {
"create_time": 1650866058,
"username": "foo",
"update_time": 1650866058,
"plugins": {
"basic-auth": {
"password": "your_strong_password",
"username": "example_username"
}
}
},
"key": "/apisix/consumers/foo"
},
"action": "set"
}
После этого нам нужно добавить Route и разрешить basic-auth
управлять запросами, указав их в настройках плагинов:
curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"methods": ["GET"],
"uri": "/get",
"plugins": {
"basic-auth": {}
},
"upstream_id": "1"
}'
Сервер Apache APISIX отвечает успехом:
{
"node": {
"value": {
"methods": [
"GET"
],
"upstream_id": "1",
"uri": "/get",
"update_time": 1650866398,
"plugins": {
"basic-auth": {
"hide_credentials": false
}
},
"status": 1,
"create_time": 1648567195,
"id": "1",
"priority": 0
},
"key": "/apisix/routes/1"
},
"action": "set"
}
На данный момент у нас все готово, и мы можем протестировать различные случаи ниже:
- Случай 1: Запрос конечной точки
/get
без данных авторизации.
curl -i http://127.0.0.1:9080/get
В ответ вы получите ошибку HTTP 401, как мы и ожидали:
{"message":"Missing authorization in request"}
- Случай 2: Когда пользователь предоставляет действительное имя пользователя и пароль.
curl -i -uexample_username:your_strong_password http://127.0.0.1:9080/get
Урраа! Теперь мы получили ответ 200 OK от восходящего потока, указывающий на то, что плагин аутентификации работает хорошо.
HTTP/1.1 200 OK
- Случай 3: Когда мы получаем доступ к восходящему потоку с неправильными учетными данными пользователя.
curl -i -uexample_username:wrong_password http://127.0.0.1:9080/get
Правильно, мы получили ошибку “Пароль неверен”.
{"message":"Password is error"}
Вот и все о настройке плагина basic-auth.
Плагин аутентификации по API-ключу
В предыдущем разделе мы продемонстрировали удобство использования одного из видов аутентификации с помощью плагина APISIX basic-auth
. Теперь давайте рассмотрим другой плагин key-auth
.
Плагин Apache APISIX key-auth Plugin – это плагин аутентификации, он должен работать вместе с потребителями.
Добавляет аутентификацию по ключу (также иногда называемому API-ключом) к сервису или маршруту. Потребители затем добавляют свой ключ либо в параметр строки запроса, либо в заголовок для аутентификации своих запросов.
Чтобы включить плагин key-auth
, необходимо выполнить два шага:
- Шаг 1: Создайте объект consumer и установите атрибуты плагина key-auth.
curl http://127.0.0.1:9080/apisix/admin/consumers -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"username": "example_username",
"plugins": {
"key-auth": {
"key": "auth-one"
}
}
}'
Ответ от APISIX можно ожидать следующим образом:
{
"node": {
"value": {
"username": "example_username",
"update_time": 1650822986,
"plugins": {
"key-auth": {
"key": "auth-one"
}
},
"create_time": 1650822986
},
"key": "/apisix/consumers/example_username"
},
"action": "set"
}
- Шаг 2: После того как мы включили плагин
key-auth
, мы можем создать новый маршрут и применить конфигурацию плагина key-auth. Для простоты мы можем сохранить JSON объект для плагина key-auth как пустой.
curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"methods": ["GET"],
"uri": "/get",
"plugins": {
"key-auth": {}
},
"upstream_id": "1"
}'
По умолчанию APISIX задает имя ключа как apiKey в заголовке, вы также можете настроить заголовок по умолчанию, добавив конфигурацию для плагина
key-auth
.
{
"key-auth": {
"header": "Authorization"
}
}
Вы получите следующий ответ от конечной точки Admin API:
{
"node": {
"value": {
"uri": "/get",
"priority": 0,
"status": 1,
"plugins": {
"key-auth": {
"header": "apikey",
"query": "apikey"
}
},
"create_time": 1648567195,
"update_time": 1650823379,
"methods": [
"GET"
],
"upstream_id": "1",
"id": "1"
},
"key": "/apisix/routes/1"
},
"action": "set"
}
Теперь мы можем протестировать наш плагин key-auth
, обратившись к нашей конечной точке GET без заголовка apiKey.
curl http://127.0.0.2:9080/get
Как мы и ожидали, возвращается ошибка с кодом 401 HTTP Status:
{"message":"Missing API key found in request"}
В качестве альтернативы, если мы укажем apiKey в заголовке, он должен ответить успехом:
curl http://127.0.0.2:9080/get -H 'apikey: auth-one' -i
Отлично, теперь аутентификация по API-ключу включена для конечной точки.
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 326
Connection: keep-alive
Другой сценарий – когда пользователь пытается получить доступ к конечной точке с неправильным apiKey
curl http://127.0.0.2:9080/get -H 'apikey: wrong_api_key' -i
Выход:
{"message":"Invalid API key in request"}
Плагин JWT
Плагин JWT (JSON Web Token) – еще один надежный вариант для аутентификации на шлюзе API. JWT упрощает настройку аутентификации и берет на себя все тонкости. Для получения дополнительной информации обратитесь к разделу JWT.
Apache APISIX JWT Plugin выступает в качестве эмитента, а также проверяет токен от имени API. Это означает, что разработчикам не нужно добавлять какой-либо код для обработки аутентификации.
Нам необходимо отключить плагин
key-auth
, который мы ранее включили, чтобы использовать другой плагин аутентификации. Отключение возможно через Dashboard или CLI.
Давайте применим плагин JWT к нашему существующему API. Мы обновим существующий конфиг плагина Consumer
с конфигурацией, связанной с JWT:
curl http://127.0.0.1:9080/apisix/admin/consumers -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"username": "example_consumer",
"plugins": {
"jwt-auth": {
"key": "user-key",
"secret": "my-secret-key"
}
}
}'
Ответ будет выглядеть примерно так:
{
"node": {
"key": "/apisix/consumers/example_consumer",
"value": {
"create_time": 1649158467,
"username": "example_consumer",
"update_time": 1649163154,
"plugins": {
"jwt-auth": {
"base64_secret": false,
"secret": "my-secret-key",
"algorithm": "HS256",
"key": "user-key",
"exp": 86400
}
}
}
},
"action": "set"
}
Теперь мы можем добавить плагин jwt-auth
к маршруту, который мы создали ранее:
curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"methods": ["GET"],
"uri": "/get",
"plugins": {
"jwt-auth": {}
},
"upstream_id": "1"
}'
Ответ:
{
"node": {
"key": "/apisix/routes/1",
"value": {
"upstream_id": "1",
"uri": "/get",
"create_time": 1648567195,
"status": 1,
"id": "1",
"plugins": {
"jwt-auth": {}
},
"priority": 0,
"methods": [
"GET"
],
"update_time": 1649163340
}
},
"action": "set"
}
Мы хотим проверить правильность настройки, как мы это делали ранее.
jwt-auth
по умолчанию использует алгоритм HS256.
Если вы используете алгоритм RS256, вы должны указать алгоритм и настроить открытый и закрытый ключи.
Для получения более подробной информации обратитесь к документации.
Сначала необходимо настроить маршрут для API, подписывающего токен, для чего будет использоваться плагин public-api.
curl http://127.0.0.1:9080/apisix/admin/routes/jas -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"uri": "/apisix/plugin/jwt/sign",
"plugins": {
"public-api": {}
}
}'
Ответ:
{
"action": "set",
"node": {
"key": "/apisix/routes/jas",
"value": {
"status": 1,
"priority": 0,
"id": "jas",
"update_time": 1649490287,
"plugins": {
"public-api": {}
},
"uri": "/apisix/plugin/jwt/sign",
"create_time": 1649490287
}
}
}
Затем выполните следующую команду, чтобы сгенерировать новый токен JWT:
curl http://127.0.0.1:9080/apisix/plugin/jwt/sign?key=user-key -i
Apache APISIX возвращает токен:
HTTP/1.1 200 OK
Date: Tue, 05 Apr 2022 12:57:34 GMT
Content-Type: text/plain; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Server: APISIX/2.12.1
<GENERATED_TOKEN>
Мы можем использовать сгенерированный токен для аутентификации нашего следующего запроса:
curl -i -X GET http://127.0.0.1:9080/get -H 'Authorization: <SET_GENERATED_TOKEN>'
Выход с токеном:
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 454
Connection: keep-alive
Date: Tue, 05 Apr 2022 13:02:30 GMT
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
Server: APISIX/2.12.1
Если вы попытаетесь получить доступ к той же конечной точке без маркера в заголовке запроса, вы получите HTTP Error _401 Unauthorized:
curl -i -X GET http://127.0.0.1:9080/get
Выход без маркера:
{ "message": "Missing JWT token in request" }
На демонстрации плагина JWT наш учебник по плагинам заканчивается.
Резюме
Мы подтвердили личность клиента, пытающегося сделать запрос, используя различные плагины аутентификации с помощью Apache APISIX. APISIX открыт для сотрудничества с различными подключаемыми функциями для новых адаптаций, а библиотека подключаемых модулей достаточно богата.
Чтобы узнать больше⤵️
➔ Скачать Apache APISIX
➔ Смотреть видеоурок Начало работы с Apache APISIX
➔ Смотреть видеоурок Начало работы с приборной панелью Apache APISIX
➔ Смотреть видеоурок Централизованная аутентификация с помощью плагинов Apache APISIX
➔ Установите Apache APISIX
➔ Смотрите видеоверсию статьи в блоге Наблюдаемость API с плагинами Apache APISIX
Сообщество⤵️
🙋 Присоединяйтесь к сообществу Apache APISIX
🐦 Следите за нами в Twitter
📝 Найдите нас в Slack
📧 Пишите нам со своими вопросами