Keycloak: authZ с nodeJS

Я пытаюсь защитить 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? Если нет, как использовать для этого Keycloak API?


person cdupont    schedule 14.11.2017    source источник
comment
Как обеспечить соблюдение политик в приложении node.js?   -  person Siva Thangaraj    schedule 11.12.2018
comment
Библиотека Keycloak nodejs теперь обновлена ​​функцией keycloak.enforcer (...), которая должна соответствовать вашим потребностям.   -  person mumblesNZ    schedule 07.05.2019


Ответы (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, включите «Авторизация» в вашем клиенте. На новой вкладке «Авторизация»:

  • Settings
    • Enable "remote resource management"
  • Resource Create one:
    • name: Houses
    • области: создание, просмотр, обновление, удаление
    • uri: / homes / *
  • Области создают 4 области: создание, просмотр, обновление, удаление.
  • Policies Create a role based policy with:
    • name: public_role_policy
    • описание: пользователь должен иметь роль "общедоступная", чтобы быть разрешенным
    • роли в сфере: публичные
  • Permissions Create one with:
    • name: "public role allows to view houses"
    • ресурс: Дома
    • объемы: просмотр
    • политика: 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"
}'
person cdupont    schedule 14.11.2017
comment
Каким-то образом я получаю 404, когда запрашиваю entitlement api. Не могли бы вы поделиться со мной конфигурациями ваших игровых миров? - person mateeyow; 01.10.2018
comment
@mateeyow В последней версии конечной точки полномочий Keycloak была удалена. Он был объединен с конечной точкой токена. Конечная точка токена также может предоставить вам авторизацию: keycloak.org/docs/ последняя / authorization_services / - person cdupont; 01.10.2018

Я продвинулся немного дальше с аналогичной задачей. Но я не создаю ресурсы. Может ваш подход лучше. Не знаю.

Чтобы проверить владельца дома, я собираюсь использовать проверку базы данных - просто получите логин пользователя из токена Keycloak и убедитесь, что указанный дом принадлежит пользователю в базе данных приложения.

v-ladynev / keycloak-nodejs-example

person v.ladynev    schedule 20.11.2017
comment
Как включить применение политик в приложении node..js? Я должен обеспечить соблюдение правил от сокола Keycloak. - person Siva Thangaraj; 11.12.2018
comment
@SivaThangaraj Я использую эту конфигурацию github.com/v-ladynev/ - person v.ladynev; 11.12.2018
comment
Спасибо, но как мне применить политики в приложении без использования базы данных? - person Siva Thangaraj; 11.12.2018
comment
stackoverflow.com/questions/53722033/ не могли бы вы объяснить конфигурации адаптера? - person Siva Thangaraj; 11.12.2018