Лучший подход к использованию веб-сокетов Spring (sockJS + Stomp) с аутентификацией на основе токенов (JWT)

Я хочу использовать веб-сокеты ( sockJS с Stomp) в загрузочном приложении Spring с аутентификацией на основе токенов с помощью Json Web Token (JWT). На сервере есть фильтр, который проверяет токен JWT. Этот токен отправляет заголовки запроса, но API- интерфейс клиента SockJS не поддерживает заголовки. Это означает, что когда API-интерфейс клиента SockJS пытается выполнить рукопожатие websocket с сервером, как, например:

new SockJS("http://localhost:8080/websocket")

HTTP-запрос будет перехвачен фильтром авторизации JWT, и рукопожатие не будет выполнено, так как в запросе нет заголовков, и, следовательно, запрос будет отклонен фильтром. Я видел несколько обходных путей, предложенных на форумах, но ни один из них не подходит для этого сценария:

  • HandshakeInterceptor: это решение не работает, потому что фильтры всегда выполняются перед перехватчиками.
  • Отправка заголовка аутентификации на заголовки STOMP также не работает, потому что STOMP-соединение происходит после рукопожатия, естественно.

Я обнаружил, что можно отправить токен по URL-адресу рукопожатия SockJS через параметры запроса, и мне придется изменить фильтр аутентификации, чтобы также искать параметры запроса, а не только заголовки. Мне не очень нравится это решение для отправки токена по параметрам запроса из соображений безопасности. Есть ли лучшая альтернатива или это действительно лучший подход?

0 ответов

HandshakeInterceptor: это решение не работает, потому что фильтры всегда выполняются перед перехватчиками.

Это то, что я сделал с точно такой же настройкой, что и у вас.

Вам нужно добавить websocket endpoint в

@Override public void configure(WebSecurity registry)

лайк

registry.ignoring().antMatchers("/websocket/**");

Это сообщит Spring Security о том, что не нужно запускать конечные точки сокетов и, следовательно, фильтр, который вы настроили для jwt,

Другие вопросы по тегам