Keycloak: authZ с узлом JS
Я пытаюсь защитить REST API, используя механизмы авторизации keycloak. Мой API в NodeJS с экспрессом.
Скажем, у меня есть этот API:
http://www.example.com/api/v1/houses
Конечная точка поддерживает GET/POST/PUT/DELETE. Дом имеет имя и владельца:
{
name: 'myhouse',
owner: 'smith'
}
Каждый может просматривать дома. Вы также можете создавать дома и автоматически становиться владельцем. Только владелец может удалить дом. Это похоже на пример photoz.
Использование Keycloak Connect в режиме "только носитель" работает с nodeJS express:
router.get('/houses*', keycloakProtect(), myHandler)
Но это обеспечивает только аутентификацию, а не авторизацию. По сути, он просто проверяет, что вы предоставили правильный токен. KeycloakProtect предоставляет элементарный механизм авторизации, основанный только на именах ролей. Тем не менее, я хотел бы использовать все возможности клиентских авторизаций (с ресурсами, областями действия и политиками)... Есть ли какая-либо поддержка NodeJS для этого? Если нет, то как использовать API Keycloak для этого?
2 ответа
Я нашел начало ответа с помощью API:
TOKEN=`curl -X POST -H "Content-Type: application/x-www-form-urlencoded" -d 'username=username&password=password&grant_type=password&client_id=myclient&client_secret=myclientsecret' "http://localhost:8080/auth/realms/myrealm/protocol/openid-connect/token" | jq .access_token -r`
curl -X POST -H "Content-Type: application/json" -H "Authorization: Bearer $TOKEN" -d '{
"permissions" : [
{
"resource_set_name" : "Houses",
"scopes" : [
"view"
]
}
]
}' "http://localhost:8080/auth/realms/myrealm/authz/entitlement/myclient"
На второй вызов ответят 200, если разрешено, и 403, если нет.
Чтобы определить политики авторизации в Keycloak, включите "Авторизации" в вашем клиенте. На новой вкладке "Авторизация":
- настройки
- Включить "удаленное управление ресурсами"
- Ресурс Создайте один:
- Название: Дома
- Области применения: создание, просмотр, обновление, удаление
- URI: / дома /*
- Области создания 4 области: создание, просмотр, обновление, удаление
- Политики Создайте политику на основе ролей с:
- имя: public_role_policy
- описание: пользователю должна быть разрешена роль "public"
- королевские роли: публичные
- Разрешения Создать один с:
- Название: "Общественная роль позволяет просматривать дома"
- ресурс: дома
- Области применения: вид
- policy: public_role_policy
Вы также должны создать роль "public" и предоставить ее своим пользователям.
Следующее, что вам нужно сделать, это создать ресурсы удаленно. Сначала получите клиентский токен:
TOKEN=`curl -X POST \
-H "Content-Type: application/x-www-form-urlencoded" \
-d 'grant_type=client_credentials&client_id=myclient&client_secret=myclientsecret'
"http://localhost:8080/auth/realms/${realm_name}/protocol/openid-connect/token" | jq .access_token -r`
Затем создайте ресурсы:
curl -X POST "http://localhost:8080/auth/realms/myrealm/authz/protection/resource_set" -H "Authorization: Bearer $TOKEN" -d '{
"name": "My house",
"uri": "/houses/123",
"scopes": [
{
"id": "da776461-c1f5-4904-a559-1ca04d9f53a9",
"name": "view"
},
{
"id": "2615157c-f588-4e2b-ba1c-720fe8394215",
"name": "manage"
}
],
"owner": "0892e431-5daf-413e-b4cf-eaee121ee447"
}'
Я продвинулся немного дальше с аналогичной задачей. Но я не создаю ресурсы. Может быть, ваш подход лучше. Не знаю
Чтобы проверить владельца дома, я собираюсь использовать проверку базы данных - просто получите логин пользователя с токена Keycloak и убедитесь, что указанный дом принадлежит пользователю в базе данных приложения.