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=foo¶m2=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.
После успешного развертывания вам нужно убедиться:
- Casdoor можно войти и использовать как обычно.
- Установите значение
origin
Casdoor (conf/app.conf) наCASDOOR_HOSTNAME
.
Шаг 2: Настройка приложения Casdoor
- Создайте новое приложение Casdoor или используйте существующее.
- Добавьте URL перенаправления:
http://APISIX_HOSTNAME/REDIRECTWHATYOUWANT
, и заменитеREDIRECTWHATYOUWANT
на желаемый URL перенаправления. - Выберите "JWT-Empty" для опции формата токена.
- Добавьте желаемого провайдера и настройте другие параметры.
На странице настроек приложения вы найдете значения 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, как показано на скриншоте ниже.