Я возился с Apache Superset, инструментом с открытым исходным кодом, написанным для Flask и Flask App Builder. Я хочу использовать KeyCloak для аутентификации, но так как он работает только с OpenID Connect, а flask_login - только с OpenID 2, мне нужно немного расширить менеджер безопасности. Это нормально, не так уж сложно. Да, я могу использовать OAuth 2, но пока отказался от него.
Проблема, с которой я сталкиваюсь, заключается в том, что я хотел бы выйти из приложения фляги, когда я выхожу из KeyCloak. Что-то вроде реализации Microsoft OpenID Connect для AD имеет возможность вызывать конечную точку выхода из системы всех клиентских приложений, связанных с ней, но KeyCloak не имеет этой функциональности, насколько я могу судить, читая документы и щелкая в консоли администратора.
Мое решение на данный момент состоит в том, чтобы установить короткий срок действия файла cookie id_token OIDC; затем, когда срок действия файла cookie истечет, вернитесь к KeyCloak и, если пользователь все еще вошел в систему, обновите, в противном случае, выход из приложения фляги. Я проверяю cookie с помощью метода user_loggedin. Затем я могу либо перенаправить на сервер входа в KeyCloak, если срок действия файла cookie истек. Затем сеанс KeyCloak либо подтвердит, что пользователь все еще вошел в систему, и перенаправит обратно на запрошенную страницу, либо потребует входа в систему. Или я могу просто запросить новый токен у KeyCloak вручную и сбросить cookie. Если пользователь все еще вошел в систему, KeyCloak ответит новым токеном, если нет, пользователь выйдет из системы.
Проблема в том, что после нескольких дней крови, пота и растущей ненависти я не могу заставить его работать.
Я пытаюсь выполнить проверку методом before_request
. Я не хочу изменять какой-либо существующий код в проекте надмножества, поэтому все, что я делаю, должно происходить в моем собственном менеджере безопасности. Если я пытаюсь перенаправить из метода before_request
, я получаю сообщение об ошибке, в котором говорится, что «объект ответа не повторяется»
Я не знаю, является ли метод before_request
лучшим местом для этого, но я не знаю, где еще?
Что еще более усложняет задачу, так это то, что некоторые страницы потенциально могут быть доступны анонимным пользователям, поэтому декоратор @login_required
нельзя просто поместить где-нибудь перед методом. Все это должно происходить только в том случае, если cookie был установлен ранее, а срок его действия истек. Я устанавливаю переменную в сеансе, чтобы указать, что пользователь действительно вошел в систему, поэтому, когда я проверяю файл cookie id_token OIDC, я также проверяю, существует ли ранее зарегистрированный ключ сеанса.