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 и убедитесь, что указанный дом принадлежит пользователю в базе данных приложения.

V-ladynev / keycloak-nodejs-пример

Другие вопросы по тегам