Как стать автором
Обновить

Комментарии 27

его скрипт использует grant_type=password, у меня нет возможности включить этот грант. Также подозреваю что это не сработает так как у нас brokering на другой авторизационный сервер. Но идея понятная. Попробую
У oauth есть password autorization grant. Там никаких редиректов нет, просто REST запрос с логином/паролем клиента и пользователя.
Согласен. Но у нас используется brokering и логин/пароль вводится на странице другого сервиса, который нам не разрешили изменить. Keycloak ничего о паролях не знает. Включение password autorization grant ничего не даст. Я так вижу ситуацию счас.
Вы можете попытаться сэмулировать стандартный authorization code grant.
1 Делаем запрос на ендпоинт authorize
2 Реверсиженирим страницу регистрации и смотрим какие запросы для авторизации делает страница. Скорее всего это будет один или несколько POST запросов. В самом последнем в ответе будет authorization code.

ЗЫ: Вся сложность конечно в эмуляции страницы регистрации. Например, keycloak использует куку и POST запросы с параметром состояния их легко сэмулировать скриптом.
Да, согласен. Выглядит как не такой уж простой путь по затратам. Умышленно пока его избегал. Надеялся что все уже давно порешали -)
Поэтому если мы хотим напрямую проводить тесты через фронтальный rest нам нужен этот токен. Вопрос — как его взять? И так это сделать красиво и правильно? Вот тут я не знаю.

Подождите, а в чем проблема-то вообще? Эти токены получаются по стандартному протоколу, который в клиенте реализуется без особых размышлений.


PS


Сейчас трудно встретить систему в которая бы не была rest и не использовала OAuth.

Но вообще, конечно, очень легко. Вы что, не видели сервисов за api key?

Да Сергей. Именно так мы и видели ситуацию неделю назад.
Если под клиентом понимать js исполняемый в браузере, то, согласен, без проблем. Можете подсказать где в JMeter есть клиент в котором можно реализовать? Тут в качестве клиента используется selenium.
Можете подсказать где в JMeter есть клиент в котором можно реализовать?

А откуда взялось требование про JMeter? Написано "тесты на фронтальный rest". В любом тестовом инструменте, в котором вы можете написать обращение по HTTP, результаты которого использовать потом, вы можете запросить свой токен.


Я, правда, смотрю, вы пишете, вам неподконтролен сервис, который эти токены выдает… ну что же, тогда вы обречены. Но это проблема того, как вы построили тесты.

там написано нагрузочные тесты. но это в данном случае не важно.

Вот именно потому, что вам нужны нагрузочные тесты, сервис авторизации надо просто подменить. Вы же не его тестируете?

Да конечно была такая идея. Пока нереализуема организационно.
Надо обеспечить регулярное нагрузочное тестирование фронтовых рест сервисов.
[...]
А мне вот решение кажется кривым. Ну должен же быть способ обойтись без селениума! Напишите если кто знает. Я не смог ничего нагуглить на тему тестирования OpenID&OAuth2 именно с Authorization Code Grant.

Ваша проблема в том, что у вас задача кривая, потому и решения кривые. Если вам нужно нагрузочное тестирование, вам не нужно тестировать authorization code flow (вы же сервисы тестируете, а не авторизацию?). Соответственно, вы делаете так, чтобы его не было — получая токены любым другим способом.

Узнаю архитектурный подход -))) Задача вполне прямая. Нагрузить систему целиком со всеми компонентами. Системное тестирование, не компонентное. И мудрим мы потому что прямая эмуляция пользовательской нагрузки через браузеры и стоит дохера, и в амазоне арендовать сервера на часок не дают.

Но это неважно. Вижу вы архитектор. Вот вы как бы организовали решение? Ну или задачу выпрямили? Мне бы вот подсказку как любым другим способом токены получить!

зы. Дык Селениум в нагрузочном тестировании счас не участвует. Он известным мне способом получает токены. Стабильно, дешево и надежно. И любые другие способы я вот и ищу.
Задача вполне прямая. Нагрузить систему целиком со всеми компонентами.

Тогда вы должны нагружать систему авторизации ровно так, как она будет использоваться — то есть через браузер.


Вот вы как бы организовали решение? Ну или задачу выпрямили?

Выкинул бы сервер авторизации из тестирования. Или, по крайней мере, минимизировал его участие, заменив auth code flow на более простой — например, на resource owner credentials, если вам нужен пользователь обязательно.

Так Keycloak умеет оффлайн токены, которые один раз получил и используй.

А как? Куда в доку посмотреть? Я не увидел такого в его админке. Если их можно через его API нагенерировать, то можно это легко автоматизировать.

На самом деле есть куда более простой способ. Поскольку как уже выяснили, вы не тестируете авторизацию, гораздо проще самостоятельно генерить нужный токен. У вас должен быть публичный ключ, зашитый в рест приложении. Сгенерируйте новую пару private/public key и публичный ключ подложите в свое приложение, а приватным подписывайте генерируемые токены.

У вас должен быть публичный ключ, зашитый в рест приложении.

С чего бы вдруг? Речь, вроде об OAuth 2/OIDC, там такое совершенно не обязательно. Все зависит от того, что там за токены, и как их валидируют.

Если вы имеете в виду JWS (JWT без части signature), т.е. иначе говоря просто набор каких-то клэймов, то я думаю у автора и не возникло бы проблем с генерацией такого токена, достаточно взять любую библиотеку. Если signature есть но на бэкенде не проверяется подпись токена, а просто считываются клэймы — аналогично. Насколько мне известно, это довольно редкие случаи, т.к. в основном jwt используется именно в виде 3 компонентов, включая подпись, которую как раз и расшифровывают с помощью публичного ключа. Поправьте, если ошибся.

Я имею в виду, что авторизационный токен (в OAuth 2) вообще не обязан быть JWT, это может быть reference token, который проверяется через валидационный эндпойнт. А может быть JWT, но все равно проверяться через валидационный эндпойнт.


Но даже если там JWT, который используется как self-contained, то есть валидируется подпись и клеймы, то публичный ключ в приложение (обычно) не зашиваются, потому что это резко усложняет его отзыв при компроментации. Публичные ключи обычно лежат в общедоступном месте OP, откуда периодически и забираются; логика, по которой определяется доверенный OP, может быть разной. Если автор поста, по его словам, не может подменить авторизационный сервис, то ожидать, что он сможет подменить публикуемые этим сервисом ключи, я бы не стал.

В целом соглашусь с вашей точкой зрения, кроме того что «обычно лежат в общедоступном месте». Лично я чаще видел другую практику, когда публичный ключ для проверки подписи токена либо лежит где-нибудь в aws secret manager (или аналогичных сервисах), либо шьётся как например переменная окружения.
кроме того что «обычно лежат в общедоступном месте»

OpenID Provider Metadata, значение jwks_uri: "REQUIRED. URL of the OP's JSON Web Key Set [JWK] document. This contains the signing key(s) the RP uses to validate signatures from the OP." Что характерно, Google, Microsoft (Azure AD), Okta, OneLogin, IdentityServer и даже, если я не ошибаюсь, используемый автором поста Keycloak — все это поддерживают и выставляют.


Лично я чаще видел другую практику, когда публичный ключ для проверки подписи токена либо лежит где-нибудь в aws secret manager (или аналогичных сервисах), либо шьётся как например переменная окружения.

Непонятно, какой с этого профит. А если авторизационный сервис еще и не ваш, то будет постоянная проблема поддерживать эти настройки актуальными.

А в чем проблема получить токен с помощью постпроцессора JMeter? "Открываем" нужную страницу, ищем на ней токен, записываем в переменную и используем ее там, где необходимо. Может быть я не понял задачу, но я всегда делаю именно так

I can not just open a page because there is js that should be executed.
By the way, overall, we decided to use selenium pretest step to collect all needed tokens.
Because it works very well and could be easily maintenance of juniors.
Я понимаю ваше сарказм. Но мне приходилось работать с самыми разными типами авторизации, получением токенов и т.д. Выполненный JS в любом случае что-то куда-то отсылает и получает в ответ токен. Да, не всегда это получается прямо и без бубна, но получается всегда. Даже если нет готового решения всегда можно его написать. Благо JMeter поддреживает java, js и groovy (я не говорю о написании своего плагина — трудозатраты возможно не будут сопоставимы с выгодой). Кроме того, если без браузера никак — можно запускать его прямо из сценария JMeter, получать токен и снова выключать — это будет меньшим костылем, но все-таки костылем
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории