Я понял, что есть много итераций этого вопроса.Но я не могу понять ответ правильно.
Мы защитили наши конечные точки rabbitmq и rest с помощью пружинного сервера oauth2 , аналогичного этому посту .Но он не имеет всех функций, которые нам нужны и которые мы хотим.Поэтому мы хотели бы использовать Keycloak.Я успешно защитил остальную конечную точку, просто перейдя на новую версию Spring Security 5.1 и указав security.oauth2.resource.jwk.key-set-uri и установив необходимые зависимости и конфигурацию.
При попытке защитить RabbitMQ я столкнулся с проблемами при проверке токена носителя из заголовка сообщения, поскольку конечная точка jclo для keycloak не возвращает истинный открытый ключ RSA.
RabbitMQ использует CustomMessageListenerContainer для получения токена из заголовка сообщения и использования DefaultTokenServices для проверки токена.
Насколько я понимаю, конечная точка, которая отвечает ключом: https://keycloak -сервер / auth / realms / my-realm / protocol / openid-connect / certs Создание HttpGet для этогоконечная точка, я получаю ответ, который выглядит следующим образом
{
"keys": [{
"kid": "7JUbcl_96GNk2zNh4MAORuEz3YBuprXilmTXjm0gmRE",
"kty": "RSA",
"alg": "RS256",
"use": "sig",
"n": "nE9gEtzZvV_XisnAY8Hung399hwBM_eykZ9J57euboEsKra8JvDmE6w7SSrk-aTVjdNpjdzOyrFd4V7tFqev1vVJu8MJGIyQlbPv07MTsgYE5EPM4DxdQ7H6_f3vQjq0hznkFvC-hyCqUhxPTXM5NgvH86OekL2C170xnd50RLWw8FbrprP2oRjgBnXMAif1Dd8kwbKKgf5m3Ou0yTVGfsCRG1_LSj6gIEFglxNHvGz0RejoQql0rGMxcW3MzCvc-inF3FCafQTrG5eWHqp5xXEeMHz0JosQ7BcT8MVp9lHT_utiazhQ1uKZEb4uoYOyy6mDDkx-wExpZkOx76bk_Yu-N25ljY18hNllnV_8gVMkX46_vcc-eN3DRZGNJ-Asd_sZrjbXbAvBbKwVxZeOTaXiUdvl8O0G5xX2xPnS_WA_1U4b_V1t28WtnX4bqGlOejW2kkjLvNrpfQ5fnvLjkl9I2B16Mbh9nS0LJD0RR-AkBsv3rKEnMyEkW9UsfgYKLFKuH32x_CXi9uyvNDas_q8WS3QvYwAGEMRO_4uICDAqupCVb1Jcs9dvd1w-tUfj5MQOXB-srnQYf5DbFENTNM1PK390dIjdLJh4k2efCJ21I1kYw2Qr9lHI4X2peTinViaoOykykJiol6LMujUcfqaZ1qPKDy_UnpAwGg9NyFU",
"e": "AQAB"
}
]
}
Насколько я понимаю, поле с ключом "n" должно быть ключом RSA256.Добавление его в RSAVerifier в конечном итоге приводит к ошибке «Причины: org.springframework.security.jwt.codec.InvalidBase64CharacterException: Неверный ввод Base64 десятичного знака 95 в позиции массива 2.»
Однако, если я войду воткройте страницу администратора keycloak и перейдите в настройки области -> ключи и щелкните открытый ключ. Во всплывающем окне отображается открытый ключ минус «----- BEGIN PUBLIC KEY -----» и «----- END PUBLIC».КЛЮЧ ----- "колонтитулы.Жесткое кодирование позволяет работать всем.
Кодируется ли ключ?Я попытался сделать Base64Utils.decodeFromUrlSafeString и Base64Utils.decodeFromString.Первый возвращает что-то меньшее и не похожее на ключ, а затем создает исключение незаконного аргумента Недопустимый символ base64 5f.
Обновление: возвращаемое n является модульным, а e - открытым показателем открытого ключа.Но как получить фактическую строку ключа?