Бесконечная загрузка веб-страницы Business Studio и ошибка при входе в KeyCloak
Вопрос:
При попытке входа в веб-интерфейс идет бесконечная загрузка веб-страницы Business Studio. Во вкладке Network браузера (чтобы открыть вкладку Network, нужно на странице веб-интерфейса нажать кнопку F12 и в открывшейся панели DevTools перейти во вкладку Network) циклические ответы со статусом 302.
А также, возникают ошибки при авторизации Keycloak: «We are sorry», либо «somethingWentWrong».
Также проблема может проявляться следующим образом:
- не открывается страница авторизации, вкладка долго показывает «OIDC Form_Post Response» и не загружается;
- после входа страница возвращается на вход или на пустую главную, вход повторяется по кругу;
- появляется сообщение
Message contains error: 'invalid_grant', error_description: 'Code not valid'; - запрос
signin-oidcво вкладке Network выполняется очень долго или завершается ошибкой 504, 502 или 500; - проблема исчезает после очистки cookie.
Какие могут быть причины проблемы и как ее решить?
Ответ:
Возможные причины и способы их устранения:
- Некорректно указан домен Keycloak
Проверьте заданное значение для параметраKEYCLOAK_DOMAINв файле.env(подробнее см. Настройка файла .env)
- Не заполнены обязательные параметры в файле .env
Проверьте, все ли необходимые параметры в файле.envзаполнены (не должно быть значений ***), подробнее см. Настройка файла .env.
- Неправильно настроен OpenID клиент в Keycloak
Проверьте настройки OpenID клиента в Keycloak в соответствии с инструкцией Настройки OpenID клиента.
Внимание! Вкладка OpenID в файле .env настраивается только после того, как вы попадете в веб-интерфейс Keycloak и последовательно дойдете до этого пункта в инструкции по настройке Keycloak (подробнее см. Настройка Keycloak).
- Проблемы с проксированием (nginx)
Чтобы проверить прокси заголовка nginx, нужно использовать команду:curl -vk http://<keycloak-domain>
Если она выводит сертификат, который отдает сервер и его заголовки, то прокси заголовка nginx работает корректно.
Пример корректного вывода команды:
* Trying <ip:port>... * Connected to <domain> (<ip>) <port> (#0) * ALPN: offers h2,http/1.1 ... * TLSv1.3 (OUT), TLS handshake, Client hello (1): * TLSv1.3 (IN), TLS handshake, Server hello (2): * TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8): * TLSv1.3 (IN), TLS handshake, Certificate (11): * TLSv1.3 (IN), TLS handshake, CERT verify (15): * TLSv1.3 (IN), TLS handshake, Finished (20): * SSL connection using TLSv1.3 ... * ALPN: server accepted http/1.1 ... < HTTP/1.1 302 Found < Server: nginx... < Date: ... < Content-Length: 0 < Connection: keep-alive < Location: ... < Referrer-Policy: no-referrer < Strict-Transport-Security: max-age=31536000; includeSubDomains < X-Content-Type-Options: nosniff < X-XSS-Protection: 1; mode=block < Access-Control-Allow-Origin: *
- Ошибка в настройке CSP (редиректов)
Проверьте настройки CSP для Keycloak в соответствии с инструкцией Настройка CSP для Keycloak.
Признак ошибки CSP в консоли браузера (вкладка Console):Framing 'https://<keycloak-domain>/' violates the following Content Security Policy directive: "frame-ancestors 'self'".
- Не завершается запрос signin-oidc
Вероятна, если вход уже работал ранее, а в Network запросsignin-oidcвыполняется очень долго или завершается ошибкой 504/502/500. Порядок диагностики описан ниже, в разделе «Диагностика зависания запроса signin-oidc».
- Устаревшее состояние сессии (после долгого простоя)
Вероятна, если ошибка возникает при возврате на вкладку после долгого бездействия и пропадает после очистки cookie. Подробнее описано ниже, в разделе «Ошибка после долгого простоя».
Диагностика зависания запроса signin-oidc
После входа Keycloak передаёт приложению одноразовый код авторизации на адрес /signin-oidc, и backend должен обменять его на токен, обратившись к Keycloak. Если этот шаг не завершается, страница «крутится», через 60 секунд nginx может вернуть 504, а повторная отправка формы даёт ошибку invalid_grant: Code not valid (код одноразовый и живёт около минуты).
Шаг 1. Проверьте состояние контейнеров (nginx, bs-backend, keycloak):
docker ps -a
Если у какого-то контейнера статус «Restarting» или «Exited», изучите его логи (см. также статью Ошибка «502 Bad Gateway» или «504 Gateway Timeout»).
Шаг 2. Изучите логи nginx и bs-backend за момент ошибки:
sudo docker logs --since 10m <имя контейнера nginx> sudo docker logs --since 10m bs-backend
Признак зависания в логах nginx: upstream timed out (110: Connection timed out). В логах bs-backend ищите ошибки обращения к Keycloak и к базе данных.
Шаг 3. Проверьте доступность Keycloak из контейнера backend:
sudo docker exec -it bs-backend curl -kv https://<keycloak-domain>/realms/<realm>/.well-known/openid-configuration
Команда должна быстро вернуть JSON с настройками. Если запрос зависает или возникает ошибка DNS или сертификата, устраните проблему сети, DNS или сертификата. Если в образе нет curl, выполните проверку с хоста.
Шаг 4. Проверьте события в Keycloak: Events → Login events, типы CODE_TO_TOKEN и CODE_TO_TOKEN_ERROR.
Шаг 5. Проверьте ресурсы сервера:
docker stats --no-stream free -h df -h
Ошибка после долгого простоя
Если ошибка возникает при возврате на вкладку после долгого бездействия и пропадает после очистки cookie, причина в устаревшем состоянии сессии: истекли сессия приложения и сессия Keycloak, и вход запускается заново.
Косвенный признак: в cookie сайта накопилось много записей .AspNetCore.Correlation.* и .AspNetCore.OpenIdConnect.Nonce.* (F12 → Application → Cookies).
Временное решение: удалите cookie сайта Business Studio и откройте страницу заново. Очистка cookie устраняет симптом, но не причину. Если ошибка повторяется регулярно, выполните проверки из раздела «Диагностика зависания запроса signin-oidc».
Если проблему устранить не удалось
Обратитесь в техническую поддержку и приложите:
- логи nginx и bs-backend за момент ошибки;
- события Keycloak (
CODE_TO_TOKEN,CODE_TO_TOKEN_ERROR); - скриншот вкладки Network с запросом
signin-oidc(статус, время выполнения); - скриншот консоли браузера (вкладка Console).