Мой текущий вариант использования: у меня есть интерфейсное приложение, в котором пользователь вошел в систему через Keycloak. Я хотел бы реализовать некоторые части Ditto HTTP API в этом интерфейсе (https://www.eclipse.org/ditto/http-api-doc.html).
Например, я хочу создать политики (https://www.eclipse.org/ditto/basic-policy.html) для авторизации. Я читал в документации, что можно использовать поставщика, совместимого с OpenID Connect, и форма имеет следующий вид: (https://www.eclipse.org/ditto/basic-policy.html#who-can-be-addressed).
Внизу страницы есть базовый пример аутентификации, в этом случае, похоже, используется имя пользователя.
{
"policyId": "my.namespace:policy-a",
"entries": {
"owner": {
"subjects": {
"nginx:ditto": {
"type": "nginx basic auth user"
}
},
...
}
У меня вопрос: что именно будет под претензией, если я хочу использовать Keycloak? Это также имя пользователя, которому я хочу предоставить права? И как мне получить это в моем интерфейсе, где я хочу указать политику для отправки его в Ditto впоследствии?
ОБНОВЛЕНИЕ 1:
Я попытался включить аутентификацию keycloak в Ditto, как предложено ниже и как указано здесь: https://www.eclipse.org/ditto/installation-operating.html#openid-connect
Поскольку я запускаю Ditto с Docker Compose, я добавил следующую строку в качестве переменной среды в ditto / deployment / docker / docker-compose.yml в строке 136: - Dditto.gateway.authentication.oauth.openid-connect-issuers.keycloak=http://localhost:8090/auth/realms/twin
Этот URL такой же, как в заявлении эмитента моего токена, который Я получаю от Keycloak.
Теперь, если я попытаюсь сделать, например, почтовый запрос с помощью Postman для {{basePath}} / things, я получаю следующую ошибку:
<html>
<head>
<title>401 Authorization Required</title>
</head>
<body bgcolor="white">
<center>
<h1>401 Authorization Required</h1>
</center>
<hr>
<center>nginx/1.13.12</center>
</body>
</html>
Я выбрал Bearer Token в качестве Auth в Postman и вставил новый токен. Базовая аутентификация с пользователем по умолчанию все еще работает.
Должен ли я указывать новую тему / моего пользователя в Ditto раньше?
ОБНОВЛЕНИЕ 2:
Мне удалось отключить базовую аутентификацию в nginx, закомментировав auth_basic и auth_basic_user_file в nginx.conf!
Кажется, сейчас он пересылается Ditto, потому что теперь я получаю следующую ошибку с Postman:
{
"status": 401,
"error": "gateway:jwt.issuer.notsupported",
"message": "The JWT issuer 'localhost:8090/auth/realms/twin' is not supported.",
"description": "Check if your JWT is correct."
}
ОБНОВЛЕНИЕ 3:
Моя конфигурация в gateway.conf теперь выглядит так:
oauth {
protocol = "http"
openid-connect-issuers = {
keycloak = "localhost:8090/auth/realms/twin"
}
}
Я также попытался добавить эти две строки в docker-compose.yml:
- Dditto.gateway.authentication.oauth.protocol=http
- Dditto.gateway.authentication.oauth.openid-connect-issuers.keycloak=localhost:8090/auth/realms/twin
К сожалению, мне все еще не повезло, та же ошибка, что и выше: / Похоже, что у пользователя была аналогичная проблема с keycloak раньше (https://gitter.im/eclipse/ditto?at=5de3ff186a85195b9edcb1a6), но, к сожалению, он не упомянул о решении.
РЕДАКТИРОВАТЬ: Оказывается, я неправильно указал эти переменные, правильное решение - добавить их как часть command: java ...
дополнительной информации здесь
ОБНОВЛЕНИЕ 4:
Я попытался собрать Ditto локально, вместо того, чтобы использовать последние образы докеров, и я думаю, что могу сделать еще один шаг вперед, похоже, моя конфигурация oauth работает. Я получаю сейчас:
{
"status": 503,
"error": "gateway:publickey.provider.unavailable",
"message": "The public key provider is not available.",
"description": "If after retry it is still unavailable, please contact the service team."
}
Сообщение об ошибке из журнала:
gateway_1 | 2020-11-05 15:33:18,669 WARN [] o.e.d.s.g.s.a.j.DittoPublicKeyProvider - Got Exception from discovery endpoint <http://localhost:8090/auth/realms/twin/.well-known/openid-configuration>.
gateway_1 | akka.stream.StreamTcpException: Tcp command [Connect(localhost:8090,None,List(),Some(10 seconds),true)] failed because of java.net.ConnectException: Connection refused
gateway_1 | Caused by: java.net.ConnectException: Connection refused
...
gateway_1 | java.util.concurrent.CompletionException: org.eclipse.ditto.services.gateway.security.authentication.jwt.PublicKeyProviderUnavailableException [message='The public key provider is not available.', errorCode=gateway:publickey.provider.unavailable, statusCode=SERVICE_UNAVAILABLE, description='If after retry it is still unavailable, please contact the service team.', href=null, dittoHeaders=ImmutableDittoHeaders [{}]]
...
gateway_1 | Caused by: org.eclipse.ditto.services.gateway.security.authentication.jwt.PublicKeyProviderUnavailableException [message='The public key provider is not available.', errorCode=gateway:publickey.provider.unavailable, statusCode=SERVICE_UNAVAILABLE, description='If after retry it is still unavailable, please contact the service team.', href=null, dittoHeaders=ImmutableDittoHeaders [{}]]
...
gateway_1 | Caused by: akka.stream.StreamTcpException: Tcp command [Connect(localhost:8090,None,List(),Some(10 seconds),true)] failed because of java.net.ConnectException: Connection refused
gateway_1 | Caused by: java.net.ConnectException: Connection refused
Мой кейлоак определенно работает, я могу получить жетоны. Если я открываю http://localhost:8090/auth/realms/twin/.well-known/openid-configuration
, который указан в первом сообщении об ошибке, я могу увидеть свою конфигурацию openid из конфигурации keycloak. Изменить: похоже, что мой контейнер шлюза не может добраться до моего контейнера keycloak, попытаюсь понять это.
ОКОНЧАТЕЛЬНОЕ ОБНОВЛЕНИЕ:
Проблема заключалась в недоступности контейнера докеров keycloak из контейнера докеров шлюза. Сейчас пользуюсь traefik:
- Контейнер Keycloak имеет следующий псевдоним: keycloak.localhost
- Конфигурация Oauth в шлюзе выглядит так:
oauth {
protocol = "http"
openid-connect-issuers = {
keycloak = "keycloak.localhost/auth/realms/twin"
}
}
- Теперь шлюз может найти контейнер keycloak через псевдоним, и я все еще могу использовать пользовательский интерфейс администратора keycloak из моего localhoast: http://keycloak.localhost:8090/auth/admin/
Дополнительная информация: Traefic Blog