Я ознакомился с документацией, и то, чего вы хотите, может быть достигнуто путем защиты вашего сервера ресурсов (вашего приложения), чтобы он действовал как UMA-защищенный сервер ресурсов. Вот вам базовый пример того, что может быть достигнуто с помощью этого:
Keycloak - это сервер авторизации, совместимый с UMA 2.0, который обеспечивает большинство возможностей UMA.
КакНапример, рассмотрим пользователя Алиса (владелец ресурса), использующего службу интернет-банкинга (сервер ресурсов) для управления своим банковским счетом (ресурсом).Однажды Алиса решает открыть свой банковский счет Бобу (запрашивающая сторона), специалисту по бухгалтерскому учету.Однако у Боба должен быть доступ только к просмотру (области действия) учетной записи Алисы.
В качестве сервера ресурсов служба интернет-банкинга должна иметь возможность защищать банковский счет Алисы.Для этого он использует конечную точку регистрации ресурса Keycloak для создания ресурса на сервере, представляющего банковский счет Алисы.
В этот момент, если Боб попытается получить доступ к банковскому счету Алисы, доступ будет запрещен.Служба интернет-банкинга определяет несколько политик по умолчанию для банковских счетов.Один из них заключается в том, что только владелец, в данном случае Алиса, имеет доступ к ее банковскому счету.
Однако служба интернет-банкинга в отношении конфиденциальности Алисы также позволяет ей изменять определенные политики для банковского счета.Одна из этих политик, которую она может изменить, - определить, кому разрешено просматривать ее банковский счет.Для этого служба Интернет-банкинга использует Keycloak для предоставления Алисе места, где она может выбирать отдельных лиц и операции (или данные), к которым им разрешен доступ.В любое время Алиса может отозвать доступ или предоставить Бобу дополнительные разрешения.
Затем использовать средства принудительного применения политики, чтобы активировать эту защиту:
Если сервер ресурсов защищенисполнителем политики он отвечает на запросы клиентов на основе разрешений, переносимых вместе с токеном-носителем.Как правило, когда вы пытаетесь получить доступ к серверу ресурсов с токеном-носителем, которому не хватает разрешений для доступа к защищенному ресурсу, сервер ресурсов отвечает кодом состояния 401 и заголовком WWW-Authenticate.
HTTP/1.1 401 Unauthorized
WWW-Authenticate: UMA realm="${realm}",
as_uri="https://${host}:${post}/auth/realms/${realm}",
ticket="016f84e8-f9b9-11e0-bd6f-0021cc6004de"
Здесь нужно сделать две части.Во-первых, добавьте принудительное применение политики для путей приложения, которые вы хотите защитить.Затем, и вот вам соус, вам нужно настроить UMA-часть .Хорошая сторона UMA заключается в том, что она добавляет дополнительную систему заявок в процесс авторизации, и эти заявки назначаются для каждого ресурса (фактически они назначаются при попытке доступа к защищенному ресурсу).
Клиент запрашивает защищенный ресурс без отправки RPT
curl -X GET \
http://${host}:8080/my-resource-server/resource/1bfdfe78-a4e1-4c2d-b142-fc92b75b986f
Сервер ресурсов отправляет ответ клиенту обратно с разрешением билета и параметром as_uri с расположением Keycloakсервер, куда билет должен быть отправлен для получения RPT.Сервер ресурсов отвечает билетом разрешения
HTTP/1.1 401 Unauthorized
WWW-Authenticate: UMA realm="${realm}",
as_uri="https://${host}:${post}/auth/realms/${realm}",
ticket="016f84e8-f9b9-11e0-bd6f-0021cc6004de"
Таким образом, клиент запрашивает ресурс, и ему выдается билет с указанием местоположения сервера Keycloak, чтобы обменять этот билет на RPT.Это клиент, выставляющий конечную точку токена, чтобы получить RPT:
curl -X POST \
http://${host}:${port}/auth/realms/${realm}/protocol/openid-connect/token \
-H "Authorization: Bearer ${access_token}" \
--data "grant_type=urn:ietf:params:oauth:grant-type:uma-ticket" \
--data "ticket=${permission_ticket} \
--data "submit_request=true"
Это даст вам RPT, который действителен только для доступа к ресурсу, который вы запросили в первый раз.Скажите это:
{
"authorization": {
"permissions": [
{
"resource_set_id": "d2fe9843-6462-4bfc-baba-b5787bb6e0e7",
"resource_set_name": "Hello World Resource"
}
]
},
"jti": "d6109a09-78fd-4998-bf89-95730dfd0892-1464906679405",
"exp": 1464906971,
"nbf": 0,
"iat": 1464906671,
"sub": "f1888f4d-5172-4359-be0c-af338505d86c",
"typ": "kc_ett",
"azp": "hello-world-authz-service"
}
Вам также необходимо управлять доступом пользователей к своим ресурсам .Здесь это делается с помощью интерфейса администратора, но вам может потребоваться правильно настроить его из своего приложения, вызывая API Keycloak.