Доброго дня!
Обнаружен баг во время аутентификации в приложение: при попытке получения access_token сервер отвечает ошибкой 500. Проявляется не сразу, далее опишу, как именно; но, по итогу, всё это приводит к невозможности использовать аутентификацию по rest-api.
- Создаем чистый проект jmix и добавляем к нему аддон REST-api.
- Разворачиваем и пробуем получить token для admin/admin, выполняем стандартную команду curl:
curl -H "Content-type: application/x-www-form-urlencoded" -u client:secret -d "grant_type=password&username=admin&password=admin" http://localhost:8080/oauth/token
- Токен успешно получен:
{"access_token":"57g2U4XnXtLuR9gx3ds9hTbR0pU","token_type":"bearer","refresh_token":"ym0kuw3J07k1G-Jk1aLv9ElImdk","expires_in":43199,"scope":"api","OAuth2.SESSION_ID":"FC8CBDCBF042E059D988381933235FB9"}
-
Теперь авторизуемся также под admin/admin в приложение через ui. А далее самое главное: необходимо каким-то образом изменить тему для текущего юзера (неважно как, важно, чтобы появились об этом записи в таблице ui_Setting), например так:
-
Попробовать снова получить access_token для admin/admin той же командой curl. Теперь сервер отвечает так:
{"error":"server_error","error_description":"Internal Server Error"}
- В логах:
java.lang.NullPointerException: null
То есть, как только пользователь изменил себе настройки темы (в БД появились записи об этом), токен получить уже невозможно.
Детальный дебаг показал, что проблема кроется в бине io.jmix.ui.theme.ThemeSuccessfulAuthenticationListener, а ошибка возникает здесь:
Page.getCurrent().reload();
Почему для REST-api вызывается listener, который, судя по смыслу и названию перегружает страницу у только что аутентифицированного пользователя, вытаскивая из cookie настройки темы (обращаясь далее в таблицу ui_Setting в бд)? Ну и, очевидно, что токен для пользователя на текущий момент можно получить только при отсутствии записей themeMode и themeSize и бд у этого пользователя, что не может являться решением проблемы…
Похожая (возможно) проблема, но только для CUBA, была описана в этом посте: ошибка 401 при Rest-аутентификации, правда там была ошибка 401, но проблема решилась подстановкой cookie прямо в header’ы, что, по сути, могло бы помочь и мне. Очень похоже на эту же проблему. Сам CUBA не проверял, возможно такой баг присутствует и там.