Неверная подпись при проверке Keycloak JWT, подписанного с EC512 - PullRequest
0 голосов
/ 18 декабря 2018

Я использую Keycloak 4.8.0 в качестве сервера аутентификации.Я настроил область, которая выпускает JWT, который подписан с EC512.Я получаю токен через конечную точку https://example.com/auth/realms/myrealm/protocol/openid-connect/token, предоставляя идентификатор клиента, секрет клиента, имя пользователя и пароль пользователя.

При анализе JWT с Keycloak через https://example.com/auth/realms/myrealm/protocol/openid-connect/token/introspect он отображается как действительный.Затем у меня есть приложение Node.js, созданное поверх LoopBack 4, которое предоставляет сервис REST.Там я хочу проверить полученный JWT с passport-jwt.Я предоставил открытый ключ, но всегда получаю ошибку TypeError: "ES512" signatures must be "132" bytes, saw "138".(Интересно, что при использовании Keycloak 4.7.0 ошибка была TypeError: "ES512" signatures must be "132" bytes, saw "139").

Таким образом, подпись кажется недействительной.Например, https://jwt.io может декодировать JWT, но также не показывает действительную подпись, когда предоставляется с открытым ключом.Возможно, что открытый ключ недействителен.Помимо копирования ключа из консоли администратора, я использовал https://example.com/auth/realms/myrealm/protocol/openid-connect/certs для получения ключа.Затем я преобразовал его в PEM с помощью этого ответа .Ключи совпадают.

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

Для тех, кто хочет попробовать проверить подпись, приведен пример JWT, который я получил, как описановыше:

eyJhbGciOiJFUzUxMiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJwdEVYeWpnbGlwdlp3OGRXSUc1Ml8xNFpONTdnWHNtWUdrdUVJSEplSVJrIn0.eyJqdGkiOiJiNmI1NTI4Ni0zY2NiLTRiNzQtYWFlZC1hOGI2MzBiZjQ5NmEiLCJleHAiOjE1NDUwODM0NjYsIm5iZiI6MCwiaWF0IjoxNTQ1MDgzMTY2LCJpc3MiOiJodHRwczovL2F1dGguaW5tYXQubG9jL2F1dGgvcmVhbG1zL2lubWF0IiwiYXVkIjoiYWNjb3VudCIsInN1YiI6IjViNWQ5NmI1LTBmZjgtNDAyYi05NDAxLTQyYTExODAzMjFlZiIsInR5cCI6IkJlYXJlciIsImF6cCI6ImlubWF0IiwiYXV0aF90aW1lIjowLCJzZXNzaW9uX3N0YXRlIjoiZjAxMmIzOTMtYTY0Ny00ZDhkLTk4MDQtZDQ3MzNkM2Y4MjVjIiwiYWNyIjoiMSIsImFsbG93ZWQtb3JpZ2lucyI6WyIiXSwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbIm9mZmxpbmVfYWNjZXNzIiwidW1hX2F1dGhvcml6YXRpb24iXX0sInJlc291cmNlX2FjY2VzcyI6eyJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJzY29wZSI6ImVtYWlsIHByb2ZpbGUiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwicHJlZmVycmVkX3VzZXJuYW1lIjoidGVzdGVyIiwiZW1haWwiOiJ0ZXN0ZXJAdGVzdC5jb20ifQ.MIGIAkIBzvH1R-9fNFp8jlw-TeFidmC03uNov6IhDc23XMB9eHga8zdF4ybDmxDoAkB-NAJnDRUDNCtw3ooRxNSApje9oCkCQgHkrbYSN3L5LBA1OM5yb9WSQVaxItcspnCtMtW1QogaAYp0v9JwQA7VHL6ofEp3pcXLaKnFzVgP6FvDCwGgIJGFfw

А вот открытый ключ, который я получил, скопировав его из консоли администратора:

MIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBTrJ+u+k3rqKmuvzykwcMfJMVEieQtc1ldlj2Q9vfsWHbNc95xmnsIgcYcsJNVZCY8NnzFBmYSa0G7rNjclS8xGQB4uDs4KV91WaDRmc3DqwDvupvWVw3M1RG64FteoGwq098p6bxog/tgyNWeYzOTpfunXi0Yp4p+ZrMxlaYdSMuDyU=

Поскольку passport-jwt хочет получить его в формате PEM, я ввожу его вбиблиотека выглядит следующим образом:

-----BEGIN PUBLIC KEY-----
MIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBTrJ+u+k3rqKmuvzykwcMfJMVEieQ
tc1ldlj2Q9vfsWHbNc95xmnsIgcYcsJNVZCY8NnzFBmYSa0G7rNjclS8xGQB4uDs
4KV91WaDRmc3DqwDvupvWVw3M1RG64FteoGwq098p6bxog/tgyNWeYzOTpfunXi0
Yp4p+ZrMxlaYdSMuDyU=
-----END PUBLIC KEY-----

Обновление: При использовании RS256 я получаю подпись для проверки.Так что это действительно может быть ошибка Keycloak.

...