Централизованная аутентификация с помощью плагинов Apache APISIX

В этой статье мы кратко опишем различные методы аутентификации, рассмотрим случаи использования и преимущества централизованной аутентификации с помощью Apache APISIX API Gateway, а также научимся настраивать такие распространенные плагины аутентификации, как basic, key и 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
📧 Пишите нам со своими вопросами

Оцените статью
Procodings.ru
Добавить комментарий