Авторизация с двумя Keycloaks и общими токенами

У меня следующая ситуация. Некоторые пользователи авторизованы для моей серверной службы с грантами прямого доступа, но те, кто являются администраторами, находятся на втором Keycloak с другим клиентом и областью, и мне также нужно иметь возможность получить действительные токены для первого Keycloak для них. . Я зарегистрировал второй Keycloak с администраторами в Identity Provider первого, и если я использую обычный рабочий процесс в Интернете из первого, я могу войти в систему с пользователем-администратором, но я остаюсь на странице первого Keycloak, и я могу не получить токены этого пользователя в моем бэкэнде. При попытке изменить redirect_uri выдает ошибку, что не разрешено, хоть и ставлю * в клиенте второго. Это мои настройки для обоих Keycloaks.

Как я могу получить токен для пользователя из второго Keycloak, который также действителен в первом Keycloak?

Настройки первого Keycloak Identity Provider:

  "identityProviders": [
{
  "alias": "keycloak-oidc",
  "internalId": "c3a3b1db-65ee-49df-b517-bfba6c355696",
  "providerId": "keycloak-oidc",
  "enabled": true,
  "updateProfileFirstLoginMode": "on",
  "trustEmail": false,
  "storeToken": true,
  "addReadTokenRoleOnCreate": true,
  "authenticateByDefault": false,
  "linkOnly": false,
  "firstBrokerLoginFlowAlias": "first broker login",
  "config": {
    "userInfoUrl": "http://host.docker.internal:909/auth/realms/vrp-realm-adm/protocol/openid-connect/userinfo",
    "hideOnLoginPage": "false",
    "clientId": "vrp-client-adm",
    "tokenUrl": "http://host.docker.internal:909/auth/realms/vrp-realm-adm/protocol/openid-connect/token",
    "acceptsPromptNoneForwardFromClient": "false",
    "backchannelSupported": "false",
    "useJwksUrl": "true",
    "loginHint": "false",
    "authorizationUrl": "http://host.docker.internal:909/auth/realms/vrp-realm-adm/protocol/openid-connect/auth",
    "clientAuthMethod": "client_secret_post",
    "logoutUrl": "http://host.docker.internal:909/auth/realms/vrp-realm-adm/protocol/openid-connect/logout",
    "syncMode": "IMPORT",
    "clientSecret": "**********"
  }
}

Настройки второго клиента Keycloak:

{
  "id": "f873a96c-6468-4737-b576-bdf610fb9597",
  "clientId": "vrp-client-adm",
  "rootUrl": "http://localhost:808",
  "adminUrl": "http://localhost:808",
  "surrogateAuthRequired": false,
  "enabled": true,
  "alwaysDisplayInConsole": false,
  "clientAuthenticatorType": "client-secret",
  "secret": "**********",
  "redirectUris": [
    "*"
  ],
  "webOrigins": [
    "*"
  ],
  "notBefore": 0,
  "bearerOnly": false,
  "consentRequired": false,
  "standardFlowEnabled": false,
  "implicitFlowEnabled": true,
  "directAccessGrantsEnabled": true,
  "serviceAccountsEnabled": true,
  "publicClient": false,
  "frontchannelLogout": false,
  "protocol": "openid-connect",
  "attributes": {
    "saml.multivalued.roles": "false",
    "saml.force.post.binding": "false",
    "frontchannel.logout.session.required": "false",
    "oauth2.device.authorization.grant.enabled": "false",
    "backchannel.logout.revoke.offline.tokens": "false",
    "saml.server.signature.keyinfo.ext": "false",
    "use.refresh.tokens": "true",
    "oidc.ciba.grant.enabled": "true",
    "backchannel.logout.session.required": "true",
    "client_credentials.use_refresh_token": "false",
    "saml.client.signature": "false",
    "require.pushed.authorization.requests": "false",
    "saml.allow.ecp.flow": "false",
    "saml.assertion.signature": "false",
    "id.token.as.detached.signature": "false",
    "client.secret.creation.time": "1668867137",
    "saml.encrypt": "false",
    "saml.server.signature": "false",
    "exclude.session.state.from.auth.response": "false",
    "saml.artifact.binding": "false",
    "saml_force_name_id_format": "false",
    "tls.client.certificate.bound.access.tokens": "false",
    "acr.loa.map": "{}",
    "saml.authnstatement": "false",
    "display.on.consent.screen": "false",
    "token.response.type.bearer.lower-case": "false",
    "saml.onetimeuse.condition": "false"
  },
  "authenticationFlowBindingOverrides": {},
  "fullScopeAllowed": true,
  "nodeReRegistrationTimeout": -1,
  "protocolMappers": [
    {
      "id": "6e02e265-af71-4af2-9253-ac26051053a4",
      "name": "Client IP Address",
      "protocol": "openid-connect",
      "protocolMapper": "oidc-usersessionmodel-note-mapper",
      "consentRequired": false,
      "config": {
        "user.session.note": "clientAddress",
        "id.token.claim": "true",
        "access.token.claim": "true",
        "claim.name": "clientAddress",
        "jsonType.label": "String"
      }
    },
    {
      "id": "2173ad2e-953d-401a-816b-19d920f7fa16",
      "name": "Client ID",
      "protocol": "openid-connect",
      "protocolMapper": "oidc-usersessionmodel-note-mapper",
      "consentRequired": false,
      "config": {
        "user.session.note": "clientId",
        "id.token.claim": "true",
        "access.token.claim": "true",
        "claim.name": "clientId",
        "jsonType.label": "String"
      }
    },
    {
      "id": "2aad6645-174c-4dcd-b711-4eb388dbac3e",
      "name": "Client Host",
      "protocol": "openid-connect",
      "protocolMapper": "oidc-usersessionmodel-note-mapper",
      "consentRequired": false,
      "config": {
        "user.session.note": "clientHost",
        "id.token.claim": "true",
        "access.token.claim": "true",
        "claim.name": "clientHost",
        "jsonType.label": "String"
      }
    }
  ],
  "defaultClientScopes": [
    "web-origins",
    "acr",
    "profile",
    "roles",
    "email"
  ],
  "optionalClientScopes": [
    "address",
    "phone",
    "offline_access",
    "microprofile-jwt"
  ]
} 

Я думаю, что вам может понадобиться функция «федерация провайдеров удостоверений» или Keycloak, где вы можете подключить несколько провайдеров удостоверений. (Не обязательно должны быть все экземпляры Keycloak.) Нашел документы (keycloak.org/docs/latest/server_admin/#_identity_broker), но сам не пробовал.

cyberbrain 14.12.2022 20:55
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Как включить TLS в gRPC-клиенте и сервере : 2
Как включить TLS в gRPC-клиенте и сервере : 2
Здравствуйте! 🙏🏻 Надеюсь, у вас все хорошо и добро пожаловать в мой блог.
Сортировка hashmap по значениям
Сортировка hashmap по значениям
На Leetcode я решал задачу с хэшмапой и подумал, что мне нужно отсортировать хэшмапу по значениям.
Принципы SOLID - лучшие практики
Принципы SOLID - лучшие практики
SOLID - это аббревиатура, обозначающая пять ключевых принципов проектирования: принцип единой ответственности, принцип "открыто-закрыто", принцип...
gRPC на Android с использованием TLS
gRPC на Android с использованием TLS
gRPC - это относительно новая концепция взаимодействия между клиентом и сервером, но не более.
0
1
84
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Я нашел следующую статью, которая помогла мне выполнить процесс аутентификации, бросив 2 экземпляра keycloak.

https://www.jessym.com/articles/stateless-oauth2-social-logins-with-spring-boot

Я подробно описал, как добиться мультиарендности на сервере ресурсов Spring с декодером JWT в этом ответе.

Все серверы авторизации, являющиеся Keycloak, не важны. Решение, которое я предложил, заключается в том, чтобы серверы ресурсов принимали идентификаторы, испускаемые более чем одним эмитентом (вместо этого используйте список доверенных эмитентов). Таким образом, клиенты или пользователи могут выбрать предпочитаемый сервер авторизации в этом списке.

Спасибо, но требование заказчика состоит в том, чтобы администраторы были аутентифицированы вторым Keycloak. Мультитенантность у меня не работает

Yonchev 23.12.2022 16:32

Мне может понадобиться ваше определение мультиарендности, чтобы понять. То, о чем я говорю, полностью совместимо с аутентификацией администраторов сервером авторизации (арендатор A), а других пользователей — другим сервером (арендатор B).

ch4mp 23.12.2022 16:43

Федерация удостоверений требуется только тогда, когда один сервер авторизации выдает непрозрачные токены или не включает ваш ресурс-сервер в свою аудиторию.

ch4mp 23.12.2022 17:00

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