Перейти к основному содержанию

APISIX

В настоящее время существуют 2 способа использования Casdoor для подключения к APISIX через плагины APISIX и защиты API за APISIX: использование плагина Casdoor APISIX или плагина OIDC APISIX.

Подключите Casdoor через плагин Casdoor APISIX

Этот плагин, authz-casdoor, может защищать API за APISIX, заставляя каждый отдельный запрос проходить аутентификацию без изменения кода API.

Как его включить

Вам нужно указать этот плагин при создании маршрута и предоставить все необходимые поля. Вот пример.

curl "http://127.0.0.1:9180/apisix/admin/routes/1" -H "X-API-KEY: edd1c9f034335f136f87ad84b625c8f1" -X PUT -d '
{
"methods": ["GET"],
"uri": "/anything/*",
"plugins": {
"authz-casdoor": {
"endpoint_addr":"http://localhost:8000",
"callback_url":"http://localhost:9080/anything/callback",
"client_id":"7ceb9b7fda4a9061ec1c",
"client_secret":"3416238e1edf915eac08b8fe345b2b95cdba7e04"
}
},
"upstream": {
"type": "roundrobin",
"nodes": {
"httpbin.org:80": 1
}
}
}'

В этом примере мы создали маршрут "/anything/*" указывающий на "httpbin.org:80" с использованием административного API APISIX, с включенным плагином "authz-casdoor". Этот маршрут теперь находится под защитой аутентификации Casdoor.

Атрибуты

ИмяТипТребованиеПо умолчаниюДействительныйОписание
endpoint_addrстрокатребуетсяURL-адрес Casdoor.
client_idстрокатребуетсяID клиента в Casdoor.
client_secretстрокатребуетсяСекрет клиента в Casdoor.
callback_urlстрокатребуетсяURL-адрес обратного вызова, который используется для получения состояния и кода.

endpoint_addr и callback_url не должны оканчиваться на '/'

В конфигурации плагина "authz-casdoor" мы видим четыре параметра.

Первый - это "callback_url". Это URL обратного вызова в OAuth2. Следует подчеркнуть, что этот URL обратного вызова должен принадлежать "uri", который вы указали для маршрута. Например, в этом примере, http://localhost:9080/anything/callback очевидно принадлежит "/anything/*". Только таким образом, посещение callback_url может быть перехвачено и использовано плагином (чтобы плагин мог получить код и состояние в OAuth2). Логика callback_url полностью реализована плагином, поэтому нет необходимости изменять сервер для реализации этого обратного вызова.

Второй параметр "endpoint_addr" очевидно является URL-адресом Casdoor. Третий и четвертый параметры - это "client_id" и "client_secret", которые вы можете получить от Casdoor при регистрации приложения.

Как это работает?

Предположим, новый пользователь, который никогда раньше не посещал этот маршрут, собирается посетить его (http://localhost:9080/anything/d?param1=foom2=bar). Учитывая, что включен "authz-casdoor", это посещение сначала будет обработано плагином "authz-casdoor". После проверки сессии и подтверждения, что этот пользователь не был аутентифицирован, посещение будет перехвачено. Сохраняя оригинальный URL, который пользователь хочет посетить, они будут перенаправлены на страницу входа в систему Casdoor.

После успешного входа в систему с использованием имени пользователя и пароля (или любого другого метода), Casdoor перенаправит этого пользователя на "callback_url" с указанными GET-параметрами "code" и "state". Поскольку "callback_url" известен плагину, когда в этот раз перехватывается посещение "callback_url", будет запущена логика "Authorization code Grant Flow" в OAuth2. Это означает, что плагин запросит токен доступа, чтобы подтвердить, что этот пользователь действительно вошел в систему. После этого подтверждения плагин перенаправит этого пользователя на оригинальный URL, который они хотели посетить, который мы ранее сохранили. Статус входа в систему также будет сохранен в сессии.

В следующий раз, когда этот пользователь захочет посетить URL за этим маршрутом (например, http://localhost:9080/anything/d), после обнаружения, что этот пользователь был аутентифицирован ранее, этот плагин больше не будет перенаправлять этого пользователя. Таким образом, пользователь может посещать все, что он хочет, под этим маршрутом, не сталкиваясь с помехами.

Подключите Casdoor через плагин OIDC APISIX

Casdoor может использовать протокол OIDC для подключения к APISIX, и этот документ покажет вам, как это сделать.

Вот некоторые из имен, используемых в конфигурации:

CASDOOR_HOSTNAME: Доменное имя или IP, где развернут сервер Casdoor.

APISIX_HOSTNAME: Доменное имя или IP, где развернут APISIX.

Шаг 1: Развертывание Casdoor и APISIX

Сначала разверните Casdoor и APISIX.

После успешного развертывания вам нужно убедиться:

  1. Casdoor можно войти и использовать как обычно.
  2. Установите значение origin Casdoor (conf/app.conf) на CASDOOR_HOSTNAME. Casdoor conf

Шаг 2: Настройка приложения Casdoor

  1. Создайте новое приложение Casdoor или используйте существующее.
  2. Добавьте URL перенаправления: http://APISIX_HOSTNAME/REDIRECTWHATYOUWANT, и замените REDIRECTWHATYOUWANT на желаемый URL перенаправления.
  3. Выберите "JWT-Empty" для опции формата токена.
  4. Добавьте желаемого провайдера и настройте другие параметры.

Настройка приложения На странице настроек приложения вы найдете значения Client ID и Client Secret, как показано на картинке выше. Мы будем использовать их на следующем шаге.

Откройте ваш любимый браузер и посетите: http://CASDOOR_HOSTNAME/.well-known/openid-configuration, где вы найдете конфигурацию OIDC Casdoor.

Шаг 3: Настройка APISIX

У APISIX есть официальная поддержка OIDC, которая реализована с использованием lua-resty-openidc.

Вы можете настроить параметры в соответствии с документацией APISIX OIDC. Будут использованы следующие настройки маршрутизации:

# Use your own X-Api-Key
$ curl -X POST APISIX_HOSTNAME/apisix/admin/routes -H "X-Api-Key: edd1c9f034335f136f87ad84b625c8f1" -d '{
"uri": "/get",
"name": "apisix_casdoor_test",
"plugins": {
"openid-connect": {
"client_id": "Client ID",
"client_secret": "Client Secret",
"discovery": "http://CASDOOR_HOSTNAME/.well-known/openid-configuration",
"introspection_endpoint_auth_method": "client_secret_basic",
"logout_path": "/logout",
"realm": "master",
"redirect_uri": "http://APISIX_HOSTNAME/REDIRECTWHATYOUWANT",
"bearer_only": false,
"set_id_token_header": false,
"access_token_in_authorization_header": true,
"set_access_token_header": true,
"set_userinfo_header": false,
"realm": "master"
}
},
"upstream": {
"type": "roundrobin",
"nodes": {
"httpbin.org:80": 1
}
}
}'

Теперь посетите http://APISIX_HOSTNAME/get, и браузер перенаправит вас на страницу входа в систему Casdoor. После успешного входа в систему вы увидите, что запрос был отправлен на httpbin.org, как показано на скриншоте ниже. APISIX_Result